0Pricing
C# Academy · Lección

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 age

IAuthorizationRequirement

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 IAuthorizationRequirement contiene los datos de la regla.
  • Un AuthorizationHandler<T> contiene la lógica y llama a Succeed.
  • Registre el controlador como IAuthorizationHandler y asocie el requisito a una política.
  • Los controladores basados en recursos y IAuthorizationService autorizan 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

  1. Autorización basada en roles
  2. Autorización basada en claims
  3. Autorización basada en políticas
  4. Requisitos de autorización personalizados
← Volver a C# Academy