0Pricing
C# Academy · Lekcja

Niestandardowe wymagania autoryzacji

Twórz niestandardowe wymagania i programy obsługi.

Niestandardowe wymagania autoryzacji to bezpłatna lekcja C# Academy na CoddyKit. To lekcja 4 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej C# Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs C# Academy zawiera 4 lekcji w sumie.

Gdy wbudowane mechanizmy nie wystarczają

Niektórych reguł nie da się wyrazić za pomocą RequireRole lub RequireClaim — na przykład „trzeba mieć co najmniej 18 lat” albo „trzeba być właścicielem tego zasobu”.

W takich przypadkach należy napisać niestandardowe wymaganie oraz handler.

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

IAuthorizationRequirement

Wymaganie jest znacznikiem zawierającym dane reguły. Implementuje pusty interfejs IAuthorizationRequirement.

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

AuthorizationHandler

Handler zawiera logikę. Należy dziedziczyć po AuthorizationHandler<TRequirement> i przesłonić metodę HandleRequirementAsync.

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

Spełnianie wymagania

Wewnątrz handlera należy sprawdzić claims użytkownika. Jeśli reguła jest spełniona, należy wywołać context.Succeed(requirement). Jeśli nie, wystarczy zakończyć działanie bez jego wywoływania.

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;

Wywołuj Succeed, nie Fail

Należy preferować wywołanie Succeed po spełnieniu wymagania i nie robić nic w przeciwnym razie. context.Fail() należy wywoływać tylko wtedy, gdy chce się zagwarantować niepowodzenie niezależnie od innych handlerów obsługujących to samo wymaganie.

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

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

Rejestrowanie handlera

Handlery należy rejestrować w DI jako IAuthorizationHandler. Zwykle są singletonami, chyba że zależą od usług o zasięgu scoped.

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

Dołączanie do polityki

Wymaganie należy dodać do nazwanej polityki za pomocą AddRequirements (lub Requirements.Add). Handler jest automatycznie dopasowywany na podstawie typu.

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

Używanie polityki

Należy zastosować ją tak jak każdą inną nazwaną politykę.

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

Autoryzacja oparta na zasobach

Aby przeprowadzić autoryzację względem konkretnej instancji (np. „tylko właściciel dokumentu może go edytować”), należy użyć przeciążenia przyjmującego zasób. Zasób jest przekazywany do kontekstu handlera.

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

Wywoływanie IAuthorizationService

Sprawdzanie oparte na zasobie wykonuje się imperatywnie wewnątrz akcji, korzystając z wstrzykniętego 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);
}

Wiele handlerów dla jednego wymagania

Wymaganie może mieć kilka handlerów; jeśli powiedzie się dowolny handler, wymaganie zostaje spełnione. Pozwala to przejrzyście modelować warunki OR (chyba że handler wywoła Fail).

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

Szybki test

Sprawdź swoje rozumienie handlerów.

Podsumowanie

Zbudowali Państwo niestandardową autoryzację:

  • IAuthorizationRequirement przechowuje dane reguły.
  • AuthorizationHandler<T> zawiera logikę i wywołuje Succeed.
  • Handler należy zarejestrować jako IAuthorizationHandler i dołączyć wymaganie do polityki.
  • Handlery oparte na zasobach oraz IAuthorizationService służą do autoryzowania konkretnych instancji.

Na tym kończy się kurs autoryzacji.

Często zadawane pytania

Czy lekcja „Niestandardowe wymagania autoryzacji” jest bezpłatna?

Tak — pełny tekst „Niestandardowe wymagania autoryzacji” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu C# Academy, przejdź na CoddyKit PRO. Kurs C# Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Niestandardowe wymagania autoryzacji”?

Twórz niestandardowe wymagania i programy obsługi. Ćwiczysz C# Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć C# Academy?

Nie wymagamy żadnego doświadczenia. C# Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 4 z 4.

Ile czasu zajmuje lekcja „Niestandardowe wymagania autoryzacji”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji C# Academy?

Tak. Każda lekcja C# Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Autoryzacja oparta na rolach
  2. Autoryzacja oparta na deklaracjach
  3. Autoryzacja oparta na zasadach
  4. Niestandardowe wymagania autoryzacji
← Powrót do C# Academy