Autorisieren mit einem bestimmten Schema in ASP.NET Core

Eine Einführung in Authentifizierungsschemas in ASP.NET Core finden Sie unter Authentifizierungsschema.

In einigen Szenarien, z. B. Single-Page-Anwendungen (SPAs), ist es üblich, mehrere Authentifizierungsmethoden zu verwenden. Beispielsweise kann die App die cookie -basierte Authentifizierung verwenden, um sich anzumelden, und die JWT-Bearerauthentifizierung für JavaScript-Anforderungen. In einigen Fällen kann die App über mehrere Instanzen eines Authentifizierungshandlers verfügen. Beispielsweise werden zwei Handler erstellt, cookie bei denen einer eine grundlegende Identität enthält und einer, wenn eine mehrstufige Authentifizierung (Multi-Factor Authentication, MFA) ausgelöst wurde. MFA kann ausgelöst werden, da der Benutzer einen Vorgang angefordert hat, der zusätzliche Sicherheit erfordert. Weitere Informationen zum Erzwingen von MFA, wenn ein Benutzer eine Ressource anfordert, die MFA erfordert, finden Sie im Abschnitt schützen mit MFAGitHub Problem.

Ein Authentifizierungsschema wird benannt, wenn der Authentifizierungsdienst während der Authentifizierung konfiguriert wird. Beispiel:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication()
        .AddCookie(options => {
            options.LoginPath = "/Account/Unauthorized/";
            options.AccessDeniedPath = "/Account/Forbidden/";
        })
        .AddJwtBearer(options => {
            options.Audience = "http://localhost:5001/";
            options.Authority = "http://localhost:5000/";
        });

Im vorangehenden Code wurden zwei Authentifizierungshandler hinzugefügt: einer für cookie s und einer für Bearer.

Hinweis

Wenn Sie das Standardschema angeben, wird die HttpContext.User -Eigenschaft auf diese Identität festgelegt. Wenn dieses Verhalten nicht gewünscht ist, deaktivieren Sie es, indem Sie die parameterlose Form von AddAuthentication aufrufen.

Auswählen des Schemas mit dem Authorize-Attribut

Zum Zeitpunkt der Autorisierung gibt die App den zu verwendenden Handler an. Wählen Sie den Handler aus, mit dem die App autorisiert wird, indem Sie eine durch Trennzeichen getrennte Liste von Authentifizierungsschemas an [Authorize] übergeben. Das [Authorize] -Attribut gibt das oder die zu verwendenden Authentifizierungsschemas an, unabhängig davon, ob ein Standard konfiguriert ist. Beispiel:

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
    // Requires the following imports:
    // using Microsoft.AspNetCore.Authentication.Cookies;
    // using Microsoft.AspNetCore.Authentication.JwtBearer;
    private const string AuthSchemes =
        CookieAuthenticationDefaults.AuthenticationScheme + "," +
        JwtBearerDefaults.AuthenticationScheme;

Im vorherigen Beispiel werden sowohl der Bearerhandler als auch der cookie Bearerhandler ausgeführt und haben die Möglichkeit, eine Identität für den aktuellen Benutzer zu erstellen und anzufügen. Indem nur ein einzelnes Schema angegeben wird, wird der entsprechende Handler ausgeführt.

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]
public class MixedController : Controller

Im vorangehenden Code wird nur der Handler mit dem "Bearer"-Schema ausgeführt. Alle cookie -basierten Identitäten werden ignoriert.

Auswählen des Schemas mit Richtlinien

Wenn Sie die gewünschten Schemas in der Richtlinieangeben möchten, können Sie die Sammlung festlegen, wenn Sie Ihre Richtlinie hinzufügen:

services.AddAuthorization(options =>
{
    options.AddPolicy("Over18", policy =>
    {
        policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
        policy.Requirements.Add(new MinimumAgeRequirement());
    });
});

Im vorherigen Beispiel wird die Richtlinie "Over18" nur für die Identität ausgeführt, die vom Bearerhandler erstellt wurde. Verwenden Sie die Richtlinie, indem Sie die [Authorize] -Eigenschaft des Attributs Policy festlegen:

[Authorize(Policy = "Over18")]
public class RegistrationController : Controller

Verwenden mehrerer Authentifizierungsschemas

