Requisitos de autorización personalizados
Cree requisitos y handlers personalizados.
Requisitos de autorización personalizados es una lección gratuita de C# Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de C# Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de C# Academy incluye 4 lecciones en total.
Cuando los requisitos integrados no bastan
Algunas reglas no se pueden expresar con RequireRole o RequireClaim, por ejemplo, «debe tener al menos 18 años» o «debe ser el propietario de este recurso».
Para estos casos, debe escribir un requisito y un controlador personalizados.
// Rule: user must be older than a configurable minimum ageIAuthorizationRequirement
Un requisito es un marcador que contiene los datos de la regla. Implementa la interfaz vacía IAuthorizationRequirement.
public class MinimumAgeRequirement : IAuthorizationRequirement
{
public int MinimumAge { get; }
public MinimumAgeRequirement(int minimumAge) =>
MinimumAge = minimumAge;
}AuthorizationHandler
Un controlador contiene la lógica. Derive de AuthorizationHandler<TRequirement> y reemplace HandleRequirementAsync.
public class MinimumAgeHandler
: AuthorizationHandler<MinimumAgeRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
MinimumAgeRequirement requirement)
{
// logic goes here
return Task.CompletedTask;
}
}Cumplir el requisito
Dentro del controlador, inspeccione los claims del usuario. Si se cumple la regla, llame a context.Succeed(requirement). Si no, simplemente devuelva el control sin llamarlo.
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;Cumplir, no fallar
Es preferible llamar a Succeed cuando se cumple el requisito y no hacer nada en caso contrario. Llame a context.Fail() únicamente cuando quiera garantizar el fallo independientemente de los demás controladores del mismo requisito.
// Soft: let other handlers also try
if (ok) context.Succeed(requirement);
// Hard: force failure no matter what
if (blocked) context.Fail();Registrar el controlador
Registre los controladores en DI como IAuthorizationHandler. Normalmente son singletons, salvo que dependan de servicios con ámbito.
builder.Services.AddSingleton<
IAuthorizationHandler, MinimumAgeHandler>();Asociarlo a una política
Añada el requisito a una política con nombre mediante AddRequirements (o Requirements.Add). El controlador se asocia automáticamente por tipo.
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast18", policy =>
policy.AddRequirements(new MinimumAgeRequirement(18)));
});Usar la política
Aplíquela como cualquier otra política con nombre.
[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();Autorización basada en recursos
Para autorizar respecto a una instancia específica (por ejemplo, «solo el propietario del documento puede editarlo»), use la sobrecarga que acepta el recurso. El recurso se pasa al contexto del controlador.
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;
}
}Llamar a IAuthorizationService
Las comprobaciones basadas en recursos se ejecutan de forma imperativa dentro de una acción mediante el IAuthorizationService inyectado.
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);
}Varios controladores por requisito
Un requisito puede tener varios controladores; si cualquiera de ellos lo cumple, el requisito se satisface. Esto permite modelar claramente las condiciones OR (salvo que un controlador llame a Fail).
// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();Comprobación rápida
Compruebe que entiende los controladores.
Resumen
Ha creado una autorización personalizada:
- Un
IAuthorizationRequirementcontiene los datos de la regla. - Un
AuthorizationHandler<T>contiene la lógica y llama aSucceed. - Registre el controlador como
IAuthorizationHandlery asocie el requisito a una política. - Los controladores basados en recursos y
IAuthorizationServiceautorizan instancias específicas.
Con esto termina el curso de autorización.
Preguntas frecuentes
¿La lección «Requisitos de autorización personalizados» es gratis?
Sí — el texto completo de «Requisitos de autorización personalizados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de C# Academy, actualiza a CoddyKit PRO. El curso de C# Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Requisitos de autorización personalizados»?
Cree requisitos y handlers personalizados. Practicas C# Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar C# Academy?
No se requiere experiencia previa. C# Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Requisitos de autorización personalizados»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de C# Academy?
Sí. Cada lección de C# Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Autorización basada en roles
- Autorización basada en claims
- Autorización basada en políticas
- Requisitos de autorización personalizados