C# Academy · Oppitunti

Mukautetut valtuutusvaatimukset

Rakentakaa mukautettuja vaatimuksia ja käsittelijöitä.

Oppitunti 4/413 vaihetta

Mukautetut valtuutusvaatimukset on ilmainen C# Academy-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu C# Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. C# Academy-kurssilla on yhteensä 4 oppituntia.

Kun valmiit ominaisuudet eivät riitä

Kaikkia sääntöjä ei voi ilmaista RequireRole- tai RequireClaim-metodeilla – esimerkiksi ”iän on oltava vähintään 18 vuotta” tai ”käyttäjän on omistettava tämä resurssi”.

Tällöin kirjoitetaan mukautettu vaatimus ja käsittelijä.

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

IAuthorizationRequirement

Vaatimus on merkintä, joka sisältää säännön tiedot. Se toteuttaa tyhjän IAuthorizationRequirement-rajapinnan.

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

AuthorizationHandler

Käsittelijä sisältää logiikan. Johda se luokasta AuthorizationHandler<TRequirement> ja ohita HandleRequirementAsync-metodi.

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

Vaatimuksen hyväksyminen

Tarkastele käsittelijässä käyttäjän claimeja. Jos sääntö täyttyy, kutsu context.Succeed(requirement)-metodia. Muussa tapauksessa palaa kutsumatta sitä.

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, ei Fail

On suositeltavaa kutsua Succeed-metodia, kun vaatimus täyttyy, ja olla tekemättä mitään muussa tapauksessa. Kutsu context.Fail()-metodia vain, kun haluat taata epäonnistumisen kaikista samaa vaatimusta käsittelevistä muista käsittelijöistä riippumatta.

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

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

Käsittelijän rekisteröiminen

Rekisteröi käsittelijät DI:hin tyypillä IAuthorizationHandler. Ne ovat yleensä singleton-instansseja, paitsi jos ne riippuvat scopetuista palveluista.

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

Liittäminen käytäntöön

Lisää vaatimus nimettyyn käytäntöön AddRequirements-metodilla (tai Requirements.Add-metodilla). Käsittelijä yhdistetään tyyppinsä perusteella automaattisesti.

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

Käytännön käyttäminen

Käytä sitä kuten mitä tahansa muuta nimettyä käytäntöä.

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

Resurssiin perustuva valtuutus

Kun valtuutus on kohdistettava tiettyyn ilmentymään (esimerkiksi ”vain asiakirjan omistaja voi muokata sitä”), käytä resurssin sisältävää ylikuormitettua versiota. Resurssi välitetään käsittelijän kontekstiin.

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

IAuthorizationServicen kutsuminen

Resurssiin perustuvat tarkistukset suoritetaan imperatiivisesti toiminnon sisällä injektoidun IAuthorizationService-palvelun avulla.

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

Useita käsittelijöitä vaatimusta kohden

Vaatimuksella voi olla useita käsittelijöitä. Jos yksikin käsittelijä onnistuu, vaatimus täyttyy. Näin TAI-ehdot voidaan mallintaa selkeästi, ellei jokin käsittelijä kutsu Fail-metodia.

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

Pikatesti

Testaa, miten hyvin ymmärrät käsittelijöitä.

Kertaus

Rakensit mukautetun valtuutuksen:

  • IAuthorizationRequirement sisältää säännön tiedot.
  • AuthorizationHandler<T> sisältää logiikan ja kutsuu Succeed-metodia.
  • Rekisteröi käsittelijä tyypillä IAuthorizationHandler ja liitä vaatimus käytäntöön.
  • Resurssiin perustuvat käsittelijät ja IAuthorizationService valtuuttavat tiettyjen ilmentymien käytön.

Tähän päättyy valtuutusta käsittelevä kurssi.

Aloita maksutta

Opi C# tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
93
Oppitunnit
346

Usein kysytyt kysymykset

Onko oppitunti ”Mukautetut valtuutusvaatimukset” ilmainen?

Kyllä – oppitunnin ”Mukautetut valtuutusvaatimukset” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko C# Academy-kurssin, päivitä CoddyKit PROhon. C# Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Mukautetut valtuutusvaatimukset”?

Rakentakaa mukautettuja vaatimuksia ja käsittelijöitä. Harjoittelet C# Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni C# Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin C# Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.

Kuinka kauan ”Mukautetut valtuutusvaatimukset”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä C# Academy-oppitunnilla?

Kyllä. Jokainen C# Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. Roolipohjainen valtuutus
  2. Claim-pohjainen valtuutus
  3. Käytäntöihin perustuva valtuutus
  4. Mukautetut valtuutusvaatimukset
← Takaisin: C# Academy