Delen via


Over autorisatie in .NET-microservices en webtoepassingen

Tip

Deze inhoud is een fragment uit het eBook, .NET Microservices Architecture for Containerized .NET Applications, beschikbaar op .NET Docs of als een gratis downloadbare PDF die offline kan worden gelezen.

.NET Microservices Architecture for Containerized .NET Applications eBook cover thumbnail.

Na verificatie moeten ASP.NET Core Web-API's toegang autoriseren. Met dit proces kan een service API's beschikbaar maken voor sommige geverifieerde gebruikers, maar niet voor alle. Autorisatie kan worden uitgevoerd op basis van de rollen van gebruikers of op basis van aangepast beleid, waaronder het inspecteren van claims of andere heuristieken.

Het beperken van de toegang tot een ASP.NET Core MVC-route is net zo eenvoudig als het toepassen van een kenmerk Autoriseren op de actiemethode (of op de klasse van de controller als alle acties van de controller autorisatie vereisen), zoals wordt weergegeven in het volgende voorbeeld:

public class AccountController : Controller
{
    public ActionResult Login()
    {
    }

    [Authorize]
    public ActionResult Logout()
    {
    }
}

Standaard beperkt het toevoegen van een kenmerk Autoriseren zonder parameters de toegang tot geverifieerde gebruikers voor die controller of actie. Als u verder wilt beperken dat een API alleen beschikbaar is voor specifieke gebruikers, kan het kenmerk worden uitgebreid om vereiste rollen of beleidsregels op te geven waaraan gebruikers moeten voldoen.

Autorisatie op basis van rollen implementeren

ASP.NET Core Identity heeft een ingebouwd concept van rollen. Naast gebruikers worden in ASP.NET Core Identity informatie opgeslagen over verschillende rollen die door de toepassing worden gebruikt en wordt bijgehouden welke gebruikers aan welke rollen zijn toegewezen. Deze toewijzingen kunnen programmatisch worden gewijzigd met het RoleManager type dat rollen bijwerkt in permanente opslag en het UserManager type dat rollen van gebruikers kan verlenen of intrekken.

Als u verificatie uitvoert met JWT Bearer-tokens, vult de ASP.NET Core JWT bearer-verificatie-middleware de rollen van een gebruiker op basis van rolclaims in het token. Als u de toegang tot een MVC-actie of -controller wilt beperken tot gebruikers in specifieke rollen, kunt u een parameter Rollen opnemen in de annotatie Autoriseren (kenmerk), zoals wordt weergegeven in het volgende codefragment:

[Authorize(Roles = "Administrator, PowerUser")]
public class ControlPanelController : Controller
{
    public ActionResult SetTime()
    {
    }

    [Authorize(Roles = "Administrator")]
    public ActionResult ShutDown()
    {
    }
}

In dit voorbeeld hebben alleen gebruikers in de rollen Beheer istrator of PowerUser toegang tot API's in de ControlPanel-controller (zoals het uitvoeren van de actie SetTime). De ShutDown-API is verder beperkt om alleen toegang toe te staan voor gebruikers in de rol Beheer istrator.

Als u wilt vereisen dat een gebruiker meerdere rollen heeft, gebruikt u meerdere autoriseren kenmerken, zoals wordt weergegeven in het volgende voorbeeld:

[Authorize(Roles = "Administrator, PowerUser")]
[Authorize(Roles = "RemoteEmployee ")]
[Authorize(Policy = "CustomPolicy")]
public ActionResult API1 ()
{
}

In dit voorbeeld moet een gebruiker het volgende doen om API1 aan te roepen:

  • De rol van Beheer istrator of PowerUser hebben, en

  • De rol RemoteEmployee hebben en

  • Voldoen aan een aangepaste handler voor CustomPolicy-autorisatie.

Autorisatie op basis van beleid implementeren

Aangepaste autorisatieregels kunnen ook worden geschreven met behulp van autorisatiebeleid. Deze sectie bevat een overzicht. Zie de ASP.NET Authorization Workshop voor meer informatie.

