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 ageIAuthorizationRequirement
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
IAuthorizationRequirementcontém os dados da regra. - Um
AuthorizationHandler<T>contém a lógica e chamaSucceed. - Registre o manipulador como
IAuthorizationHandlere vincule o requisito a uma política. - Manipuladores baseados em recursos e
IAuthorizationServiceautorizam 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
- Autorização baseada em funções
- Autorização baseada em declarações
- Autorização baseada em políticas
- Requisitos personalizados de autorização