Benutzerdefinierte Autorisierungsanforderungen
Erstellen Sie eigene Anforderungen und Handler.
Benutzerdefinierte Autorisierungsanforderungen ist eine kostenlose C# Academy-Lektion auf CoddyKit. Dies ist Lektion 4 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C# Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Wenn integrierte Funktionen nicht ausreichen
Manche Regeln lassen sich nicht mit RequireRole oder RequireClaim ausdrücken – zum Beispiel „muss mindestens 18 Jahre alt sein“ oder „muss Eigentümer dieser Ressource sein“.
Dafür schreiben Sie eine benutzerdefinierte Anforderung und einen passenden Handler.
// Rule: user must be older than a configurable minimum ageIAuthorizationRequirement
Eine Anforderung ist ein Marker, der die Daten der Regel enthält. Sie implementiert die leere Schnittstelle IAuthorizationRequirement.
public class MinimumAgeRequirement : IAuthorizationRequirement
{
public int MinimumAge { get; }
public MinimumAgeRequirement(int minimumAge) =>
MinimumAge = minimumAge;
}AuthorizationHandler
Ein Handler enthält die Logik. Leiten Sie ihn von AuthorizationHandler<TRequirement> ab und überschreiben Sie HandleRequirementAsync.
public class MinimumAgeHandler
: AuthorizationHandler<MinimumAgeRequirement>
{
protected override Task HandleRequirementAsync(
AuthorizationHandlerContext context,
MinimumAgeRequirement requirement)
{
// logic goes here
return Task.CompletedTask;
}
}Die Anforderung erfüllen
Untersuchen Sie im Handler die Claims des Benutzers. Wenn die Regel erfüllt ist, rufen Sie context.Succeed(requirement) auf. Andernfalls kehren Sie einfach zurück, ohne den Aufruf auszuführen.
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;Erfüllen, nicht fehlschlagen
Rufen Sie vorzugsweise Succeed auf, wenn die Anforderung erfüllt ist, und tun Sie andernfalls nichts. Rufen Sie context.Fail() nur auf, wenn Sie unabhängig von anderen Handlern für dieselbe Anforderung einen garantierten Fehlschlag erzwingen möchten.
// Soft: let other handlers also try
if (ok) context.Succeed(requirement);
// Hard: force failure no matter what
if (blocked) context.Fail();Den Handler registrieren
Registrieren Sie Handler in DI als IAuthorizationHandler. Sie sind normalerweise Singletons, außer wenn sie von Scoped-Services abhängen.
builder.Services.AddSingleton<
IAuthorizationHandler, MinimumAgeHandler>();An eine Policy binden
Fügen Sie die Anforderung mit AddRequirements (oder Requirements.Add) einer benannten Policy hinzu. Der Handler wird automatisch anhand des Typs zugeordnet.
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast18", policy =>
policy.AddRequirements(new MinimumAgeRequirement(18)));
});Die Policy verwenden
Wenden Sie sie wie jede andere benannte Policy an.
[Authorize(Policy = "AtLeast18")]
[HttpGet("age-restricted")]
public IActionResult Restricted() => Ok();Ressourcenbasierte Autorisierung
Um eine bestimmte Instanz zu autorisieren (z. B. „nur der Dokumenteigentümer darf es bearbeiten“), verwenden Sie die Überladung für Ressourcen. Die Ressource wird an den Handler-Kontext übergeben.
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;
}
}IAuthorizationService aufrufen
Ressourcenbasierte Prüfungen werden innerhalb einer Aktion imperativ über den injizierten IAuthorizationService ausgeführt.
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);
}Mehrere Handler pro Anforderung
Eine Anforderung kann mehrere Handler besitzen. Wenn ein beliebiger Handler erfolgreich ist, gilt die Anforderung als erfüllt. Dadurch lassen sich ODER-Bedingungen sauber abbilden (außer ein Handler ruft Fail auf).
// e.g. allow if owner OR if admin role
services.AddSingleton<IAuthorizationHandler, OwnerHandler>();
services.AddSingleton<IAuthorizationHandler, AdminOverrideHandler>();Kurze Überprüfung
Testen Sie Ihr Verständnis von Handlern.
Zusammenfassung
Sie haben eine benutzerdefinierte Autorisierung erstellt:
- Eine
IAuthorizationRequiremententhält die Daten der Regel. - Ein
AuthorizationHandler<T>enthält die Logik und ruftSucceedauf. - Registrieren Sie den Handler als
IAuthorizationHandlerund fügen Sie die Anforderung einer Policy hinzu. - Ressourcenbasierte Handler und
IAuthorizationServiceautorisieren bestimmte Instanzen.
Damit ist der Autorisierungskurs abgeschlossen.
Häufig gestellte Fragen
Ist die Lektion „Benutzerdefinierte Autorisierungsanforderungen“ kostenlos?
Ja — der vollständige Text von „Benutzerdefinierte Autorisierungsanforderungen“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C# Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C# Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Benutzerdefinierte Autorisierungsanforderungen“?
Erstellen Sie eigene Anforderungen und Handler. Du übst C# Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C# Academy zu starten?
Keine Vorkenntnisse erforderlich. C# Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 4 von 4.
Wie lange dauert die Lektion „Benutzerdefinierte Autorisierungsanforderungen“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C# Academy-Lektion Code schreiben und ausführen?
Ja. Jede C# Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Rollenbasierte Autorisierung
- Claims-basierte Autorisierung
- Richtlinienbasierte Autorisierung
- Benutzerdefinierte Autorisierungsanforderungen