Brugerdefinerede autorisationskrav
Opbyg brugerdefinerede krav og handlers.
Brugerdefinerede autorisationskrav er en gratis C# Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i C# Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. C# Academy-kurset indeholder 4 lektioner i alt.
Når de indbyggede funktioner ikke er nok
Nogle regler kan ikke udtrykkes med RequireRole eller RequireClaim – for eksempel "skal være mindst 18 år" eller "skal eje denne ressource".
I disse tilfælde skriver du et brugerdefineret krav plus en handler.
// Rule: user must be older than a configurable minimum ageIAuthorizationRequirement
Et krav er en markør, der indeholder reglens data. Det implementerer den tomme IAuthorizationRequirement-grænseflade.
public class MinimumAgeRequirement : IAuthorizationRequirement
{
public int MinimumAge { get; }
public MinimumAgeRequirement(int minimumAge) =>
MinimumAge = minimumAge;
}AuthorizationHandler
En handler indeholder logikken. Nedstam fra AuthorizationHandler<TRequirement>, og tilsidesæt HandleRequirementAsync.
public class MinimumAgeHandler
: AuthorizationHandler<MinimumAgeRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
MinimumAgeRequirement requirement)
{
// logic goes here
return Task.CompletedTask;
}
}Opfyldelse af kravet
Undersøg brugerens claims inde i handleren. Hvis reglen er opfyldt, skal du kalde context.Succeed(requirement). Hvis ikke skal du blot returnere uden at kalde den.
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;Kald Succeed, ikke Fail
Foretræk at kalde Succeed, når kravet er opfyldt, og ellers ikke gøre noget. Kald kun context.Fail(), når du vil garantere, at kravet mislykkes uanset andre handlere for det samme krav.
// Soft: let other handlers also try
if (ok) context.Succeed(requirement);
// Hard: force failure no matter what
if (blocked) context.Fail();Registrering af handleren
Registrér handlere i DI som IAuthorizationHandler. De er normalt singletoner, medmindre de afhænger af tjenester med begrænset levetid.
builder.Services.AddSingleton<
IAuthorizationHandler, MinimumAgeHandler>();Tilknytning til en policy
Føj kravet til en navngiven policy med AddRequirements (eller Requirements.Add). Handleren matches automatisk efter type.
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast18", policy =>
policy.AddRequirements(new MinimumAgeRequirement(18)));
});Brug af policyen
Anvend den som enhver anden navngiven policy.
[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();Ressourcebaseret autorisation
Hvis du vil autorisere i forhold til en specifik instans (f.eks. "kun dokumentets ejer må redigere"), skal du bruge ressourceoverloaden. Ressourcen sendes med i handlerens kontekst.
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;
}
}Kald af IAuthorizationService
Ressourcebaserede kontroller køres imperativt inde i en handling via den injicerede IAuthorizationService.
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);
}Flere handlere pr. krav
Et krav kan have flere handlere; hvis en hvilken som helst handler lykkes, er kravet opfyldt. Det modellerer ELLER-betingelser enkelt (medmindre en handler kalder Fail).
// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();Hurtig kontrol
Test, om du har forstået handlere.
Opsamling
Du har opbygget brugerdefineret autorisation:
- En
IAuthorizationRequirementindeholder reglens data. - En
AuthorizationHandler<T>indeholder logikken og kalderSucceed. - Registrér handleren som
IAuthorizationHandler, og tilknyt kravet til en policy. - Ressourcebaserede handlere og
IAuthorizationServiceautoriserer specifikke instanser.
Det afslutter autorisationskurset.
Lær C# med en AI-underviser — gratis
Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.
- Kurser
- 93
- Lektioner
- 346
Ofte stillede spørgsmål
Er lektionen “Brugerdefinerede autorisationskrav” gratis?
Ja — hele teksten til “Brugerdefinerede autorisationskrav” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af C# Academy-kurset, skal du opgradere til CoddyKit PRO. C# Academy-kurset indeholder 4 lektioner i alt.
Hvad lærer jeg i “Brugerdefinerede autorisationskrav”?
Opbyg brugerdefinerede krav og handlers. Du øver dig i C# Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.
Skal jeg have erfaring for at begynde på C# Academy?
Der kræves ingen tidligere erfaring. C# Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.
Hvor lang tid tager lektionen “Brugerdefinerede autorisationskrav”?
De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.
Kan jeg skrive og køre kode i denne C# Academy-lektion?
Ja. Alle C# Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.
Alle lektioner i dette kursus
- Rolleb provisioneret autorisation
- Claim-baseret autorisation
- Policy-baseret autorisation
- Brugerdefinerede autorisationskrav