C# Academy · Lektion

Egna auktoriseringskrav

Bygg egna krav och hanterare.

Lektion 4 av 413 steg

Egna auktoriseringskrav är en gratis lektion i C# Academy på CoddyKit. Detta är lektion 4 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för C# Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i C# Academy innehåller totalt 4 lektioner.

När inbyggda funktioner inte räcker

Vissa regler kan inte uttryckas med RequireRole eller RequireClaim – till exempel ”måste vara minst 18” eller ”måste äga den här resursen”.

För sådana regler skriver du ett anpassat krav och en handler.

// Rule: user must be older than a configurable minimum age

IAuthorizationRequirement

Ett krav är en markör som innehåller regelns data. Det implementerar det tomma gränssnittet IAuthorizationRequirement.

public class MinimumAgeRequirement : IAuthorizationRequirement
{
    public int MinimumAge { get; }
    public MinimumAgeRequirement(int minimumAge) =>
        MinimumAge = minimumAge;
}

AuthorizationHandler

En handler innehåller logiken. Utgå från AuthorizationHandler<TRequirement> och åsidosätt HandleRequirementAsync.

public class MinimumAgeHandler
    : AuthorizationHandler<MinimumAgeRequirement>
{
    protected override Task HandleRequirementAsync(
        AuthorizationHandlerContext context,
        MinimumAgeRequirement requirement)
    {
        // logic goes here
        return Task.CompletedTask;
    }
}

Markera kravet som uppfyllt

Inspektera användarens claims inuti handlern. Om regeln är uppfylld anropar du context.Succeed(requirement). Om den inte är det returnerar du helt enkelt utan att anropa metoden.

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;

Succeed, inte Fail

Föredra att anropa Succeed när kravet är uppfyllt och inte göra något annars. Anropa endast context.Fail() när du vill garantera att det misslyckas oavsett andra handlers för samma krav.

// Soft: let other handlers also try
if (ok) context.Succeed(requirement);

// Hard: force failure no matter what
if (blocked) context.Fail();

Registrera handlern

Registrera handlers i DI som IAuthorizationHandler. De är vanligtvis singletons om de inte är beroende av scoped-tjänster.

builder.Services.AddSingleton<
    IAuthorizationHandler, MinimumAgeHandler>();

Koppla till en policy

Lägg till kravet i en namngiven policy med AddRequirements (eller Requirements.Add). Handlern matchas automatiskt efter typ.

builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("AtLeast18", policy =>
        policy.AddRequirements(new MinimumAgeRequirement(18)));
});

Använd policyn

Tillämpa den på samma sätt som vilken annan namngiven policy som helst.

[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();

Resursbaserad auktorisering

Om du vill auktorisera mot en specifik instans (till exempel ”endast dokumentets ägare får redigera”) använder du resursöverlagringen. Resursen skickas med i handlerns kontext.

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;
    }
}

Anropa IAuthorizationService

Resursbaserade kontroller körs imperativt inuti en action via den injicerade 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);
}

Flera handlers per krav

Ett krav kan ha flera handlers; om någon handler lyckas är kravet uppfyllt. Det här modellerar OR-villkor på ett tydligt sätt (såvida ingen handler anropar Fail).

// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();

Snabbtest

Testa att du har förstått handlers.

Sammanfattning

Du har byggt anpassad auktorisering:

  • Ett IAuthorizationRequirement innehåller regelns data.
  • En AuthorizationHandler<T> innehåller logiken och anropar Succeed.
  • Registrera handlern som IAuthorizationHandler och koppla kravet till en policy.
  • Resursbaserade handlers och IAuthorizationService auktoriserar specifika instanser.

Detta slutför auktoriseringskursen.

Gratis att börja

Lär dig C# med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
93
Lektioner
346

Vanliga frågor

Är lektionen ”Egna auktoriseringskrav” gratis?

Ja – hela texten till ”Egna auktoriseringskrav” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i C# Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i C# Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Egna auktoriseringskrav”?

Bygg egna krav och hanterare. Ni övar på C# Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig C# Academy?

Du behöver inga förkunskaper. Utbildningen i C# Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 4 av 4.

Hur lång tid tar lektionen ”Egna auktoriseringskrav”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här C# Academy-lektionen?

Ja. Varje C# Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Rollbaserad auktorisering
  2. Claim-baserad auktorisering
  3. Policybaserad auktorisering
  4. Egna auktoriseringskrav
← Tillbaka till C# Academy