Informationen zur Autorisierung in .NET-Microservices und WebanwendungenAbout authorization in .NET microservices and web applications

Nach der Authentifizierung müssen ASP.NET Core-Web-APIs den Zugriff autorisieren.After authentication, ASP.NET Core Web APIs need to authorize access. Dieser Prozess ermöglicht einem Dienst die Zurverfügungstellung von APIs für einige authentifizierte Benutzer, jedoch nicht alle.This process allows a service to make APIs available to some authenticated users, but not to all. Die Autorisierung kann basierend auf Benutzerrollen oder basierend auf einer benutzerdefinierten Richtlinie erfolgen, welche die Überprüfung von Ansprüchen oder anderen Heuristiken umfassen kann.Authorization can be done based on users’ roles or based on custom policy, which might include inspecting claims or other heuristics.

Die Einschränkung des Zugriffs auf eine ASP.NET Core-MVC-Route ist so einfach wie die Anwendung eines Authorize-Attributs auf die Aktionsmethode (oder auf die Controllerklasse, wenn für sämtliche Controlleraktionen eine Autorisierung erforderlich ist). Siehe hierzu das folgende Beispiel:Restricting access to an ASP.NET Core MVC route is as easy as applying an Authorize attribute to the action method (or to the controller’s class if all the controller’s actions require authorization), as shown in following example:

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

    [Authorize]
    public ActionResult Logout()
    {
    }
}

Standardmäßig wird durch das Hinzufügen eines Authorize-Attributs ohne Parameter der Zugriff für diesen Controller oder diese Aktion auf authentifizierte Benutzer beschränkt.By default, adding an Authorize attribute without parameters will limit access to authenticated users for that controller or action. Wenn Sie eine API weiter beschränken möchten, sodass sie nur für bestimmte Benutzer verfügbar ist, kann das Attribut so erweitert werden, dass erforderliche Rollen oder Richtlinien angegeben werden, die von den Benutzern erfüllt werden müssen.To further restrict an API to be available for only specific users, the attribute can be expanded to specify required roles or policies that users must satisfy.

Implementieren einer rollenbasierten AutorisierungImplement role-based authorization

Die ASP.NET Core-Identität verfügt über ein integriertes Rollenkonzept.ASP.NET Core Identity has a built-in concept of roles. Neben Benutzern speichert die ASP.NET Core-Identität Informationen zu verschiedenen, von der Anwendung verwendeten Rollen und verfolgt mit, welche Benutzer welchen Rollen zugewiesen werden.In addition to users, ASP.NET Core Identity stores information about different roles used by the application and keeps track of which users are assigned to which roles. Diese Zuweisungen können programmgesteuert mit dem RoleManager-Typ geändert werden, der Rollen in persistentem Speicher aktualisiert, und dem UserManager-Typ, der Benutzern Rollen gewähren oder sie widerrufen kann.These assignments can be changed programmatically with the RoleManager type that updates roles in persisted storage, and the UserManager type that can grant or revoke roles from users.

Wenn Sie eine Authentifizierung mit JWT-Bearertoken durchführen, füllt die Middleware für die Authentifizierung mit ASP.NET Core-JWT-Bearertoken die Rollen eines Benutzers basierend auf im Token gefundenen Rollenansprüchen auf.If you're authenticating with JWT bearer tokens, the ASP.NET Core JWT bearer authentication middleware will populate a user’s roles based on role claims found in the token. Wenn Sie den Zugriff auf eine MVC-Aktion oder einen MVC-Controller auf Benutzer in bestimmten Rollen beschränken möchten, können Sie, wie im folgenden Codefragment dargestellt, den Parameter „Roles“ in die Anmerkung (das Attribut) „Authorize“ einschließen:To limit access to an MVC action or controller to users in specific roles, you can include a Roles parameter in the Authorize annotation (attribute), as shown in the following code fragment:

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

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

In diesem Beispiel können nur Benutzer mit der Rolle „Administrator“ oder „PowerUser“ auf APIs im ControlPanel-Controller zugreifen (z.B. zum Ausführen der SetTime-Aktion).In this example, only users in the Administrator or PowerUser roles can access APIs in the ControlPanel controller (such as executing the SetTime action). Die ShutDown-API wird weiter eingeschränkt, damit nur Benutzer mit der Rolle „Administrator“ Zugriff haben.The ShutDown API is further restricted to allow access only to users in the Administrator role.

Wenn ein Benutzer über mehrere Rollen verfügen soll, müssen Sie, wie im folgenden Beispiel dargestellt, mehrere Authorize-Attribute verwenden:To require a user be in multiple roles, you use multiple Authorize attributes, as shown in the following example:

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

In diesem Beispiel muss ein Benutzer folgende Voraussetzungen erfüllen, damit API1 aufgerufen wird:In this example, to call API1, a user must:

  • Er muss in der Rolle „Administrator“ oder „PowerUser“ sein, undBe in the Administrator or PowerUser role, and

  • er muss in der Rolle „RemoteEmployee“ sein, undBe in the RemoteEmployee role, and

  • er muss die Bedingungen eines benutzerdefinierten Handlers für die CustomPolicy-Autorisierung erfüllen.Satisfy a custom handler for CustomPolicy authorization.

Implementieren einer richtlinienbasierten AutorisierungImplement policy-based authorization

Benutzerdefinierte Autorisierungsregeln können auch mithilfe von Autorisierungsrichtlinien geschrieben werden.Custom authorization rules can also be written using authorization policies. Dieser Abschnitt enthält einen Überblick.This section provides an overview. Weitere Informationen finden Sie unter ASP.NET Authorization Workshop (ASP.NET-Autorisierungsworkshop).For more information, see the ASP.NET Authorization Workshop.

