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 ageIAuthorizationRequirement
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
IAuthorizationRequirementcontiene i dati della regola. - Un
AuthorizationHandler<T>contiene la logica e chiamaSucceed. - Registri l'handler come
IAuthorizationHandlere associ il requisito a una policy. - Gli handler basati sulle risorse e
IAuthorizationServiceautorizzano 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
- Autorizzazione basata sui ruoli
- Autorizzazione basata sui claim
- Autorizzazione basata sulle policy
- Requisiti di autorizzazione personalizzati