0Pricing
C# Academy · Aula

Requisitos personalizados de autorização

Crie requisitos e manipuladores personalizados.

Requisitos personalizados de autorização é uma aula grátis de C# Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de C# Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de C# Academy inclui 4 aulas no total.

Quando os recursos integrados não são suficientes

Algumas regras não podem ser expressas com RequireRole ou RequireClaim — por exemplo, "deve ter pelo menos 18 anos" ou "deve ser proprietário deste recurso".

Para esses casos, você escreve um requisito e um manipulador personalizados.

// Rule: user must be older than a configurable minimum age

IAuthorizationRequirement

Um requisito é um marcador que contém os dados da regra. Ele implementa a interface vazia IAuthorizationRequirement.

public class MinimumAgeRequirement : IAuthorizationRequirement
{
    public int MinimumAge { get; }
    public MinimumAgeRequirement(int minimumAge) =>
        MinimumAge = minimumAge;
}

AuthorizationHandler

Um manipulador contém a lógica. Derive de AuthorizationHandler<TRequirement> e substitua HandleRequirementAsync.

public class MinimumAgeHandler
    : AuthorizationHandler<MinimumAgeRequirement>
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        MinimumAgeRequirement requirement)
    {
        // logic goes here
        return Task.CompletedTask;
    }
}

Satisfazendo o requisito

Dentro do manipulador, inspecione as declarações do usuário. Se a regra for satisfeita, chame context.Succeed(requirement). Caso contrário, simplesmente retorne sem chamá-lo.

var dobClaim = context.User.FindFirst("birthdate");
if (dobClaim is null) return Task.CompletedTask;

var dob = DateTime.Parse(dobClaim.Value);
int age = DateTime.UtcNow.Year - dob.Year;
if (dob > DateTime.UtcNow.AddYears(-age)) age--;

if (age >= requirement.MinimumAge)
    context.Succeed(requirement);

return Task.CompletedTask;

Use Succeed, não Fail

Prefira chamar Succeed quando o requisito for satisfeito e não fazer nada caso contrário. Só chame context.Fail() quando quiser garantir a falha, independentemente dos outros manipuladores do mesmo requisito.

// Soft: let other handlers also try
if (ok) context.Succeed(requirement);

// Hard: force failure no matter what
if (blocked) context.Fail();

Registrando o manipulador

Registre os manipuladores na DI como IAuthorizationHandler. Eles geralmente são instâncias únicas, a menos que dependam de serviços com escopo.

builder.Services.AddSingleton<
    IAuthorizationHandler, MinimumAgeHandler>();

Vinculando a uma política

Adicione o requisito a uma política nomeada usando AddRequirements (ou Requirements.Add). O manipulador é associado automaticamente pelo tipo.

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AtLeast18", policy =>
        policy.AddRequirements(new MinimumAgeRequirement(18)));
});

Usando a política

Aplique-a como qualquer outra política nomeada.

[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();

Autorização baseada em recursos

Para autorizar com base em uma instância específica (por exemplo, "somente o proprietário do documento pode editar"), use a sobrecarga que recebe o recurso. O recurso é passado para o contexto do manipulador.

public class OwnerHandler
    : AuthorizationHandler<OwnerRequirement, Document>
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        OwnerRequirement requirement,
        Document resource)
    {
        var userId = context.User.FindFirstValue(
            ClaimTypes.NameIdentifier);
        if (resource.OwnerId.ToString() == userId)
            context.Succeed(requirement);
        return Task.CompletedTask;
    }
}

Chamando IAuthorizationService

As verificações baseadas em recursos são executadas imperativamente dentro de uma ação por meio do IAuthorizationService injetado.

public async Task<IActionResult> Edit(int id)
{
    var doc = await _db.Documents.FindAsync(id);
    var result = await _authz.AuthorizeAsync(
        User, doc, "DocumentOwner");
    if (!result.Succeeded) return Forbid();
    return Ok(doc);
}

Vários manipuladores por requisito

Um requisito pode ter vários manipuladores; se qualquer manipulador for bem-sucedido, o requisito será satisfeito. Isso modela condições OR de forma clara (a menos que um manipulador chame Fail).

// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();

Verificação rápida

Teste seu entendimento sobre os manipuladores.

Recapitulação

Você criou uma autorização personalizada:

  • Um IAuthorizationRequirement contém os dados da regra.
  • Um AuthorizationHandler<T> contém a lógica e chama Succeed.
  • Registre o manipulador como IAuthorizationHandler e vincule o requisito a uma política.
  • Manipuladores baseados em recursos e IAuthorizationService autorizam instâncias específicas.

Com isso, o curso de autorização está concluído.

Perguntas Frequentes

A aula “Requisitos personalizados de autorização” é grátis?

Sim — o texto completo de “Requisitos personalizados de autorização” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de C# Academy, atualize para CoddyKit PRO. O curso de C# Academy inclui 4 aulas no total.

O que vou aprender em “Requisitos personalizados de autorização”?

Crie requisitos e manipuladores personalizados. Você pratica C# Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar C# Academy?

Nenhuma experiência prévia é necessária. C# Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Requisitos personalizados de autorização”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de C# Academy?

Sim. Cada aula de C# Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Autorização baseada em funções
  2. Autorização baseada em declarações
  3. Autorização baseada em políticas
  4. Requisitos personalizados de autorização
← Voltar para C# Academy