C# Academy · Lektion

Brugerdefinerede autorisationskrav

Opbyg brugerdefinerede krav og handlers.

Lektion 4 af 413 trin

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 age

IAuthorizationRequirement

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 IAuthorizationRequirement indeholder reglens data.
  • En AuthorizationHandler<T> indeholder logikken og kalder Succeed.
  • Registrér handleren som IAuthorizationHandler, og tilknyt kravet til en policy.
  • Ressourcebaserede handlere og IAuthorizationService autoriserer specifikke instanser.

Det afslutter autorisationskurset.

Gratis at komme i gang

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

  1. Rolleb provisioneret autorisation
  2. Claim-baseret autorisation
  3. Policy-baseret autorisation
  4. Brugerdefinerede autorisationskrav
← Tilbage til C# Academy