Egna auktoriseringskrav
Bygg egna krav och hanterare.
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 ageIAuthorizationRequirement
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
IAuthorizationRequirementinnehåller regelns data. - En
AuthorizationHandler<T>innehåller logiken och anroparSucceed. - Registrera handlern som
IAuthorizationHandleroch koppla kravet till en policy. - Resursbaserade handlers och
IAuthorizationServiceauktoriserar specifika instanser.
Detta slutför auktoriseringskursen.
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
- Rollbaserad auktorisering
- Claim-baserad auktorisering
- Policybaserad auktorisering
- Egna auktoriseringskrav