Aangepast autorisatiebeleid wordt geregistreerd in de methode Startup.ConfigureServices met behulp van de service. Methode AddAuthorization. Deze methode gebruikt een gemachtigde die een AuthorizationOptions-argument configureert.

services.AddAuthorization(options =>
{
    options.AddPolicy("AdministratorsOnly", policy =>
        policy.RequireRole("Administrator"));

    options.AddPolicy("EmployeesOnly", policy =>
        policy.RequireClaim("EmployeeNumber"));

    options.AddPolicy("Over21", policy =>
        policy.Requirements.Add(new MinimumAgeRequirement(21)));
});

Zoals in het voorbeeld wordt weergegeven, kunnen beleidsregels worden gekoppeld aan verschillende typen vereisten. Nadat de beleidsregels zijn geregistreerd, kunnen ze worden toegepast op een actie of controller door de naam van het beleid door te geven als het argument Beleid van het kenmerk Autoriseren (bijvoorbeeld [Authorize(Policy="EmployeesOnly")]) beleidsregels kunnen meerdere vereisten hebben, niet slechts één (zoals in deze voorbeelden).

In het vorige voorbeeld is de eerste AddPolicy-aanroep slechts een alternatieve manier om te autoriseren op basis van de rol. Als [Authorize(Policy="AdministratorsOnly")] deze wordt toegepast op een API, hebben alleen gebruikers in de rol Beheer istrator toegang tot deze API.

De tweede AddPolicy aanroep demonstreert een eenvoudige manier om te vereisen dat een bepaalde claim aanwezig moet zijn voor de gebruiker. De RequireClaim methode gebruikt eventueel ook verwachte waarden voor de claim. Als er waarden worden opgegeven, wordt alleen voldaan aan de vereiste als de gebruiker zowel een claim van het juiste type als een van de opgegeven waarden heeft. Als u de JWT Bearer-verificatie-middleware gebruikt, zijn alle JWT-eigenschappen beschikbaar als gebruikersclaims.

Het meest interessante beleid dat hier wordt weergegeven, is in de derde AddPolicy methode, omdat er een aangepaste autorisatievereiste wordt gebruikt. Door aangepaste autorisatievereisten te gebruiken, kunt u veel controle hebben over de wijze waarop autorisatie wordt uitgevoerd. Dit werkt alleen als u deze typen implementeert:

  • Een type vereisten dat is afgeleid van IAuthorizationRequirement en die velden bevat die de details van de vereiste opgeven. In het voorbeeld is dit een leeftijdsveld voor het voorbeeldtype MinimumAgeRequirement .

  • Een handler die implementeert AuthorizationHandler<TRequirement>, waarbij T het type IAuthorizationRequirement is waaraan de handler kan voldoen. De handler moet de HandleRequirementAsync methode implementeren, waarmee wordt gecontroleerd of een opgegeven context met informatie over de gebruiker voldoet aan de vereiste.

Als de gebruiker aan de vereiste voldoet, geeft een aanroep om aan te context.Succeed geven dat de gebruiker is geautoriseerd. Als er meerdere manieren zijn waarop een gebruiker aan een autorisatievereiste kan voldoen, kunnen meerdere handlers worden gemaakt.

Naast het registreren van aangepaste beleidsvereisten bij AddPolicy aanroepen, moet u ook aangepaste vereistehandlers registreren via afhankelijkheidsinjectie (services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()).

Een voorbeeld van een aangepaste autorisatievereiste en handler voor het controleren van de leeftijd van een gebruiker (op basis van een DateOfBirth claim) is beschikbaar in de ASP.NET Core-autorisatiedocumentatie.

Autorisatie en minimale API's

ASP.NET ondersteunt minimale API's als alternatief voor api's op basis van een controller. Autorisatiebeleid is de aanbevolen manier om autorisatie te configureren voor minimale API's, zoals in dit voorbeeld wordt getoond:

// Program.cs
builder.Services.AddAuthorizationBuilder()
  .AddPolicy("admin_greetings", policy =>
        policy
            .RequireRole("admin")
            .RequireScope("greetings_api"));

// build the app

app.MapGet("/hello", () => "Hello world!")
  .RequireAuthorization("admin_greetings");

Aanvullende bronnen