Benutzerdefinierte Autorisierungsrichtlinien werden in der Startup.ConfigureServices-Methode mithilfe der service.AddAuthorization-Methode registriert.Custom authorization policies are registered in the Startup.ConfigureServices method using the service.AddAuthorization method. Diese Methode wählt einen Delegaten für die Konfiguration eines AuthorizationOptions-Arguments aus.This method takes a delegate that configures an AuthorizationOptions argument.

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

Wie im Beispiel dargestellt wird, können Richtlinien unterschiedliche Arten von Anforderungen zugeordnet werden.As shown in the example, policies can be associated with different types of requirements. Nach der Registrierung der Richtlinien können diese auf eine Aktion oder einen Controller angewendet werden, indem der Name der jeweiligen Richtlinie als Argument „Policy“ des Attributs „Authorize“ (z.B. [Authorize(Policy="EmployeesOnly")]) übergeben wird. Richtlinien können mehrere Anforderungen enthalten, nicht nur eine (wie in diesen Beispielen zu sehen ist).After the policies are registered, they can be applied to an action or controller by passing the policy’s name as the Policy argument of the Authorize attribute (for example, [Authorize(Policy="EmployeesOnly")]) Policies can have multiple requirements, not just one (as shown in these examples).

Im vorherigen Beispiel stellt der Aufruf von „AddPolicy“ nur eine alternative Möglichkeit für die Autorisierung nach Rollen dar.In the previous example, the first AddPolicy call is just an alternative way of authorizing by role. Wenn [Authorize(Policy="AdministratorsOnly")] auf eine API angewendet wird, können nur Benutzer mit der Rolle „Administrator“ darauf zugreifen.If [Authorize(Policy="AdministratorsOnly")] is applied to an API, only users in the Administrator role will be able to access it.

Der zweite Aufruf von AddPolicy veranschaulicht eine einfache Möglichkeit für die Anforderung, dass ein bestimmter Anspruch für den Benutzer vorhanden sein sollte.The second AddPolicy call demonstrates an easy way to require that a particular claim should be present for the user. Bei der RequireClaim-Methode werden zudem optional erwartete Werte für den Anspruch übernommen.The RequireClaim method also optionally takes expected values for the claim. Wenn Werte angegeben sind, wird die Anforderung nur dann erfüllt, wenn der Benutzer sowohl über einen Anspruch des richtigen Typs als auch über einen der angegebenen Werte verfügt.If values are specified, the requirement is met only if the user has both a claim of the correct type and one of the specified values. Bei Verwendung der Middleware für die Authentifizierung mit JWT-Bearertoken stehen alle JWT-Eigenschaften als Benutzeransprüche zur Verfügung.If you're using the JWT bearer authentication middleware, all JWT properties will be available as user claims.

Die interessanteste der hier dargestellten Richtlinien ist die dritte AddPolicy-Methode, da diese eine benutzerdefinierte Autorisierungsanforderung verwendet.The most interesting policy shown here is in the third AddPolicy method, because it uses a custom authorization requirement. Durch die Verwendung von benutzerdefinierten Autorisierungsanforderungen verfügen Sie über sehr viel Kontrolle über die Vorgehensweise bei der Autorisierung.By using custom authorization requirements, you can have a great deal of control over how authorization is performed. Damit dies funktioniert, müssen Sie folgende Typen implementieren:For this to work, you must implement these types:

  • Einen Anforderungstyp, der von IAuthorizationRequirement abgeleitet wird und Felder enthält, in denen die Anforderungsdetails angegeben sind.A Requirements type that derives from IAuthorizationRequirement and that contains fields specifying the details of the requirement. Im Beispiel handelt es sich hierbei um ein Altersfeld für den MinimumAgeRequirement-Typ.In the example, this is an age field for the sample MinimumAgeRequirement type.

  • Ein Handler, der AuthorizationHandler<TRequirement> implementiert, wobei „T“ der Typ von IAuthorizationRequirement ist, den der Handler bedienen kann.A handler that implements AuthorizationHandler<TRequirement>, where T is the type of IAuthorizationRequirement that the handler can satisfy. Der Handler muss die HandleRequirementAsync-Methode implementieren, die überprüft, ob ein angegebener Kontext mit Informationen zum Benutzer die Anforderung erfüllt.The handler must implement the HandleRequirementAsync method, which checks whether a specified context that contains information about the user satisfies the requirement.

Wenn der Benutzer die Anforderung erfüllt, deutet ein Aufruf von context.Succeed darauf hin, dass der Benutzer autorisiert wurde.If the user meets the requirement, a call to context.Succeed will indicate that the user is authorized. Wenn es mehrere Möglichkeiten für die Erfüllung einer Autorisierungsanforderung durch einen Benutzer gibt, können mehrere Handler erstellt werden.If there are multiple ways that a user might satisfy an authorization requirement, multiple handlers can be created.

Neben der Registrierung benutzerdefinierter Richtlinienanforderungen mit AddPolicy-Aufrufen müssen Sie auch über die Abhängigkeitsinjektion benutzerdefinierte Anforderungshandler registrieren (services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()).In addition to registering custom policy requirements with AddPolicy calls, you also need to register custom requirement handlers via Dependency Injection (services.AddTransient<IAuthorizationHandler, MinimumAgeHandler>()).

Ein Beispiel für eine benutzerdefinierte Autorisierungsanforderung und einen Handler zur Überprüfung des Alters eines Benutzers (basierend auf einem DateOfBirth-Anspruch) ist in der Dokumentation zur ASP.NET Core-Autorisierung verfügbar.An example of a custom authorization requirement and handler for checking a user’s age (based on a DateOfBirth claim) is available in the ASP.NET Core authorization documentation.

Zusätzliche RessourcenAdditional resources