Egendefinerte autorisasjonskrav
Bygg egendefinerte krav og behandlere.
Egendefinerte autorisasjonskrav er en gratis leksjon i C# Academy på CoddyKit. Dette er leksjon 4 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i C# Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i C# Academy inneholder totalt 4 leksjoner.
Når innebygde funksjoner ikke er nok
Noen regler kan ikke uttrykkes med RequireRole eller RequireClaim – for eksempel «må være minst 18 år» eller «må eie denne ressursen».
For slike regler skriver De et egendefinert krav og en tilhørende handler.
// Rule: user must be older than a configurable minimum ageIAuthorizationRequirement
Et krav er en markør som inneholder regelens data. Det implementerer det tomme grensesnittet IAuthorizationRequirement.
public class MinimumAgeRequirement : IAuthorizationRequirement
{
public int MinimumAge { get; }
public MinimumAgeRequirement(int minimumAge) =>
MinimumAge = minimumAge;
}AuthorizationHandler
En handler inneholder logikken. Deriver fra AuthorizationHandler<TRequirement> og overstyr HandleRequirementAsync.
public class MinimumAgeHandler
: AuthorizationHandler<MinimumAgeRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
MinimumAgeRequirement requirement)
{
// logic goes here
return Task.CompletedTask;
}
}Godkjenne kravet
Inne i handleren undersøker De brukerens claims. Hvis regelen er oppfylt, kaller De context.Succeed(requirement). Hvis ikke, returnerer De ganske enkelt uten å kalle 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;Godkjenn, ikke avslå
Foretrekk å kalle Succeed når kravet er oppfylt, og ikke gjøre noe ellers. Kall bare context.Fail() når De vil garantere at kontrollen mislykkes, uavhengig av andre handlere for det samme kravet.
// Soft: let other handlers also try
if (ok) context.Succeed(requirement);
// Hard: force failure no matter what
if (blocked) context.Fail();Registrere handleren
Registrer handlere i DI som IAuthorizationHandler. De er vanligvis singletons, med mindre de avhenger av tjenester med scoped-livssyklus.
builder.Services.AddSingleton<
IAuthorizationHandler, MinimumAgeHandler>();Knytte til en policy
Legg kravet til en navngitt policy med AddRequirements (eller Requirements.Add). Handleren matches automatisk etter type.
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast18", policy =>
policy.AddRequirements(new MinimumAgeRequirement(18)));
});Bruke policyen
Bruk den på samme måte som alle andre navngitte policyer.
[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();Ressursbasert autorisasjon
Hvis De vil autorisere mot en bestemt instans (for eksempel «bare dokumenteieren kan redigere»), bruker De ressurs-overbelastningen. Ressourcen sendes inn i handlerkonteksten.
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;
}
}Kalle IAuthorizationService
Ressursbaserte kontroller kjøres imperativt inne i en handling via den injiserte 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 per krav
Et krav kan ha flere handlere; hvis en hvilken som helst handler lykkes, er kravet oppfylt. Dette modellerer ELLER-betingelser på en ryddig måte (med mindre en handler kaller Fail).
// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();Kunnskapssjekk
Test forståelsen Deres av handlere.
Oppsummering
De har bygget egendefinert autorisasjon:
- En
IAuthorizationRequirementinneholder regelens data. - En
AuthorizationHandler<T>inneholder logikken og kallerSucceed. - Registrer handleren som
IAuthorizationHandlerog knytt kravet til en policy. - Ressursbaserte handlere og
IAuthorizationServiceautoriserer bestemte instanser.
Dermed er autorisasjonskurset fullført.
Lær deg C# med en AI-veileder – gratis
Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.
- Kurs
- 93
- Leksjoner
- 346
Ofte stilte spørsmål
Er leksjonen «Egendefinerte autorisasjonskrav» gratis?
Ja – hele teksten i «Egendefinerte autorisasjonskrav» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av C# Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i C# Academy inneholder totalt 4 leksjoner.
Hva lærer jeg i «Egendefinerte autorisasjonskrav»?
Bygg egendefinerte krav og behandlere. Du øver på C# Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.
Trenger jeg erfaring for å begynne med C# Academy?
Ingen tidligere erfaring er nødvendig. C# Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 4 av 4.
Hvor lang tid tar leksjonen «Egendefinerte autorisasjonskrav»?
De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.
Kan jeg skrive og kjøre kode i denne C# Academy-leksjonen?
Ja. Alle C# Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.
Alle leksjonene i dette kurset
- Rollebasert autorisasjon
- Claims-basert autorisasjon
- Policybasert autorisasjon
- Egendefinerte autorisasjonskrav