Einige Apps müssen möglicherweise mehrere Authentifizierungstypen unterstützen. Beispielsweise kann Ihre App Benutzer über Azure Active Directory und über eine Benutzerdatenbank authentifizieren. Ein weiteres Beispiel ist eine App, die Benutzer sowohl über Active Directory-Verbunddienste (AD FS) als auch über Azure Active Directory B2C authentifiziert. In diesem Fall sollte die App ein JWT-Bearertoken von mehreren Ausstellern akzeptieren.

Fügen Sie alle Authentifizierungsschemas hinzu, die Sie akzeptieren möchten. Der folgende Code in fügt beispielsweise Startup.ConfigureServices zwei JWT-Bearerauthentifizierungsschemas mit unterschiedlichen Ausstellern hinzu:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://localhost:5000/identity/";
        })
        .AddJwtBearer("AzureAD", options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://login.microsoftonline.com/eb971100-6f99-4bdc-8611-1bc8edd7f436/";
        });
}

Hinweis

Beim Standardauthentifizierungsschema ist nur eine JWT-Bearerauthentifizierung JwtBearerDefaults.AuthenticationScheme registriert. Zusätzliche Authentifizierung muss mit einem eindeutigen Authentifizierungsschema registriert werden.

Der nächste Schritt besteht darin, die Standardautorisierungsrichtlinie so zu aktualisieren, dass beide Authentifizierungsschemas akzeptiert werden. Beispiel:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthorization(options =>
    {
        var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
            JwtBearerDefaults.AuthenticationScheme,
            "AzureAD");
        defaultAuthorizationPolicyBuilder = 
            defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
        options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
    });
}

Da die Standardautorisierungsrichtlinie überschrieben wird, ist es möglich, das [Authorize] -Attribut in Controllern zu verwenden. Der Controller akzeptiert dann Anforderungen mit JWT, die vom ersten oder zweiten Aussteller ausgegeben werden.

Weitere Informationen finden Sie in diesem GitHub Problem bei der Verwendung mehrerer Authentifizierungsschemas.

Eine Einführung in Authentifizierungsschemas in ASP.NET Core finden Sie unter Authentifizierungsschema.

In einigen Szenarien, z. B. Single-Page-Anwendungen (SPAs), ist es üblich, mehrere Authentifizierungsmethoden zu verwenden. Beispielsweise kann die App die cookie -basierte Authentifizierung verwenden, um sich anzumelden, und die JWT-Bearerauthentifizierung für JavaScript-Anforderungen. In einigen Fällen kann die App über mehrere Instanzen eines Authentifizierungshandlers verfügen. Beispielsweise werden zwei Handler erstellt, cookie bei denen einer eine grundlegende Identität enthält und einer, wenn eine mehrstufige Authentifizierung (Multi-Factor Authentication, MFA) ausgelöst wurde. MFA kann ausgelöst werden, da der Benutzer einen Vorgang angefordert hat, der zusätzliche Sicherheit erfordert. Weitere Informationen zum Erzwingen von MFA, wenn ein Benutzer eine Ressource anfordert, die MFA erfordert, finden Sie im Abschnitt schützen mit MFAGitHub Problem.

Ein Authentifizierungsschema wird benannt, wenn der Authentifizierungsdienst während der Authentifizierung konfiguriert wird. Beispiel:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication()
        .AddCookie(options => {
            options.LoginPath = "/Account/Unauthorized/";
            options.AccessDeniedPath = "/Account/Forbidden/";
        })
        .AddJwtBearer(options => {
            options.Audience = "http://localhost:5001/";
            options.Authority = "http://localhost:5000/";
        });

Im vorangehenden Code wurden zwei Authentifizierungshandler hinzugefügt: einer für cookie s und einer für Bearer.

Hinweis

Wenn Sie das Standardschema angeben, wird die HttpContext.User -Eigenschaft auf diese Identität festgelegt. Wenn dieses Verhalten nicht gewünscht ist, deaktivieren Sie es, indem Sie die parameterlose Form von AddAuthentication aufrufen.

Auswählen des Schemas mit dem Authorize-Attribut

