Autorizace s konkrétním schématem v ASP.NET Core

Úvod do schémat ověřování v ASP.NET Core tématu Schéma ověřování.

V některých scénářích, jako jsou jedno stránkové aplikace (SPA), se běžně používá více metod ověřování. Aplikace se může například přihlašovat pomocí ověřování založeného na typu a ověřování cookie pomocí beareru JWT pro požadavky JavaScriptu. V některých případech může mít aplikace více instancí obslužné rutiny ověřování. Například dvě obslužné rutiny, kde jedna obsahuje základní identitu, a jedna se vytvoří při aktivaci vícefaktorového cookie ověřování (MFA). MFA se může aktivovat, protože uživatel požádal o operaci, která vyžaduje dodatečné zabezpečení. Další informace o vynucování MFA, když uživatel požádá o prostředek, který vyžaduje MFA, najdete v části GitHub problém s ověřováním pomocí MFA.

Schéma ověřování se jmenuje, když je ověřovací služba nakonfigurovaná během ověřování. Například:

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

V předchozím kódu byly přidány dvě obslužné rutiny ověřování: jedna pro s a jedna cookie pro bearer.

Poznámka

Zadáním výchozího schématu se vlastnost HttpContext.User nastaví na této identitě. Pokud toto chování není žádoucí, zakažte ho vyvoláním bezparametrové formy AddAuthentication .

Výběr schématu s atributem Authorize

V okamžiku autorizace aplikace indikuje obslužnou rutinu, která se má použít. Vyberte obslužnou rutinu, se kterou bude aplikace autorizovat, předáním seznamu schémat ověřování oddělených čárkami do [Authorize] . Atribut [Authorize] určuje schéma nebo schémata ověřování, která se mají použít bez ohledu na to, jestli je nakonfigurované výchozí nastavení. Například:

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

V předchozím příkladu se spustí obslužné rutiny a bearer a budou mít možnost vytvořit a připojit cookie identitu pro aktuálního uživatele. Když zadáte pouze jedno schéma, spustí se odpovídající obslužná rutina.

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

V předchozím kódu se spustí pouze obslužná rutina se schématem "Bearer". Všechny cookie identity založené na systému se ignorují.

Výběr schématu se zásadami

Pokud dáváte přednost zadání požadovaných schémat v zásadách, můžete kolekci nastavit AuthenticationSchemes při přidávání zásad:

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

V předchozím příkladu se zásada "Over18" spouští jenom s identitou vytvořenou obslužnou rutinou Bearer. Zásadu použijte nastavením [Authorize] vlastnosti Policy atributu:

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

Použití více schémat ověřování

Některé aplikace mohou potřebovat podporu více typů ověřování. Vaše aplikace může například ověřovat uživatele z Azure Active Directory a z databáze uživatelů. Dalším příkladem je aplikace, která ověřuje uživatele z Active Directory Federation Services (AD FS) i Azure Active Directory B2C. V takovém případě by aplikace měla přijmout token bearer JWT od několika vystavitelů.

Přidejte všechna schémata ověřování, která chcete přijmout. Například následující kód v nástroji přidává Startup.ConfigureServices dvě schémata ověřování bearer JWT s různými vystavitele:

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

Poznámka

Ve výchozím schématu ověřování je zaregistrované pouze jedno ověřování bearer JwtBearerDefaults.AuthenticationScheme JWT. Další ověřování musí být zaregistrované pomocí jedinečného schématu ověřování.

Dalším krokem je aktualizace výchozích zásad autorizace pro přijetí obou schémat ověřování. Například:

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

Vzhledem k tomu, že se přepíše výchozí zásada autorizace, je možné použít [Authorize] atribut v kontrolerů. Kontroler pak přijímá požadavky s JWT vydané prvním nebo druhým vystavitelem.

Tento problém GitHub s používáním více schémat ověřování.