0Pricing
C# Academy · Lezione

Requisiti di autorizzazione personalizzati

Crei requisiti e gestori personalizzati.

Requisiti di autorizzazione personalizzati è una lezione C# Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C# Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C# Academy include 4 lezioni in totale.

Quando i requisiti integrati non sono sufficienti

Alcune regole non possono essere espresse con RequireRole o RequireClaim, ad esempio "deve avere almeno 18 anni" oppure "deve essere il proprietario di questa risorsa".

In questi casi deve scrivere un requisito e un relativo handler personalizzati.

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

IAuthorizationRequirement

Un requisito è un elemento descrittivo che contiene i dati della regola. Implementa l'interfaccia vuota IAuthorizationRequirement.

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

AuthorizationHandler

Un handler contiene la logica. Derivi da AuthorizationHandler<TRequirement> ed esegua l'override di HandleRequirementAsync.

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

Soddisfare il requisito

All'interno dell'handler, esamini i claim dell'utente. Se la regola è soddisfatta, chiami context.Succeed(requirement). In caso contrario, restituisca semplicemente il controllo senza chiamarlo.

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;

Soddisfare, non negare

È preferibile chiamare Succeed quando il requisito è soddisfatto e non fare nulla negli altri casi. Chiami context.Fail() solo quando desidera garantire l'esito negativo indipendentemente dagli altri handler per lo stesso requisito.

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

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

Registrare l'handler

Registri gli handler nella DI come IAuthorizationHandler. Di solito sono singleton, a meno che non dipendano da servizi con durata scoped.

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

Associare il requisito a una policy

Aggiunga il requisito a una policy denominata utilizzando AddRequirements (oppure Requirements.Add). L'handler viene associato automaticamente in base al tipo.

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

Utilizzare la policy

La applichi come qualsiasi altra policy denominata.

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

Autorizzazione basata sulle risorse

Per autorizzare l'accesso a una specifica istanza (ad esempio, "solo il proprietario del documento può modificarlo"), utilizzi l'overload che accetta una risorsa. La risorsa viene passata al contesto dell'handler.

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;
    }
}

Chiamare IAuthorizationService

Le verifiche basate sulle risorse vengono eseguite imperativamente all'interno di un'azione tramite IAuthorizationService, inserito tramite dependency injection.

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);
}

Più handler per un requisito

Un requisito può avere diversi handler; se ha esito positivo anche uno solo di essi, il requisito è soddisfatto. In questo modo le condizioni OR vengono modellate in modo chiaro (a meno che un handler non chiami Fail).

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

Verifica rapida

Verifichi la Sua comprensione degli handler.

Riepilogo

Ha creato un'autorizzazione personalizzata:

  • Un IAuthorizationRequirement contiene i dati della regola.
  • Un AuthorizationHandler<T> contiene la logica e chiama Succeed.
  • Registri l'handler come IAuthorizationHandler e associ il requisito a una policy.
  • Gli handler basati sulle risorse e IAuthorizationService autorizzano l'accesso a istanze specifiche.

Con questo si conclude il corso sull'autorizzazione.

Domande Frequenti

La lezione «Requisiti di autorizzazione personalizzati» è gratuita?

Sì — il testo completo di «Requisiti di autorizzazione personalizzati» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C# Academy, passa a CoddyKit PRO. Il corso C# Academy include 4 lezioni in totale.

Cosa imparerò in «Requisiti di autorizzazione personalizzati»?

Crei requisiti e gestori personalizzati. Eserciti C# Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C# Academy?

Non è richiesta alcuna esperienza precedente. C# Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Requisiti di autorizzazione personalizzati»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C# Academy?

Sì. Ogni lezione C# Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Autorizzazione basata sui ruoli
  2. Autorizzazione basata sui claim
  3. Autorizzazione basata sulle policy
  4. Requisiti di autorizzazione personalizzati
← Torna a C# Academy