Zum Zeitpunkt der Autorisierung gibt die App den zu verwendenden Handler an. Wählen Sie den Handler aus, mit dem die App autorisiert wird, indem Sie eine durch Trennzeichen getrennte Liste von Authentifizierungsschemas an [Authorize] übergeben. Das [Authorize] -Attribut gibt das oder die zu verwendenden Authentifizierungsschemas an, unabhängig davon, ob ein Standard konfiguriert ist. Beispiel:

[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedController : Controller
    // Requires the following imports:
    // using Microsoft.AspNetCore.Authentication.Cookies;
    // using Microsoft.AspNetCore.Authentication.JwtBearer;
    private const string AuthSchemes =
        CookieAuthenticationDefaults.AuthenticationScheme + "," +
        JwtBearerDefaults.AuthenticationScheme;

Im vorherigen Beispiel werden sowohl der Bearerhandler als auch der cookie Bearerhandler ausgeführt und haben die Möglichkeit, eine Identität für den aktuellen Benutzer zu erstellen und anzufügen. Indem nur ein einzelnes Schema angegeben wird, wird der entsprechende Handler ausgeführt.

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]
public class MixedController : Controller

Im vorangehenden Code wird nur der Handler mit dem "Bearer"-Schema ausgeführt. Alle cookie -basierten Identitäten werden ignoriert.

Auswählen des Schemas mit Richtlinien

Wenn Sie die gewünschten Schemas in der Richtlinieangeben möchten, können Sie die Sammlung festlegen, wenn Sie Ihre Richtlinie hinzufügen:

services.AddAuthorization(options =>
{
    options.AddPolicy("Over18", policy =>
    {
        policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
        policy.RequireAuthenticatedUser();
        policy.Requirements.Add(new MinimumAgeRequirement());
    });
});

Im vorherigen Beispiel wird die Richtlinie "Over18" nur für die Identität ausgeführt, die vom Bearerhandler erstellt wurde. Verwenden Sie die Richtlinie, indem Sie die [Authorize] -Eigenschaft des Attributs Policy festlegen:

[Authorize(Policy = "Over18")]
public class RegistrationController : Controller

Verwenden mehrerer Authentifizierungsschemas

Einige Apps müssen möglicherweise mehrere Authentifizierungstypen unterstützen. Beispielsweise kann Ihre App Benutzer über Azure Active Directory und über eine Benutzerdatenbank authentifizieren. Ein weiteres Beispiel ist eine App, die Benutzer sowohl über Active Directory-Verbunddienste (AD FS) als auch über Azure Active Directory B2C authentifiziert. In diesem Fall sollte die App ein JWT-Bearertoken von mehreren Ausstellern akzeptieren.

Fügen Sie alle Authentifizierungsschemas hinzu, die Sie akzeptieren möchten. Der folgende Code in fügt beispielsweise Startup.ConfigureServices zwei JWT-Bearerauthentifizierungsschemas mit unterschiedlichen Ausstellern hinzu:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://localhost:5000/identity/";
        })
        .AddJwtBearer("AzureAD", options =>
        {
            options.Audience = "https://localhost:5000/";
            options.Authority = "https://login.microsoftonline.com/eb971100-6f99-4bdc-8611-1bc8edd7f436/";
        });
}

Hinweis

Beim Standardauthentifizierungsschema ist nur eine JWT-Bearerauthentifizierung JwtBearerDefaults.AuthenticationScheme registriert. Zusätzliche Authentifizierung muss mit einem eindeutigen Authentifizierungsschema registriert werden.

Der nächste Schritt besteht darin, die Standardautorisierungsrichtlinie so zu aktualisieren, dass beide Authentifizierungsschemas akzeptiert werden. Beispiel:

public void ConfigureServices(IServiceCollection services)
{
    // Code omitted for brevity

    services.AddAuthorization(options =>
    {
        var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
            JwtBearerDefaults.AuthenticationScheme,
            "AzureAD");
        defaultAuthorizationPolicyBuilder = 
            defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
        options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
    });
}

Da die Standardautorisierungsrichtlinie überschrieben wird, ist es möglich, das [Authorize] -Attribut in Controllern zu verwenden. Der Controller akzeptiert dann Anforderungen mit JWT, die vom ersten oder zweiten Aussteller ausgegeben werden.

Weitere Informationen finden Sie in diesem GitHub Problem bei der Verwendung mehrerer Authentifizierungsschemas.