Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Eine Einführung in Authentifizierungsschemas finden Sie unter Übersicht über ASP.NET Core Authentifizierung: Authentifizierungsschema.
In einigen Szenarien wie bei Single-Page-Apps (SPAs) ist es üblich, mehrere Authentifizierungsmethoden zu verwenden. Beispielsweise kann die App eine -basierte Authentifizierung verwenden cookie, um einen Benutzer bei einer App zu signieren und seine Identität und Bearer Authentifizierung (häufig auf JWTs vertrauen) für JavaScript-basierte Anforderungen an Web-API-Endpunkte einzurichten. In einigen Fällen verfügt die App möglicherweise über mehrere Instanzen eines Authentifizierungshandlers. Beispielsweise verfügt eine App über zwei cookie Handler, wobei eine eine grundlegende Identität enthält und eine erstellt wird, wenn eine mehrstufige Authentifizierung (Multi-Factor Authentication, MFA) ausgelöst wird. MFA kann ausgelöst werden, da Benutzer*innen einen Vorgang anfordern, der zusätzliche Sicherheit erfordert.
Für den folgenden AddAuthentication Aufruf ohne das angegebene Standardauthentifizierungsschema werden der App zwei Authentifizierungshandler mit ihren Standardauthentifizierungsschemanamen hinzugefügt:
- Cookie (Schemaname: "Cookies"): AddCookie
- JWT Bearer (Schemaname: "Bearer"): AddJwtBearer
builder.Services.AddAuthentication()
.AddCookie(options =>
{
options.LoginPath = "/Account/Unauthorized/";
options.AccessDeniedPath = "/Account/Forbidden/";
})
.AddJwtBearer(options =>
{
options.Audience = "http://localhost:5001/";
options.Authority = "http://localhost:5000/";
});
services.AddAuthentication()
.AddCookie(options => {
options.LoginPath = "/Account/Unauthorized/";
options.AccessDeniedPath = "/Account/Forbidden/";
})
.AddJwtBearer(options => {
options.Audience = "http://localhost:5001/";
options.Authority = "http://localhost:5000/";
});
Die Angabe des Standardschemas beim Aufrufen AddAuthentication führt dazu, dass die HttpContext.User Eigenschaft auf eine ClaimsPrincipal Eigenschaft festgelegt wird, die auf dieser Identität basiert. Wenn dieses Verhalten nicht gewünscht ist, rufen Sie die parameterlose Form von AddAuthentication, wie im vorherigen Beispiel gezeigt.
JWT Bearer NuGet-Paket
Mehrere Beispiele in diesem Artikel basieren auf der API im Microsoft.AspNetCore.Authentication.JwtBearer NuGet-Paket. Das Paket bietet Middleware, die die JSON-Webtokenauthentifizierung (JWT) erleichtert und die sichere Authentifizierung für APIs und Webdienste ermöglicht.
Auswählen eines Schemas mit einem [Authorize] Attribut
Eine App kann einen Authentifizierungshandler für Razor Komponenten, minimale API-Endpunkte, Controller, Aktionsmethoden, Razor Seiten und PageModels angeben, indem eine durch Trennzeichen getrennte Liste der Authentifizierungsschemas an das [Authorize] Attribut übergeben wird. Das Attribut gibt die Authentifizierungsschemas an, unabhängig davon, ob ein Standardschema konfiguriert ist. Im folgenden Beispiel werden die Cookies Authentifizierungsschemas (CookieAuthenticationDefaults.AuthenticationScheme) und Bearer (JwtBearerDefaults.AuthenticationScheme) festgelegt.
Note
In den folgenden Beispielen sind die folgenden Namespaces erforderlich: Microsoft.AspNetCore.Authorization, , Microsoft.AspNetCore.Authentication.Cookiesund Microsoft.AspNetCore.Authentication.JwtBearer.
Für eine Razor Komponente:
@attribute [Authorize(AuthenticationSchemes =
CookieAuthenticationDefaults.AuthenticationScheme + "," +
JwtBearerDefaults.AuthenticationScheme)]
Versehen Sie den Konstruktor für einen minimalen API-Endpunkt mit einem AuthorizeAttribute , um die Schemas festzulegen:
app.MapGet("/api/data", [Authorize(AuthenticationSchemes =
CookieAuthenticationDefaults.AuthenticationScheme + "," +
JwtBearerDefaults.AuthenticationScheme)] () =>
{
...
});
Alternativ können Sie die Schemas über eine benutzerdefinierte Richtlinie übergeben:
app.MapGet("/api/data", () =>
{
...
})
.RequireAuthorization(policy =>
policy.AddAuthenticationSchemes(
CookieAuthenticationDefaults.AuthenticationScheme + "," +
JwtBearerDefaults.AuthenticationScheme));
Für einen MVC-Controller:
[Authorize(AuthenticationSchemes = AuthSchemes)]
public class MixedAuthSchemesController : Controller
{
private const string AuthSchemes =
CookieAuthenticationDefaults.AuthenticationScheme + "," +
JwtBearerDefaults.AuthenticationScheme;
...
}
Für einen PageModel Kurs:
[Authorize(AuthenticationSchemes =
CookieAuthenticationDefaults.AuthenticationScheme + "," +
JwtBearerDefaults.AuthenticationScheme)]
public class MixedAuthSchemesModel : PageModel
{
...
}
Die Autorisierungs-Middleware genehmigt den Zugriff mit einem der angegebenen Schemas in der aufgeführten Reihenfolge. Wenn beide Schemas den Benutzer authentifizieren (ein gültiges cookie und ein gültiges Bearertoken vorhanden sind), führt Autorisierungs-Middleware die Identitäten in einem einzigen ClaimsPrincipal Kontext zusammen.
Durch Angeben eines einzelnen Schemas wird der entsprechende Handler ausgeführt. Im folgenden Beispiel werden nur der Handler mit dem Bearer Schema ausgeführt, und alle cookie-basierten Identitäten werden für den Endpunkt ignoriert:
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Authentication.JwtBearer
@attribute [Authorize(AuthenticationSchemes = JwtBearerDefaults.AuthenticationScheme)]
Auswählen des Schemas mit einer Autorisierungsrichtlinie
Wenn Sie die gewünschten Schemas in einer Richtlinie angeben möchten, legen Sie die AuthenticationSchemes Sammlung beim Hinzufügen der Richtlinie fest.
Im folgenden Beispiel wird die Over18 Richtlinie nur für die vom JWT Bearerhandler (JwtBearerDefaults.AuthenticationScheme) erstellte Identität ausgeführt. Ein Beispiel für die MinimumAgeRequirement im folgenden Beispiel verwendete Klasse finden Sie unter Richtlinienbasierte Autorisierung in ASP.NET Core. Die RequireAuthenticatedUser Methode erzwingt die Benutzerauthentifizierung an Endpunkten, auf die die Richtlinie angewendet wird.
Note
Im folgenden Beispiel ist der Microsoft.AspNetCore.Authentication.JwtBearer Namespace erforderlich.
builder.Services.AddAuthorizationBuilder()
.AddPolicy("Over18", policy =>
{
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
policy.Requirements.Add(new MinimumAgeRequirement(18));
});
builder.Services.AddAuthorization(options =>
{
options.AddPolicy("Over18", policy =>
{
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
policy.Requirements.Add(new MinimumAgeRequirement(18));
});
});
services.AddAuthorization(options =>
{
options.AddPolicy("Over18", policy =>
{
policy.AuthenticationSchemes.Add(JwtBearerDefaults.AuthenticationScheme);
policy.RequireAuthenticatedUser();
policy.Requirements.Add(new MinimumAgeRequirement());
});
});
Verwenden Sie die Richtlinie durch Festlegen AuthorizeAttribute.Policy.
Für eine Razor Komponente:
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "Over18")]
Rufen Sie RequireAuthorization für einen minimalen API-Endpunkt den Richtliniennamen auf:
app.MapGet("/api/data", () =>
{
...
})
.RequireAuthorization("Over18");
Für einen MVC-Controller:
[Authorize(Policy = "Over18")]
public class RegistrationController : Controller
Für einen PageModel Kurs:
[Authorize(Policy = "Over18")]
public class MixedAuthSchemesModel : PageModel
{
...
}
[Authorize] Attributschema- und Richtlinienschemainteraktion
Die Autorisierungsschemas für einen Endpunkt mit mindestens einem Authorize Attribut und einem oder mehreren richtlinienbasierten Schemas werden kombiniert , um den endgültigen Satz zulässiger Schemas für den Endpunkt festzulegen. Dies bildet eine Vereinigung, und jedes aufgelistete Schema kann die Anforderung authentifizieren. Ein Attribut, das Cookies zu einer Richtlinie hinzufügt, die auf Bearer die Authentifizierung beschränkt ist, ermöglicht eine cookie"-only"-Anforderung, vorausgesetzt, die cookie Erstellung einer ClaimsPrincipal erfüllung der Richtlinienanforderungen.
Verwenden mehrerer Authentifizierungsschemas
Einige Apps erfordern Unterstützung für mehrere Authentifizierungsmethoden. Ein typisches Szenario umfasst das Akzeptieren von Bearer-JWTs, die von mehreren Identitätsanbietern ausgestellt wurden.
Nur ein JWT Bearerhandler wird beim Standardauthentifizierungsschema JwtBearerDefaults.AuthenticationSchemeregistriert. Registrieren Sie zusätzliche Bearerschemas für zusätzliche JWT Identitätsanbieter mit eindeutigen Authentifizierungsschemanamen. Im folgenden Beispiel wird das zweite Schema "MEID" für den ME-ID Aussteller benannt.
Note
In den folgenden Beispielen sind die Microsoft.AspNetCore.Authorization Namespaces erforderlich Microsoft.AspNetCore.Authentication.JwtBearer .
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Audience = "https://localhost:5000/";
options.Authority = "https://localhost:5000/identity/";
})
.AddJwtBearer("MEID", options =>
{
options.Audience = "https://localhost:5000/";
options.Authority =
"https://sts.windows.net/00001111-aaaa-2222-bbbb-3333cccc4444/";
});
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.Audience = "https://localhost:5000/";
options.Authority = "https://localhost:5000/identity/";
})
.AddJwtBearer("MEID", options =>
{
options.Audience = "https://localhost:5000/";
options.Authority =
"https://sts.windows.net/00001111-aaaa-2222-bbbb-3333cccc4444/";
});
Aktualisieren Sie die Standardautorisierungsrichtlinie so, dass beide Authentifizierungsschemas akzeptiert werden:
var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme, "MEID");
defaultAuthorizationPolicyBuilder =
defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
builder.Services.AddAuthorizationBuilder()
.SetDefaultPolicy(defaultAuthorizationPolicyBuilder.Build());
builder.Services.AddAuthorization(options =>
{
var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme, "MEID");
defaultAuthorizationPolicyBuilder =
defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});
services.AddAuthorization(options =>
{
var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(
JwtBearerDefaults.AuthenticationScheme, "MEID");
defaultAuthorizationPolicyBuilder =
defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
});
Der vorangehende Code konfiguriert die Standardautorisierung mit Unterstützung für mehrere Authentifizierungsschemas:
Ein neuer AuthorizationPolicyBuilder Initialisiert einen Richtlinien-Generator, der die Authentifizierung von zwei Schemas akzeptiert:
- JwtBearerDefaults.AuthenticationScheme (JWT Bearertoken)
- "MEID" (das benutzerdefinierte Authentifizierungsschema für ME-ID, zuvor definiert)
Dies bedeutet, dass Benutzer sich mithilfe von JWT Token oder dem MEID-Schema authentifizieren können.
RequireAuthenticatedUser wird aufgerufen, um authentifizierte Benutzer für den Zugriff auf geschützte Endpunkte zu verlangen.
SetDefaultPolicy verkettet an AddAuthorizationBuilder:
- Registriert Autorisierungsdienste.
- Legt diese Richtlinie als Standard für alle
[Authorize]Attribute fest, die keine benutzerdefinierte Richtlinie angeben. Jeder endpunkt, der mit[Authorize]dieser Richtlinie gekennzeichnet ist, verwendet diese Richtlinie automatisch.
Das Ergebnis der Verwendung der vorherigen API ist, dass geschützte Endpunkte in der App eine JWT Authentifizierung über Bearertoken oder das MEID-Schema erfordern, was Flexibilität bei der Authentifizierung von Benutzern bietet.
Auswählen eines Richtlinienschemas basierend auf der Authorization Kopfzeile
Anleitungen zur Verwendung der Methode mit der AddPolicySchemeForwardDefaultSelector Eigenschaft zum dynamischen Auswählen eines Authentifizierungsschemas für jede Anforderung finden Sie unter Richtlinienschemas in ASP.NET Core.