C# Academy · leksjon

Egendefinerte autorisasjonskrav

Bygg egendefinerte krav og behandlere.

Leksjon 4 av 413 trinn

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 age

IAuthorizationRequirement

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 IAuthorizationRequirement inneholder regelens data.
  • En AuthorizationHandler<T> inneholder logikken og kaller Succeed.
  • Registrer handleren som IAuthorizationHandler og knytt kravet til en policy.
  • Ressursbaserte handlere og IAuthorizationService autoriserer bestemte instanser.

Dermed er autorisasjonskurset fullført.

Gratis å komme i gang

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

  1. Rollebasert autorisasjon
  2. Claims-basert autorisasjon
  3. Policybasert autorisasjon
  4. Egendefinerte autorisasjonskrav
← Tilbake til C# Academy