zabezpečení Blazor WebAssembly hostované aplikace v ASP.NET Core s využitím Azure Active Directory B2C

tento článek popisuje, jak vytvořit hostované Blazor WebAssembly řešení , které pro ověřování používá Azure Active Directory (AAD) B2C .

registrace aplikací v AAD B2C a vytvoření řešení

Vytvoření tenanta

postupujte podle pokynů v kurzu: vytvoření klienta Azure Active Directory B2C k vytvoření tenanta AAD B2C. Hned po vytvoření nebo určení klienta, který se má použít, se vraťte k tomuto článku.

poznamenejte si instanci AAD B2C (například https://contoso.b2clogin.com/ , která obsahuje koncové lomítko). Instance je schéma a hostitel registrace aplikace Azure B2C, který najdete otevřením okna koncové body na stránce Registrace aplikací v Azure Portal.

Registrace aplikace API serveru

registrace aplikace AAD B2C pro aplikaci API serveru:

  1. v Azure Portal přejděte na Azure Active Directory . Na bočním panelu vyberte Registrace aplikací . Klikněte na tlačítko Nová registrace .
  2. zadejte název aplikace (například Blazor Server AAD B2C).
  3. U podporovaných typů účtů vyberte možnost více tenantů: účty v jakémkoli zprostředkovateli identity nebo adresáři organizace (pro ověřování uživatelů pomocí toků uživatelů) .
  4. Aplikace API serveru v tomto scénáři nevyžaduje identifikátor URI přesměrování , proto nechejte rozevírací seznam nastavený na Web a nezadávejte identifikátor URI přesměrování.
  5. Pokud používáte neověřenou doménu vydavatele, potvrďte, že > je vybrána oprávnění udělit souhlas správce k OpenID a oprávněním offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.
  6. Vyberte Zaregistrovat.

Zaznamenejte následující informace:

  • Aplikace API serveru ID aplikace (klienta) (například 41451fa7-82d9-4673-8fa5-69eff5a761fd )
  • AAD primární/Publisher/Tenant doména (například contoso.onmicrosoft.com ): doména je k dispozici jako Publisher doména v okně značky Azure Portal pro registrovanou aplikaci.

Ve vystavení rozhraní API:

  1. Vyberte Přidat obor.
  2. Vyberte Uložit a pokračovat.
  3. Zadejte název oboru (například API.Access ).
  4. Zadejte Zobrazovaný název souhlasu správce (například Access API ).
  5. Zadejte Popis souhlasu správce (například Allows the app to access server app API endpoints. ).
  6. Potvrďte, že je stav nastavený na povoleno.
  7. Vyberte Přidat obor.

Zaznamenejte následující informace:

  • Identifikátor URI ID aplikace (například, api://41451fa7-82d9-4673-8fa5-69eff5a761fd , https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd nebo vlastní hodnota, kterou jste zadali)
  • Název oboru (například API.Access )

Registrace klientské aplikace

registrace aplikace AAD B2C pro klientskou aplikaci:

  1. v Azure Portal přejděte na Azure Active Directory . Na bočním panelu vyberte Registrace aplikací . Klikněte na tlačítko Nová registrace .

  2. zadejte název aplikace (například Blazor AAD B2C klienta).

  3. U podporovaných typů účtů vyberte možnost více tenantů: účty v jakémkoli zprostředkovateli identity nebo adresáři organizace (pro ověřování uživatelů pomocí toků uživatelů) .

  4. Rozevírací seznam identifikátor URI pro přesměrování nastavte na JEDNOSTRÁNKOVOU aplikaci (Spa) a zadejte následující identifikátor URI pro přesměrování: https://localhost:{PORT}/authentication/login-callback . Výchozí port pro aplikaci běžící v systému Kestrel je 5001. Pokud je aplikace spuštěná na jiném Kestrel portu, použijte port aplikace. pro IIS Express se náhodně generovaný port pro aplikaci dá najít ve Server vlastnostech aplikace na panelu ladění . vzhledem k tomu, že aplikace v tomto okamžiku neexistuje a port IIS Express není znám, vraťte se k tomuto kroku po vytvoření aplikace a aktualizaci identifikátoru URI přesměrování. v části vytvoření aplikace se zobrazí zpráva s upozorněním, že IIS Express uživatelé chtějí aktualizovat identifikátor URI přesměrování.

  5. Pokud používáte neověřenou doménu vydavatele, potvrďte, že > je vybrána oprávnění udělit souhlas správce k OpenID a oprávněním offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.

  6. Vyberte Zaregistrovat.

  7. Poznamenejte si ID aplikace (klienta) (například 4369008b-21fa-427c-abaa-9b53bf58e538 ).

V > > aplikaci Single-Page konfigurace platformy ověřování (Spa):

  1. Ověřte, zda je identifikátor URI přesměrování k https://localhost:{PORT}/authentication/login-callback dispozici.
  2. U implicitního udělení zajistěte, aby se pro přístupové tokeny a tokeny ID nevybrali zaškrtávací políčka.
  3. Zbývající výchozí hodnoty pro aplikaci jsou pro toto prostředí přijatelné.
  4. Vyberte tlačítko Uložit.

V oprávněních rozhraní API:

  1. Vyberte Přidat oprávnění a potom Moje rozhraní API.
  2. ve sloupci název vyberte aplikace API serveru (například Blazor Server AAD B2C).
  3. Otevřete seznam rozhraní API .
  4. Povolte přístup k rozhraní API (například API.Access ).
  5. Vyberte Přidat oprávnění.
  6. Klikněte na tlačítko udělení souhlasu správce pro {Name} . Akci potvrďte výběrem Ano.

V Home > Azure AD B2C > toky uživatelů:

Vytvoření uživatelského toku pro registraci a přihlašování

Aby bylo možné vyplnit součást (), vyberte alespoň atribut uživatelské jméno zobrazení deklarací identit aplikace context.User.Identity.Name LoginDisplay Shared/LoginDisplay.razor .

Zaznamenejte si název uživatelského toku pro registraci a přihlašování vytvořený pro aplikaci (například B2C_1_signupsignin ).

Vytvoření aplikace

Zástupné symboly v následujícím příkazu nahraďte dříve zaznamenanými informacemi a spusťte příkaz v příkazovém prostředí:

dotnet new blazorwasm -au IndividualB2C --aad-b2c-instance "{AAD B2C INSTANCE}" --api-client-id "{SERVER API APP CLIENT ID}" --app-id-uri "{SERVER API APP ID URI}" --client-id "{CLIENT APP CLIENT ID}" --default-scope "{DEFAULT SCOPE}" --domain "{TENANT DOMAIN}" -ho -o {APP NAME} -ssp "{SIGN UP OR SIGN IN POLICY}"

Upozornění

Nepoužívejte pomlčky ( - ) v názvu aplikace {APP NAME} , které ruší vytváření identifikátoru aplikace OIDC. Logika v Blazor WebAssembly šabloně projektu používá název projektu pro identifikátor aplikace OIDC v konfiguraci řešení. Případy, kdy BlazorSample jsou přijatelné alternativy () nebo podtržítka ( Blazor_Sample ), jsou přijatelné. Další informace naleznete v tématu pomlčky v hostovaném Blazor WebAssembly názvu projektu break OIDC Security (dotnet/aspnetcore #35337).

Zástupný symbol Název Azure Portal Příklad
{AAD B2C INSTANCE} Instance https://contoso.b2clogin.com/ (zahrnuje koncové lomítko)
{APP NAME} BlazorSample
{CLIENT APP CLIENT ID} ID aplikace (klienta) pro Client aplikaci 4369008b-21fa-427c-abaa-9b53bf58e538
{DEFAULT SCOPE} Název oboru API.Access
{SERVER API APP CLIENT ID} ID aplikace (klienta) pro aplikaci Server API 41451fa7-82d9-4673-8fa5-69eff5a761fd
{SERVER API APP ID URI} Identifikátor URI ID aplikace† 41451fa7-82d9-4673-8fa5-69eff5a761fd
{SIGN UP OR SIGN IN POLICY} Tok uživatele pro registraci nebo přihlášení B2C_1_signupsignin1
{TENANT DOMAIN} primární/Publisher/Tenant doména contoso.onmicrosoft.com

†Blazor WebAssemblyŠablona automaticky přidá schéma api:// k argumentu identifikátoru URI ID aplikace předanému v dotnet new příkazu. Když zadáváte identifikátor URI ID aplikace pro {SERVER API APP ID URI} zástupný symbol, a pokud je schéma api:// , odeberte schéma ( api:// ) z argumentu, jak je uvedeno v příkladu v předchozí tabulce. Pokud identifikátor URI ID aplikace je vlastní hodnota nebo má jiné schéma (například https:// pro neověřenou doménu vydavatele podobnou této https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd ), je nutné ručně aktualizovat výchozí identifikátor URI oboru a api:// po Client Vytvoření aplikace pomocí šablony odebrat schéma. Další informace najdete v části Poznámka v části obory přístupového tokenu . Blazor WebAssemblyšablona může být v budoucí verzi ASP.NET Core změněna, aby vyřešila tyto scénáře. Další informace najdete v tématu dvojité schéma pro identifikátor URI ID aplikace pomocí Blazor šablony WASM (Hosted, Single org) (dotnet/aspnetcore #27417).

Umístění výstupu zadané s -o|--output možností vytvoří složku projektu, pokud neexistuje a bude součástí názvu aplikace. Nepoužívejte pomlčky ( - ) v názvu aplikace, které ruší vytváření identifikátoru aplikace OIDC (viz předchozí upozornění).

Poznámka

Rozsah nastavený v hostovaném Blazor WebAssembly řešení Blazor WebAssembly šablonou projektu může mít za následek opakované hostování identifikátoru URI ID aplikace. Potvrďte, že je obor konfigurovaný pro DefaultAccessTokenScopes kolekci v Program.cs aplikaci správný Client .

Poznámka

V Azure Portal Client je identifikátor URI pro přesměrování konfigurace platformy aplikace nakonfigurovaný pro port 5001 pro aplikace, které běží na Kestrel serveru s výchozími nastaveními.

pokud Client je aplikace spuštěná na náhodném IIS Express portu, můžete port pro aplikaci najít ve vlastnostech aplikace API serveru na panelu ladění .

Pokud port nebyl dříve nakonfigurovaný se Client známým portem aplikace, vraťte se k Client registraci aplikace v Azure Portal a aktualizujte identifikátor URI přesměrování pomocí správného portu.

Server Konfigurace aplikace

Tato část se týká Server aplikace řešení.

Ověřovací balíček

podpora ověřování a autorizace volání ASP.NET Core webových rozhraní api s Identity platformou Microsoft je poskytována Microsoft.Identity.Web balíčkem:

<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />

{VERSION}zástupný symbol představuje nejnovější stabilní verzi balíčku, která odpovídá verzi sdílené architektury aplikace a kterou najdete v historii verzí balíčku v galerii NuGet.

Server Aplikace hostovaného Blazor řešení vytvořeného z této Blazor WebAssembly šablony zahrnuje Microsoft.Identity.Web.UI balíček ve výchozím nastavení. Balíček přidává uživatelské rozhraní pro ověřování uživatelů ve webových aplikacích a nepoužívá ho Blazor rozhraní. Pokud Server aplikace nebude nikdy používána k ověřování uživatelů přímo, je bezpečné odebrat odkaz na balíček ze Server souboru projektu aplikace.

Podpora ověřovací služby

AddAuthenticationMetoda nastaví služby ověřování v rámci aplikace a nakonfiguruje obslužnou rutinu JWT nosiče jako výchozí metodu ověřování. AddMicrosoftIdentityWebApiMetoda konfiguruje služby pro ochranu webového rozhraní API pomocí platformy Microsoft Identity Platform v 2.0. Tato metoda očekává AzureAdB2C v konfiguraci aplikace oddíl s nezbytným nastavením pro inicializaci možností ověřování.

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAdB2C"));

UseAuthentication a UseAuthorization Ujistěte se, že:

  • Aplikace se pokusí analyzovat a ověřit tokeny příchozích požadavků.
  • Všechny žádosti o přístup k chráněnému prostředku bez správných přihlašovacích údajů selžou.
app.UseAuthentication();
app.UseAuthorization();

Uživatel. Identity . Jméno

Ve výchozím nastavení User.Identity.Name není naplněno.

Pokud chcete aplikaci nakonfigurovat tak, aby přijímala hodnotu z name typu deklarace:

Nastavení aplikace

appsettings.jsonSoubor obsahuje možnosti pro konfiguraci obslužné rutiny nosiče JWT používané k ověření přístupových tokenů.

{
  "AzureAdB2C": {
    "Instance": "https://{TENANT}.b2clogin.com/",
    "ClientId": "{SERVER API APP CLIENT ID}",
    "Domain": "{TENANT DOMAIN}",
    "SignUpSignInPolicyId": "{SIGN UP OR SIGN IN POLICY}"
  }
}

Příklad:

{
  "AzureAdB2C": {
    "Instance": "https://contoso.b2clogin.com/",
    "ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
    "Domain": "contoso.onmicrosoft.com",
    "SignUpSignInPolicyId": "B2C_1_signupsignin1",
  }
}

Kontroler WeatherForecast

Řadič WeatherForecast (Controllers/WeatherForecastController. cs) zpřístupňuje chráněné rozhraní API s [Authorize] atributem použitým pro kontroler. Je důležité si uvědomit, že:

  • [Authorize] Atribut v tomto řadiči rozhraní API je jediná věc, která chrání toto rozhraní API před neoprávněným přístupem.
  • [Authorize] Atribut použitý v Blazor WebAssembly aplikaci slouží pouze jako pomocný parametr aplikace, který by měl být uživatel autorizován, aby mohla aplikace správně fungovat.
[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        ...
    }
}

Client Konfigurace aplikace

Tato část se týká Client aplikace řešení.

Ověřovací balíček

Když je aplikace vytvořená tak, aby používala individuální účet B2C ( IndividualB2C ), aplikace automaticky obdrží odkaz na balíček pro knihovnu Microsoft Authentication Library ( Microsoft.Authentication.WebAssembly.Msal ). Balíček poskytuje sadu primitivních elementů, které aplikaci pomůžou ověřit uživatele a získat tokeny pro volání chráněných rozhraní API.

Pokud se do aplikace přidává ověřování, přidejte balíček do souboru projektu aplikace ručně:

<PackageReference Include="Microsoft.Authentication.WebAssembly.Msal" 
  Version="{VERSION}" />

pro zástupný text je k {VERSION} dispozici nejnovější stabilní verze balíčku, která odpovídá verzi sdílené architektury aplikace, v historii verzí balíčku na adrese NuGet. org.

Microsoft.Authentication.WebAssembly.MsalBalíček Microsoft.AspNetCore.Components.WebAssembly.Authentication do této aplikace přidá balíček.

Podpora ověřovací služby

Přidávají HttpClient se podpory pro instance, které zahrnují přístupové tokeny při vytváření žádostí na serverový projekt.

Program.cs:

builder.Services.AddHttpClient("{APP ASSEMBLY}.ServerAPI", client => 
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    .CreateClient("{APP ASSEMBLY}.ServerAPI"));

Zástupný symbol {APP ASSEMBLY} je název sestavení aplikace (například BlazorSample.Client ).

Podpora ověřování uživatelů je registrovaná v kontejneru služby s AddMsalAuthentication metodou rozšíření poskytovanou Microsoft.Authentication.WebAssembly.Msal balíčkem. Tato metoda nastavuje služby, které aplikace potřebuje k interakci se Identity zprostředkovatelem (IP).

Program.cs:

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

AddMsalAuthenticationMetoda přijímá zpětné volání ke konfiguraci parametrů požadovaných k ověření aplikace. hodnoty požadované pro konfiguraci aplikace lze získat z webu Azure Portal AAD konfiguraci při registraci aplikace.

Soubor zadal konfiguraci wwwroot/appsettings.json :

{
  "AzureAdB2C": {
    "Authority": "{AAD B2C INSTANCE}{TENANT DOMAIN}/{SIGN UP OR SIGN IN POLICY}",
    "ClientId": "{CLIENT APP CLIENT ID}",
    "ValidateAuthority": false
  }
}

V předchozí konfiguraci {AAD B2C INSTANCE} obsahuje koncové lomítko.

Příklad:

{
  "AzureAdB2C": {
    "Authority": "https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_signupsignin1",
    "ClientId": "4369008b-21fa-427c-abaa-9b53bf58e538",
    "ValidateAuthority": false
  }
}

Obory přístupového tokenu

Výchozí obory přístupového tokenu představují seznam oborů přístupového tokenu, které jsou:

  • Ve výchozím nastavení zahrnuty v žádosti o přihlášení.
  • Slouží ke zřízení přístupového tokenu hned po ověření.

všechny obory musí patřit do stejné aplikace na pravidla Azure Active Directory. Další obory je možné přidat pro další aplikace API podle potřeby:

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

Poznámka

Blazor WebAssemblyŠablona automaticky přidá schéma api:// k argumentu identifikátoru URI ID aplikace předanému v dotnet new příkazu. Při generování aplikace ze Blazor šablony projektupotvrďte, že hodnota výchozího oboru přístupového tokenu používá buď správnou hodnotu identifikátoru URI ID vlastní aplikace, kterou jste zadali v Azure Portal, nebo hodnotu s jedním z následujících formátů:

  • Pokud je doména vydavatele adresáře důvěryhodná, je výchozím oborem přístupového tokenu obvykle hodnota podobná následujícímu příkladu, kde API.Access je výchozí název oboru:

    options.ProviderOptions.DefaultAccessTokenScopes.Add(
        "api://41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
    

    Zkontrolujte hodnotu pro dvojité schéma ( api://api://... ). Pokud je k dispozici schéma typu Double, odeberte první api:// schéma z hodnoty.

  • Pokud je doména vydavatele adresáře nedůvěryhodná, je výchozím oborem přístupového tokenu obvykle hodnota podobná následujícímu příkladu, kde API.Access je výchozí název oboru:

    options.ProviderOptions.DefaultAccessTokenScopes.Add(
        "https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
    

    Zkontrolujte hodnotu pro další api:// schéma ( api://https://contoso.onmicrosoft.com/... ). Pokud je k api:// dispozici další schéma, odeberte api:// schéma z hodnoty.

Blazor WebAssemblyšablona může být v budoucí verzi ASP.NET Core změněna, aby vyřešila tyto scénáře. Další informace najdete v tématu dvojité schéma pro identifikátor URI ID aplikace pomocí Blazor šablony WASM (Hosted, Single org) (dotnet/aspnetcore #27417).

Určete další obory pomocí AdditionalScopesToConsent :

options.ProviderOptions.AdditionalScopesToConsent.Add("{ADDITIONAL SCOPE URI}");

Další informace najdete v následujících částech článku o dalších scénářích :

Režim přihlášení

Rozhraní je ve výchozím nastavení automaticky otevíraná okna přihlášení a přejde zpět na přesměrování režimu přihlášení, pokud nelze otevřít automaticky otevírané okno. Nakonfigurujte MSAL pro použití režimu přesměrování přihlášení nastavením LoginMode vlastnosti MsalProviderOptions na redirect :

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.LoginMode = "redirect";
});

Výchozí nastavení je popup a hodnota řetězce nerozlišuje velká a malá písmena.

Importovat soubor

Obor Microsoft.AspNetCore.Components.Authorization názvů je k dispozici v celé aplikaci prostřednictvím souboru _Imports.razor :

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}.Client
@using {APPLICATION ASSEMBLY}.Client.Shared

Indexová stránka

Stránka index page ( wwwroot/index.html ) obsahuje skript, který definuje AuthenticationService v jazyce JavaScript. AuthenticationService zpracovává podrobnosti nízké úrovně protokolu OIDC. Aplikace interně volá metody definované ve skriptu k provedení operací ověřování.

<script src="_content/Microsoft.Authentication.WebAssembly.Msal/
    AuthenticationService.js"></script>

Součást aplikace

AppSoučást ( App.razor ) je podobná App komponentě, kterou najdete v Blazor Server aplikacích:

  • Komponenta spravuje vystavení CascadingAuthenticationState AuthenticationState do zbytku aplikace.
  • AuthorizeRouteViewKomponenta zajistí, že aktuální uživatel má oprávnění pro přístup k dané stránce nebo jinak vykreslí RedirectToLogin součást.
  • RedirectToLoginKomponenta spravuje přesměrování neautorizovaných uživatelů na přihlašovací stránku.

v důsledku změn v rozhraní napříč verzemi ASP.NET Core se Razor App App.razor v této části nezobrazí značka pro komponentu (). Chcete-li zkontrolovat označení komponenty pro danou verzi, použijte některý z následujících přístupů:

  • vytvořte aplikaci zřízenou pro ověřování z výchozí Blazor WebAssembly šablony projektu pro verzi ASP.NET Core, kterou chcete použít. Zkontrolujte App součást ( App.razor ) ve vygenerované aplikaci.

  • Zkontrolujte App součást ( App.razor ) v referenčním zdroji.

    Poznámka

    dokumentace odkazuje na zdrojový odkaz na ASP.NET Core načtení main větve úložiště, která představuje aktuální vývoj jednotky produktu pro další verzi ASP.NET Core. Pokud chcete vybrat větev pro jinou verzi, vyberte ji pomocí rozevíracího seznamu větve přepínače nebo značky . vyberte například release/5.0 větev pro verzi ASP.NET Core 5,0.

Komponenta RedirectToLogin

RedirectToLoginSoučást ( Shared/RedirectToLogin.razor ):

  • Spravuje přesměrování neautorizovaných uživatelů na přihlašovací stránku.
  • Zachová aktuální adresu URL, ke které se uživatel pokouší získat přístup, aby se mohla vrátit na tuto stránku, pokud je ověření úspěšné.
@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo(
            $"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
    }
}

Komponenta LoginDisplay

LoginDisplaySoučást ( Shared/LoginDisplay.razor ) je vykreslena v MainLayout komponentě ( Shared/MainLayout.razor ) a spravuje následující chování:

  • Pro ověřené uživatele:
    • Zobrazí aktuální uživatelské jméno.
    • Nabízí tlačítko pro odhlášení od aplikace.
  • Pro anonymní uživatele nabízí možnost přihlásit se.
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject NavigationManager Navigation
@inject SignOutSessionStateManager SignOutManager

<AuthorizeView>
    <Authorized>
        Hello, @context.User.Identity.Name!
        <button class="nav-link btn btn-link" @onclick="BeginLogout">
            Log out
        </button>
    </Authorized>
    <NotAuthorized>
        <a href="authentication/login">Log in</a>
    </NotAuthorized>
</AuthorizeView>

@code {
    private async Task BeginLogout(MouseEventArgs args)
    {
        await SignOutManager.SetSignOutState();
        Navigation.NavigateTo("authentication/logout");
    }
}

Součást ověřování

Stránka vytvořená komponentou ( ) definuje trasy vyžadované Authentication pro zpracování různých fází Pages/Authentication.razor ověřování.

RemoteAuthenticatorViewKomponenta:

@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication

<RemoteAuthenticatorView Action="@Action" />

@code {
    [Parameter]
    public string Action { get; set; }
}

Komponenta FetchData

Tato FetchData součást ukazuje, jak:

  • Zřízení přístupového tokenu
  • Pomocí přístupového tokenu v serverové aplikaci zavolejte chráněné rozhraní API prostředků.

Tato @attribute [Authorize] direktiva indikuje Blazor WebAssembly autorizačnímu systému, že uživatel musí být autorizovaný, aby mohl navštívit tuto součást. Přítomnost atributu v Client aplikaci nebrání volání rozhraní API na serveru bez správných přihlašovacích údajů. Server [Authorize] K jejich správné ochraně musí aplikace také použít příslušné koncové body.

IAccessTokenProvider.RequestAccessToken postará o vyžadování přístupového tokenu, který se dá přidat do žádosti o volání rozhraní API. Pokud je token uložen v mezipaměti nebo služba může zřídit nový přístupový token bez zásahu uživatele, požadavek na token je úspěšný. V opačném případě požadavek tokenu selže s objektem AccessTokenNotAvailableException , který je zachycen v try-catch příkazu.

Aby bylo možné získat skutečný token, který se má zahrnout do žádosti, musí aplikace ověřit, jestli žádost proběhla úspěšně voláním tokenResult.TryGetToken(out var token) .

Pokud byl požadavek úspěšný, je proměnná tokenu naplněná přístupovým tokenem. AccessToken.ValueVlastnost tokenu zpřístupňuje řetězec literálu, který má být zahrnut v Authorization hlavičce požadavku.

Pokud se žádost nezdařila, protože se token nepodařilo zřídit bez zásahu uživatele, výsledek tokenu obsahuje adresu URL pro přesměrování. Když přejdete na tuto adresu URL, uživatel přejde na přihlašovací stránku a vrátí se zpátky na aktuální stránku po úspěšném ověření.

@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using {APP NAMESPACE}.Shared
@attribute [Authorize]
@inject HttpClient Http

...

@code {
    private WeatherForecast[] forecasts;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
    }
}

Spuštění aplikace

Spusťte aplikaci z projektu serveru. při použití Visual Studio se jedná o jednu z těchto akcí:

  • Nastavte rozevírací seznam projekty po spuštění na panelu nástrojů na aplikaci API serveru a vyberte tlačítko Spustit .
  • Vyberte projekt serveru v Průzkumník řešení a na panelu nástrojů vyberte tlačítko Spustit nebo spusťte aplikaci z nabídky ladění .

Vlastní toky uživatelů

Microsoft Authentication Library ( , NuGet ) ve výchozím nastavení nepodporuje Microsoft.Authentication.WebAssembly.Msal AAD B2C toky uživatelů. Vytváření vlastních toků uživatelů v kódu pro vývojáře

Další informace o tom, jak vytvořit výzvu pro vlastní tok uživatele, najdete v tématu Toky uživatelů v Azure Active Directory B2C.

Řešení potíží

Běžné chyby

  • Chybné konfigurace aplikace nebo Identity zprostředkovatele (IP)

    Nejčastější chyby jsou způsobené nesprávnou konfigurací. Tady je několik příkladů:

    • V závislosti na požadavcích scénáře brání chybějící nebo nesprávná autorita, instance, ID tenanta, doména tenanta, ID klienta nebo identifikátor URI přesměrování aplikaci v ověřování klientů.
    • Nesprávný obor přístupového tokenu brání klientům v přístupu ke koncovým bodům webového rozhraní API serveru.
    • Nesprávná nebo chybějící oprávnění rozhraní API serveru brání klientům v přístupu ke koncovým bodům webového rozhraní API serveru.
    • Spuštění aplikace na jiném portu, než je nakonfigurované v identifikátoru URI přesměrování Identity registrace aplikace poskytovatele.

    V částech s pokyny pro konfiguraci najdete příklady správné konfigurace. Pečlivě zkontrolujte každou část článku a zkontrolujte chybné konfigurace aplikace a IP adresy.

    Pokud se konfigurace zdá být správná:

    • Analýza aplikačních protokolů

    • Prozkoumejte síťový provoz mezi klientskou aplikací a IP adresou nebo serverovou aplikací pomocí vývojářských nástrojů prohlížeče. Ip adresa nebo serverová aplikace často vrátí klientovi přesnou chybovou zprávu nebo zprávu s vodítkem k příčině problému. Vývojářské nástroje najdete v následujících článcích:

    • Dekódujte obsah souboru JWT (JSON Web Token), který se používá k ověřování klienta nebo přístupu k webovému rozhraní API serveru v závislosti na tom, kde k problému dochází. Další informace najdete v tématu Kontrola obsahu souboru JSON WEB TOKEN (JWT).

    Dokumentační tým reaguje na zpětnou vazbu k dokumentům a chyby v článcích (otevřete problém v části Tato zpětná vazba na stránce), ale nemůže poskytovat podporu k produktům. Při řešení potíží s aplikací je k dispozici několik veřejných fór podpory. Doporučujeme postupovat následovně:

    Předchozí fóra nejsou vlastněna ani řízena společností Microsoft.

    V případě zpráv o chybách architektury bez zabezpečení, bez citlivosti a bez důvěrných reprodukovatelných architektur otevřete problém v ASP.NET Core produktové jednotce. Neotevřete problém s produktovou jednotkou, dokud pečlivě neprošetříte příčinu problému a nemůžete ho vyřešit sami a s pomocí komunity na veřejném fóru podpory. Produktová jednotka nemůže řešit potíže s jednotlivými aplikacemi, které jsou poškozené kvůli jednoduché chybné konfiguraci nebo případům použití zahrnujícím služby třetích stran. Pokud je sestava citlivá nebo důvěrná nebo popisuje potenciální chybu zabezpečení v produktu, kterou mohou útočníci zneužít, podívejte se na téma Hlášení problémů a chyb zabezpečení (dotnet/aspnetcore GitHub úložiště).

  • Neautorizovaný klient pro AAD

    info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Autorizace se nezdařila. Tyto požadavky nebyly splněny: DenyAnonymousAuthorizationRequirement: Vyžaduje ověřeného uživatele.

    Chyba zpětného volání přihlášení z AAD:

    • Chyba: unauthorized_client
    • Popis: AADB2C90058: The provided application is not configured to allow public clients.

    Řešení chyby:

    1. V Azure Portal přístup k manifestu aplikace.
    2. Nastavte allowPublicClient atribut na null nebo true .

Cookies a data lokality

CookieData webů a se mohou uchovat napříč aktualizacemi aplikací a interferovat s testováním a řešením potíží. Při provádění změn kódu aplikace, změn uživatelského účtu u poskytovatele nebo změn konfigurace aplikace zprostředkovatele vymažte následující:

  • Přihlášení cookie uživatele
  • Aplikace cookie
  • Uložená data lokality a uložená v mezipaměti

Jedním z přístupů, jak zabránit tomu, aby se při testování a řešení potíží přerušují cookie data lokality, je:

  • Konfigurace prohlížeče
    • Pro testování použijte prohlížeč, který můžete nakonfigurovat tak, aby při každém zavření prohlížeče odstranil všechna data a cookie data webu.
    • Ujistěte se, že je prohlížeč ručně zavřen nebo integrované vývojové prostředí (IDE) kvůli jakékoli změně konfigurace aplikace, testovacího uživatele nebo zprostředkovatele.
  • Pomocí vlastního příkazu otevřete prohlížeč v anonymním nebo privátním režimu v Visual Studio:
    • V dialogovém okně Procházet Visual Studio tlačítko Spustit.
    • Vyberte tlačítko Přidat.
    • Do pole Program zadejte cestu k prohlížeči. Následující spustitelné cesty jsou typická umístění instalace pro Windows 10. Pokud je váš prohlížeč nainstalovaný na jiném místě nebo pokud ho Windows 10, zadejte cestu ke spustitelnému souboru prohlížeče.
      • Microsoft Edge:C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • Do pole Argumenty zadejte možnost příkazového řádku, kterou prohlížeč používá k otevření v anonymním nebo privátním režimu. Některé prohlížeče vyžadují adresu URL aplikace.
      • Microsoft Edge: Použijte -inprivate .
      • Google Chrome: Použijte --incognito --new-window {URL} , kde zástupný symbol je adresa URL, která se má otevřít {URL} (například https://localhost:5001 ).
      • Mozilla Firefox: Použijte -private -url {URL} , kde zástupný symbol je adresa URL, která se má otevřít {URL} (například https://localhost:5001 ).
    • Do pole Popisný název zadejte název. Například, Firefox Auth Testing.
    • Vyberte tlačítko OK.
    • Pokud se chcete vyhnout výběru profilu prohlížeče pro každou iteraci testování pomocí aplikace, nastavte profil jako výchozí pomocí tlačítka Nastavit jako výchozí.
    • Ujistěte se, že integrované vývojové prostředí zavře prohlížeč kvůli jakékoli změně konfigurace aplikace, testovacího uživatele nebo zprostředkovatele.

Upgrady aplikací

Funkční aplikace může selhat okamžitě po upgradu .NET Core SDK na vývojovém počítači nebo změně verzí balíčků v rámci aplikace. V některých případech může při provádění významných upgradů dojít k přerušení aplikace v neschválených balíčcích. Většinu těchto problémů můžete vyřešit pomocí těchto pokynů:

  1. Vymažte mezipaměť balíčků NuGet systému spuštěním příkazu dotnet nuget locals all --clear z příkazového prostředí.
  2. Odstraňte složky a bin obj projektu.
  3. Obnovte a znovu sestavte projekt.
  4. Před znovunasazování aplikace odstraňte všechny soubory ve složce nasazení na serveru.

Poznámka

Použití verzí balíčků nekompatibilních s cílovou architekturou aplikace se nepodporuje. Pokud chcete získat informace o balíčku, použijte NuGet Gallery nebo FuGet Package Explorer.

Spuštění aplikace Server

Při testování hostovaného řešení a řešení souvisejících potíží se ujistěte, že aplikaci používáte Blazor z Server projektu. Například v Visual Studio před zahájením aplikace potvrďte, že je projekt Server zvýrazněný v Průzkumník řešení, a to pomocí libovolného z následujících přístupů:

  • Vyberte tlačítko Run (Spustit).
  • V nabídce > použijte Ladění spustit ladění.
  • Stiskněte klávesu F5.

Kontrola obsahu souboru JSON Web Token (JWT)

Pokud chcete dekódovat JSON Web Token (JWT), použijte nástroj jwt.ms Microsoftu. Hodnoty v uživatelském rozhraní nikdy neopustí váš prohlížeč.

Příklad kódovaného JWT (zkráceně pro zobrazení):

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q

Příklad JWT dekódovaný nástrojem pro aplikaci, která se ověřuje vůči Azure AAD B2C:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "exp": 1610059429,
  "nbf": 1610055829,
  "ver": "1.0",
  "iss": "https://mysiteb2c.b2clogin.com/5cc15ea8-a296-4aa3-97e4-226dcc9ad298/v2.0/",
  "sub": "5ee963fb-24d6-4d72-a1b6-889c6e2c7438",
  "aud": "70bde375-fce3-4b82-984a-b247d823a03f",
  "nonce": "b2641f54-8dc4-42ca-97ea-7f12ff4af871",
  "iat": 1610055829,
  "auth_time": 1610055822,
  "idp": "idp.com",
  "tfp": "B2C_1_signupsignin"
}.[Signature]

Další zdroje informací

tento článek popisuje, jak vytvořit hostované Blazor WebAssembly řešení , které pro ověřování používá Azure Active Directory (AAD) B2C .

registrace aplikací v AAD B2C a vytvoření řešení

Vytvoření tenanta

postupujte podle pokynů v kurzu: vytvoření klienta Azure Active Directory B2C k vytvoření tenanta AAD B2C. Hned po vytvoření nebo určení klienta, který se má použít, se vraťte k tomuto článku.

poznamenejte si instanci AAD B2C (například https://contoso.b2clogin.com/ , která obsahuje koncové lomítko). Instance je schéma a hostitel registrace aplikace Azure B2C, který najdete otevřením okna koncové body na stránce Registrace aplikací v Azure Portal.

Registrace aplikace API serveru

registrace aplikace AAD B2C pro aplikaci API serveru:

  1. v Azure Portal přejděte na Azure Active Directory . Na bočním panelu vyberte Registrace aplikací . Klikněte na tlačítko Nová registrace .
  2. zadejte název aplikace (například Blazor Server AAD B2C).
  3. U podporovaných typů účtů vyberte možnost více tenantů: účty v jakémkoli zprostředkovateli identity nebo adresáři organizace (pro ověřování uživatelů pomocí toků uživatelů) .
  4. Aplikace API serveru v tomto scénáři nevyžaduje identifikátor URI přesměrování , proto nechejte rozevírací seznam nastavený na Web a nezadávejte identifikátor URI přesměrování.
  5. Pokud používáte neověřenou doménu vydavatele, potvrďte, že > je vybrána oprávnění udělit souhlas správce k OpenID a oprávněním offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.
  6. Vyberte Zaregistrovat.

Zaznamenejte následující informace:

  • Aplikace API serveru ID aplikace (klienta) (například 41451fa7-82d9-4673-8fa5-69eff5a761fd )
  • AAD primární/Publisher/Tenant doména (například contoso.onmicrosoft.com ): doména je k dispozici jako Publisher doména v okně značky Azure Portal pro registrovanou aplikaci.

Ve vystavení rozhraní API:

  1. Vyberte Přidat obor.
  2. Vyberte Uložit a pokračovat.
  3. Zadejte název oboru (například API.Access ).
  4. Zadejte Zobrazovaný název souhlasu správce (například Access API ).
  5. Zadejte Popis souhlasu správce (například Allows the app to access server app API endpoints. ).
  6. Potvrďte, že je stav nastavený na povoleno.
  7. Vyberte Přidat obor.

Zaznamenejte následující informace:

  • Identifikátor URI ID aplikace (například, api://41451fa7-82d9-4673-8fa5-69eff5a761fd , https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd nebo vlastní hodnota, kterou jste zadali)
  • Název oboru (například API.Access )

Registrace klientské aplikace

registrace aplikace AAD B2C pro klientskou aplikaci:

  1. v Azure Portal přejděte na Azure Active Directory . Na bočním panelu vyberte Registrace aplikací . Klikněte na tlačítko Nová registrace .

  2. zadejte název aplikace (například Blazor AAD B2C klienta).

  3. U podporovaných typů účtů vyberte možnost více tenantů: účty v jakémkoli zprostředkovateli identity nebo adresáři organizace (pro ověřování uživatelů pomocí toků uživatelů) .

  4. Rozevírací seznam identifikátor URI pro přesměrování nastavte na JEDNOSTRÁNKOVOU aplikaci (Spa) a zadejte následující identifikátor URI pro přesměrování: https://localhost:{PORT}/authentication/login-callback . Výchozí port pro aplikaci běžící v systému Kestrel je 5001. Pokud je aplikace spuštěná na jiném Kestrel portu, použijte port aplikace. pro IIS Express se náhodně generovaný port pro aplikaci dá najít ve Server vlastnostech aplikace na panelu ladění . vzhledem k tomu, že aplikace v tomto okamžiku neexistuje a port IIS Express není znám, vraťte se k tomuto kroku po vytvoření aplikace a aktualizaci identifikátoru URI přesměrování. v části vytvoření aplikace se zobrazí zpráva s upozorněním, že IIS Express uživatelé chtějí aktualizovat identifikátor URI přesměrování.

  5. Pokud používáte neověřenou doménu vydavatele, potvrďte, že > je vybrána oprávnění udělit souhlas správce k OpenID a oprávněním offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.

  6. Vyberte Zaregistrovat.

  7. Poznamenejte si ID aplikace (klienta) (například 4369008b-21fa-427c-abaa-9b53bf58e538 ).

V > > aplikaci Single-Page konfigurace platformy ověřování (Spa):

  1. Ověřte, zda je identifikátor URI přesměrování k https://localhost:{PORT}/authentication/login-callback dispozici.
  2. U implicitního udělení zajistěte, aby se pro přístupové tokeny a tokeny ID nevybrali zaškrtávací políčka.
  3. Zbývající výchozí hodnoty pro aplikaci jsou pro toto prostředí přijatelné.
  4. Vyberte tlačítko Uložit.

V oprávněních rozhraní API:

  1. Vyberte Přidat oprávnění a potom Moje rozhraní API.
  2. ve sloupci název vyberte aplikace API serveru (například Blazor Server AAD B2C).
  3. Otevřete seznam rozhraní API .
  4. Povolte přístup k rozhraní API (například API.Access ).
  5. Vyberte Přidat oprávnění.
  6. Klikněte na tlačítko udělení souhlasu správce pro {Name} . Akci potvrďte výběrem Ano.

V Home > Azure AD B2C > toky uživatelů:

Vytvoření uživatelského toku pro registraci a přihlašování

Aby bylo možné vyplnit součást (), vyberte alespoň atribut uživatelské jméno zobrazení deklarací identit aplikace context.User.Identity.Name LoginDisplay Shared/LoginDisplay.razor .

Zaznamenejte si název uživatelského toku pro registraci a přihlašování vytvořený pro aplikaci (například B2C_1_signupsignin ).

Vytvoření aplikace

Zástupné symboly v následujícím příkazu nahraďte dříve zaznamenanými informacemi a spusťte příkaz v příkazovém prostředí:

dotnet new blazorwasm -au IndividualB2C --aad-b2c-instance "{AAD B2C INSTANCE}" --api-client-id "{SERVER API APP CLIENT ID}" --app-id-uri "{SERVER API APP ID URI}" --client-id "{CLIENT APP CLIENT ID}" --default-scope "{DEFAULT SCOPE}" --domain "{TENANT DOMAIN}" -ho -o {APP NAME} -ssp "{SIGN UP OR SIGN IN POLICY}"

Upozornění

Nepoužívejte pomlčky ( - ) v názvu aplikace {APP NAME} , které ruší vytváření identifikátoru aplikace OIDC. Logika v Blazor WebAssembly šabloně projektu používá název projektu pro identifikátor aplikace OIDC v konfiguraci řešení. Případy, kdy BlazorSample jsou přijatelné alternativy () nebo podtržítka ( Blazor_Sample ), jsou přijatelné. Další informace naleznete v tématu pomlčky v hostovaném Blazor WebAssembly názvu projektu break OIDC Security (dotnet/aspnetcore #35337).

Zástupný symbol Název Azure Portal Příklad
{AAD B2C INSTANCE} Instance https://contoso.b2clogin.com/
{APP NAME} BlazorSample
{CLIENT APP CLIENT ID} ID aplikace (klienta) pro Client aplikaci 4369008b-21fa-427c-abaa-9b53bf58e538
{DEFAULT SCOPE} Název oboru API.Access
{SERVER API APP CLIENT ID} ID aplikace (klienta) pro aplikaci Server API 41451fa7-82d9-4673-8fa5-69eff5a761fd
{SERVER API APP ID URI} Identifikátor URI ID aplikace† 41451fa7-82d9-4673-8fa5-69eff5a761fd
{SIGN UP OR SIGN IN POLICY} Tok uživatele pro registraci nebo přihlášení B2C_1_signupsignin1
{TENANT DOMAIN} primární/Publisher/Tenant doména contoso.onmicrosoft.com

†Blazor WebAssemblyŠablona automaticky přidá schéma api:// k argumentu identifikátoru URI ID aplikace předanému v dotnet new příkazu. Když zadáváte identifikátor URI ID aplikace pro {SERVER API APP ID URI} zástupný symbol, a pokud je schéma api:// , odeberte schéma ( api:// ) z argumentu, jak je uvedeno v příkladu v předchozí tabulce. Pokud identifikátor URI ID aplikace je vlastní hodnota nebo má jiné schéma (například https:// pro neověřenou doménu vydavatele podobnou této https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd ), je nutné ručně aktualizovat výchozí identifikátor URI oboru a api:// po Client Vytvoření aplikace pomocí šablony odebrat schéma. Další informace najdete v části Poznámka v části obory přístupového tokenu . Blazor WebAssemblyšablona může být v budoucí verzi ASP.NET Core změněna, aby vyřešila tyto scénáře. Další informace najdete v tématu dvojité schéma pro identifikátor URI ID aplikace pomocí Blazor šablony WASM (Hosted, Single org) (dotnet/aspnetcore #27417).

Umístění výstupu zadané s -o|--output možností vytvoří složku projektu, pokud neexistuje a bude součástí názvu aplikace. Nepoužívejte pomlčky ( - ) v názvu aplikace, které ruší vytváření identifikátoru aplikace OIDC (viz předchozí upozornění).

Poznámka

Rozsah nastavený v hostovaném Blazor WebAssembly řešení Blazor WebAssembly šablonou projektu může mít za následek opakované hostování identifikátoru URI ID aplikace. Potvrďte, že je obor konfigurovaný pro DefaultAccessTokenScopes kolekci v Program.cs aplikaci správný Client .

Poznámka

V Azure Portal Client je identifikátor URI pro přesměrování konfigurace platformy aplikace nakonfigurovaný pro port 5001 pro aplikace, které běží na Kestrel serveru s výchozími nastaveními.

pokud Client je aplikace spuštěná na náhodném IIS Express portu, můžete port pro aplikaci najít ve vlastnostech aplikace API serveru na panelu ladění .

Pokud port nebyl dříve nakonfigurovaný se Client známým portem aplikace, vraťte se k Client registraci aplikace v Azure Portal a aktualizujte identifikátor URI přesměrování pomocí správného portu.

Server Konfigurace aplikace

Tato část se týká Server aplikace řešení.

Ověřovací balíček

podpora ověřování a autorizace volání ASP.NET Core webových rozhraní api s Identity platformou Microsoft je poskytována Microsoft.Identity.Web balíčkem:

<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />

{VERSION}zástupný symbol představuje nejnovější stabilní verzi balíčku, která odpovídá verzi sdílené architektury aplikace a kterou najdete v historii verzí balíčku v galerii NuGet.

Server Aplikace hostovaného Blazor řešení vytvořeného z této Blazor WebAssembly šablony zahrnuje Microsoft.Identity.Web.UI balíček ve výchozím nastavení. Balíček přidává uživatelské rozhraní pro ověřování uživatelů ve webových aplikacích a nepoužívá ho Blazor rozhraní. Pokud Server aplikace nebude nikdy používána k ověřování uživatelů přímo, je bezpečné odebrat odkaz na balíček ze Server souboru projektu aplikace.

Podpora ověřovací služby

AddAuthenticationMetoda nastaví služby ověřování v rámci aplikace a nakonfiguruje obslužnou rutinu JWT nosiče jako výchozí metodu ověřování. AddMicrosoftIdentityWebApiMetoda konfiguruje služby pro ochranu webového rozhraní API pomocí platformy Microsoft Identity Platform v 2.0. Tato metoda očekává AzureAdB2C v konfiguraci aplikace oddíl s nezbytným nastavením pro inicializaci možností ověřování.

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAdB2C"));

UseAuthentication a UseAuthorization Ujistěte se, že:

  • Aplikace se pokusí analyzovat a ověřit tokeny příchozích požadavků.
  • Všechny žádosti o přístup k chráněnému prostředku bez správných přihlašovacích údajů selžou.
app.UseAuthentication();
app.UseAuthorization();

Uživatel. Identity . Jméno

Ve výchozím nastavení User.Identity.Name není naplněno.

Pokud chcete aplikaci nakonfigurovat tak, aby přijímala hodnotu z name typu deklarace:

Nastavení aplikace

appsettings.jsonSoubor obsahuje možnosti pro konfiguraci obslužné rutiny nosiče JWT používané k ověření přístupových tokenů.

{
  "AzureAdB2C": {
    "Instance": "https://{TENANT}.b2clogin.com/",
    "ClientId": "{SERVER API APP CLIENT ID}",
    "Domain": "{TENANT DOMAIN}",
    "SignUpSignInPolicyId": "{SIGN UP OR SIGN IN POLICY}"
  }
}

Příklad:

{
  "AzureAdB2C": {
    "Instance": "https://contoso.b2clogin.com/",
    "ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
    "Domain": "contoso.onmicrosoft.com",
    "SignUpSignInPolicyId": "B2C_1_signupsignin1",
  }
}

Kontroler WeatherForecast

Řadič WeatherForecast (Controllers/WeatherForecastController. cs) zpřístupňuje chráněné rozhraní API s [Authorize] atributem použitým pro kontroler. Je důležité si uvědomit, že:

  • [Authorize] Atribut v tomto řadiči rozhraní API je jediná věc, která chrání toto rozhraní API před neoprávněným přístupem.
  • [Authorize] Atribut použitý v Blazor WebAssembly aplikaci slouží pouze jako pomocný parametr aplikace, který by měl být uživatel autorizován, aby mohla aplikace správně fungovat.
[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        ...
    }
}

Client Konfigurace aplikace

Tato část se týká Client aplikace řešení.

Ověřovací balíček

Když je aplikace vytvořená tak, aby používala individuální účet B2C ( IndividualB2C ), aplikace automaticky obdrží odkaz na balíček pro knihovnu Microsoft Authentication Library ( Microsoft.Authentication.WebAssembly.Msal ). Balíček poskytuje sadu primitivních elementů, které aplikaci pomůžou ověřit uživatele a získat tokeny pro volání chráněných rozhraní API.

Pokud se do aplikace přidává ověřování, přidejte balíček do souboru projektu aplikace ručně:

<PackageReference Include="Microsoft.Authentication.WebAssembly.Msal" 
  Version="{VERSION}" />

pro zástupný text je k {VERSION} dispozici nejnovější stabilní verze balíčku, která odpovídá verzi sdílené architektury aplikace, v historii verzí balíčku na adrese NuGet. org.

Microsoft.Authentication.WebAssembly.MsalBalíček Microsoft.AspNetCore.Components.WebAssembly.Authentication do této aplikace přidá balíček.

Podpora ověřovací služby

Přidávají HttpClient se podpory pro instance, které zahrnují přístupové tokeny při vytváření žádostí na serverový projekt.

Program.cs:

builder.Services.AddHttpClient("{APP ASSEMBLY}.ServerAPI", client => 
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    .CreateClient("{APP ASSEMBLY}.ServerAPI"));

Zástupný symbol {APP ASSEMBLY} je název sestavení aplikace (například BlazorSample.Client ).

Podpora ověřování uživatelů je registrovaná v kontejneru služby s AddMsalAuthentication metodou rozšíření poskytovanou Microsoft.Authentication.WebAssembly.Msal balíčkem. Tato metoda nastavuje služby, které aplikace potřebuje k interakci se Identity zprostředkovatelem (IP).

Program.cs:

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

AddMsalAuthenticationMetoda přijímá zpětné volání ke konfiguraci parametrů požadovaných k ověření aplikace. hodnoty požadované pro konfiguraci aplikace lze získat z webu Azure Portal AAD konfiguraci při registraci aplikace.

Soubor zadal konfiguraci wwwroot/appsettings.json :

{
  "AzureAdB2C": {
    "Authority": "{AAD B2C INSTANCE}{TENANT DOMAIN}/{SIGN UP OR SIGN IN POLICY}",
    "ClientId": "{CLIENT APP CLIENT ID}",
    "ValidateAuthority": false
  }
}

Příklad:

{
  "AzureAdB2C": {
    "Authority": "https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_signupsignin1",
    "ClientId": "4369008b-21fa-427c-abaa-9b53bf58e538",
    "ValidateAuthority": false
  }
}

Obory přístupového tokenu

Výchozí obory přístupového tokenu představují seznam oborů přístupového tokenu, které jsou:

  • Ve výchozím nastavení zahrnuty v žádosti o přihlášení.
  • Slouží ke zřízení přístupového tokenu hned po ověření.

všechny obory musí patřit do stejné aplikace na pravidla Azure Active Directory. Další obory je možné přidat pro další aplikace API podle potřeby:

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

Poznámka

Blazor WebAssemblyŠablona automaticky přidá schéma api:// k argumentu identifikátoru URI ID aplikace předanému v dotnet new příkazu. Při generování aplikace ze Blazor šablony projektupotvrďte, že hodnota výchozího oboru přístupového tokenu používá buď správnou hodnotu identifikátoru URI ID vlastní aplikace, kterou jste zadali v Azure Portal, nebo hodnotu s jedním z následujících formátů:

  • Pokud je doména vydavatele adresáře důvěryhodná, je výchozím oborem přístupového tokenu obvykle hodnota podobná následujícímu příkladu, kde API.Access je výchozí název oboru:

    options.ProviderOptions.DefaultAccessTokenScopes.Add(
        "api://41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
    

    Zkontrolujte hodnotu pro dvojité schéma ( api://api://... ). Pokud je k dispozici schéma typu Double, odeberte první api:// schéma z hodnoty.

  • Pokud je doména vydavatele adresáře nedůvěryhodná, je výchozím oborem přístupového tokenu obvykle hodnota podobná následujícímu příkladu, kde API.Access je výchozí název oboru:

    options.ProviderOptions.DefaultAccessTokenScopes.Add(
        "https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
    

    Zkontrolujte hodnotu pro další api:// schéma ( api://https://contoso.onmicrosoft.com/... ). Pokud je k api:// dispozici další schéma, odeberte api:// schéma z hodnoty.

Blazor WebAssemblyšablona může být v budoucí verzi ASP.NET Core změněna, aby vyřešila tyto scénáře. Další informace najdete v tématu dvojité schéma pro identifikátor URI ID aplikace pomocí Blazor šablony WASM (Hosted, Single org) (dotnet/aspnetcore #27417).

Určete další obory pomocí AdditionalScopesToConsent :

options.ProviderOptions.AdditionalScopesToConsent.Add("{ADDITIONAL SCOPE URI}");

Další informace najdete v následujících částech článku o dalších scénářích :

Režim přihlášení

Rozhraní je ve výchozím nastavení automaticky otevíraná okna přihlášení a přejde zpět na přesměrování režimu přihlášení, pokud nelze otevřít automaticky otevírané okno. Nakonfigurujte MSAL pro použití režimu přesměrování přihlášení nastavením LoginMode vlastnosti MsalProviderOptions na redirect :

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.LoginMode = "redirect";
});

Výchozí nastavení je popup a hodnota řetězce nerozlišuje velká a malá písmena.

Importovat soubor

Obor Microsoft.AspNetCore.Components.Authorization názvů je k dispozici v celé aplikaci prostřednictvím souboru _Imports.razor :

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}.Client
@using {APPLICATION ASSEMBLY}.Client.Shared

Indexová stránka

Stránka index page ( wwwroot/index.html ) obsahuje skript, který definuje AuthenticationService v jazyce JavaScript. AuthenticationService zpracovává podrobnosti nízké úrovně protokolu OIDC. Aplikace interně volá metody definované ve skriptu k provedení operací ověřování.

<script src="_content/Microsoft.Authentication.WebAssembly.Msal/
    AuthenticationService.js"></script>

Součást aplikace

AppSoučást ( App.razor ) je podobná App komponentě, kterou najdete v Blazor Server aplikacích:

  • Komponenta spravuje vystavení CascadingAuthenticationState AuthenticationState do zbytku aplikace.
  • AuthorizeRouteViewKomponenta zajistí, že aktuální uživatel má oprávnění pro přístup k dané stránce nebo jinak vykreslí RedirectToLogin součást.
  • RedirectToLoginKomponenta spravuje přesměrování neautorizovaných uživatelů na přihlašovací stránku.

v důsledku změn v rozhraní napříč verzemi ASP.NET Core se Razor App App.razor v této části nezobrazí značka pro komponentu (). Chcete-li zkontrolovat označení komponenty pro danou verzi, použijte některý z následujících přístupů:

  • vytvořte aplikaci zřízenou pro ověřování z výchozí Blazor WebAssembly šablony projektu pro verzi ASP.NET Core, kterou chcete použít. Zkontrolujte App součást ( App.razor ) ve vygenerované aplikaci.

  • Zkontrolujte App součást ( App.razor ) v referenčním zdroji.

    Poznámka

    dokumentace odkazuje na zdrojový odkaz na ASP.NET Core načtení main větve úložiště, která představuje aktuální vývoj jednotky produktu pro další verzi ASP.NET Core. Pokud chcete vybrat větev pro jinou verzi, vyberte ji pomocí rozevíracího seznamu větve přepínače nebo značky . vyberte například release/5.0 větev pro verzi ASP.NET Core 5,0.

Komponenta RedirectToLogin

RedirectToLoginSoučást ( Shared/RedirectToLogin.razor ):

  • Spravuje přesměrování neautorizovaných uživatelů na přihlašovací stránku.
  • Zachová aktuální adresu URL, ke které se uživatel pokouší získat přístup, aby se mohla vrátit na tuto stránku, pokud je ověření úspěšné.
@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo(
            $"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
    }
}

Komponenta LoginDisplay

LoginDisplaySoučást ( Shared/LoginDisplay.razor ) je vykreslena v MainLayout komponentě ( Shared/MainLayout.razor ) a spravuje následující chování:

  • Pro ověřené uživatele:
    • Zobrazí aktuální uživatelské jméno.
    • Nabízí tlačítko pro odhlášení od aplikace.
  • Pro anonymní uživatele nabízí možnost přihlásit se.
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject NavigationManager Navigation
@inject SignOutSessionStateManager SignOutManager

<AuthorizeView>
    <Authorized>
        Hello, @context.User.Identity.Name!
        <button class="nav-link btn btn-link" @onclick="BeginLogout">
            Log out
        </button>
    </Authorized>
    <NotAuthorized>
        <a href="authentication/login">Log in</a>
    </NotAuthorized>
</AuthorizeView>

@code {
    private async Task BeginLogout(MouseEventArgs args)
    {
        await SignOutManager.SetSignOutState();
        Navigation.NavigateTo("authentication/logout");
    }
}

Součást ověřování

Stránka vytvořená komponentou ( ) definuje trasy vyžadované Authentication pro zpracování různých fází Pages/Authentication.razor ověřování.

RemoteAuthenticatorViewKomponenta:

@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication

<RemoteAuthenticatorView Action="@Action" />

@code {
    [Parameter]
    public string Action { get; set; }
}

Komponenta FetchData

Tato FetchData součást ukazuje, jak:

  • Zřízení přístupového tokenu
  • Pomocí přístupového tokenu v serverové aplikaci zavolejte chráněné rozhraní API prostředků.

Tato @attribute [Authorize] direktiva indikuje Blazor WebAssembly autorizačnímu systému, že uživatel musí být autorizovaný, aby mohl navštívit tuto součást. Přítomnost atributu v Client aplikaci nebrání volání rozhraní API na serveru bez správných přihlašovacích údajů. Server [Authorize] K jejich správné ochraně musí aplikace také použít příslušné koncové body.

IAccessTokenProvider.RequestAccessToken postará o vyžadování přístupového tokenu, který se dá přidat do žádosti o volání rozhraní API. Pokud je token uložen v mezipaměti nebo služba může zřídit nový přístupový token bez zásahu uživatele, požadavek na token je úspěšný. V opačném případě požadavek tokenu selže s objektem AccessTokenNotAvailableException , který je zachycen v try-catch příkazu.

Aby bylo možné získat skutečný token, který se má zahrnout do žádosti, musí aplikace ověřit, jestli žádost proběhla úspěšně voláním tokenResult.TryGetToken(out var token) .

Pokud byl požadavek úspěšný, je proměnná tokenu naplněná přístupovým tokenem. AccessToken.ValueVlastnost tokenu zpřístupňuje řetězec literálu, který má být zahrnut v Authorization hlavičce požadavku.

Pokud se žádost nezdařila, protože se token nepodařilo zřídit bez zásahu uživatele, výsledek tokenu obsahuje adresu URL pro přesměrování. Když přejdete na tuto adresu URL, uživatel přejde na přihlašovací stránku a vrátí se zpátky na aktuální stránku po úspěšném ověření.

@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using {APP NAMESPACE}.Shared
@attribute [Authorize]
@inject HttpClient Http

...

@code {
    private WeatherForecast[] forecasts;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
    }
}

Spuštění aplikace

Spusťte aplikaci z projektu serveru. při použití Visual Studio se jedná o jednu z těchto akcí:

  • Nastavte rozevírací seznam projekty po spuštění na panelu nástrojů na aplikaci API serveru a vyberte tlačítko Spustit .
  • Vyberte projekt serveru v Průzkumník řešení a na panelu nástrojů vyberte tlačítko Spustit nebo spusťte aplikaci z nabídky ladění .

Vlastní toky uživatelů

Microsoft Authentication Library ( , NuGet ) ve výchozím nastavení nepodporuje Microsoft.Authentication.WebAssembly.Msal AAD B2C toky uživatelů. Vytváření vlastních toků uživatelů v kódu pro vývojáře

Další informace o tom, jak vytvořit výzvu pro vlastní tok uživatele, najdete v tématu Toky uživatelů v Azure Active Directory B2C.

Řešení potíží

Běžné chyby

  • Chybné konfigurace aplikace nebo Identity zprostředkovatele (IP)

    Nejčastější chyby jsou způsobené nesprávnou konfigurací. Tady je několik příkladů:

    • V závislosti na požadavcích scénáře brání chybějící nebo nesprávná autorita, instance, ID tenanta, doména tenanta, ID klienta nebo identifikátor URI přesměrování aplikaci v ověřování klientů.
    • Nesprávný obor přístupového tokenu brání klientům v přístupu ke koncovým bodům webového rozhraní API serveru.
    • Nesprávná nebo chybějící oprávnění rozhraní API serveru brání klientům v přístupu ke koncovým bodům webového rozhraní API serveru.
    • Spuštění aplikace na jiném portu, než je nakonfigurované v identifikátoru URI přesměrování Identity registrace aplikace poskytovatele.

    V částech s pokyny pro konfiguraci najdete příklady správné konfigurace. Pečlivě zkontrolujte každou část článku a zkontrolujte chybné konfigurace aplikace a IP adresy.

    Pokud se konfigurace zdá být správná:

    • Analýza aplikačních protokolů

    • Prozkoumejte síťový provoz mezi klientskou aplikací a IP adresou nebo serverovou aplikací pomocí vývojářských nástrojů prohlížeče. Ip adresa nebo serverová aplikace často vrátí klientovi přesnou chybovou zprávu nebo zprávu s vodítkem k příčině problému. Vývojářské nástroje najdete v následujících článcích:

    • Dekódujte obsah souboru JWT (JSON Web Token), který se používá k ověřování klienta nebo přístupu k webovému rozhraní API serveru v závislosti na tom, kde k problému dochází. Další informace najdete v tématu Kontrola obsahu souboru JSON WEB TOKEN (JWT).

    Dokumentační tým reaguje na zpětnou vazbu k dokumentům a chyby v článcích (otevřete problém v části Tato zpětná vazba na stránce), ale nemůže poskytovat podporu k produktům. Při řešení potíží s aplikací je k dispozici několik veřejných fór podpory. Doporučujeme postupovat následovně:

    Předchozí fóra nejsou vlastněna ani řízena společností Microsoft.

    V případě zpráv o chybách architektury bez zabezpečení, bez citlivosti a bez důvěrných reprodukovatelných architektur otevřete problém v ASP.NET Core produktové jednotce. Neotevřete problém s produktovou jednotkou, dokud pečlivě neprošetříte příčinu problému a nemůžete ho vyřešit sami a s pomocí komunity na veřejném fóru podpory. Produktová jednotka nemůže řešit potíže s jednotlivými aplikacemi, které jsou poškozené kvůli jednoduché chybné konfiguraci nebo případům použití zahrnujícím služby třetích stran. Pokud je sestava citlivá nebo důvěrná nebo popisuje potenciální chybu zabezpečení v produktu, kterou mohou útočníci zneužít, podívejte se na téma Hlášení problémů a chyb zabezpečení (dotnet/aspnetcore GitHub úložiště).

  • Neautorizovaný klient pro AAD

    info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Autorizace se nezdařila. Tyto požadavky nebyly splněny: DenyAnonymousAuthorizationRequirement: Vyžaduje ověřeného uživatele.

    Chyba zpětného volání přihlášení z AAD:

    • Chyba: unauthorized_client
    • Popis: AADB2C90058: The provided application is not configured to allow public clients.

    Řešení chyby:

    1. V Azure Portal přístup k manifestu aplikace.
    2. Nastavte allowPublicClient atribut na null nebo true .

Cookies a data lokality

CookieData webů a se mohou uchovat napříč aktualizacemi aplikací a interferovat s testováním a řešením potíží. Při provádění změn kódu aplikace, změn uživatelského účtu u poskytovatele nebo změn konfigurace aplikace zprostředkovatele vymažte následující:

  • Přihlášení cookie uživatele
  • Aplikace cookie
  • Uložená data lokality a uložená v mezipaměti

Jedním z přístupů, jak zabránit tomu, aby se při testování a řešení potíží přerušují cookie data lokality, je:

  • Konfigurace prohlížeče
    • Pro testování použijte prohlížeč, který můžete nakonfigurovat tak, aby při každém zavření prohlížeče odstranil všechna data a cookie data webu.
    • Ujistěte se, že je prohlížeč ručně zavřen nebo integrované vývojové prostředí (IDE) kvůli jakékoli změně konfigurace aplikace, testovacího uživatele nebo zprostředkovatele.
  • Pomocí vlastního příkazu otevřete prohlížeč v anonymním nebo privátním režimu v Visual Studio:
    • V dialogovém okně Procházet Visual Studio tlačítko Spustit.
    • Vyberte tlačítko Přidat.
    • Do pole Program zadejte cestu k prohlížeči. Následující spustitelné cesty jsou typická umístění instalace pro Windows 10. Pokud je váš prohlížeč nainstalovaný na jiném místě nebo pokud ho Windows 10, zadejte cestu ke spustitelnému souboru prohlížeče.
      • Microsoft Edge:C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • Do pole Argumenty zadejte možnost příkazového řádku, kterou prohlížeč používá k otevření v anonymním nebo privátním režimu. Některé prohlížeče vyžadují adresu URL aplikace.
      • Microsoft Edge: Použijte -inprivate .
      • Google Chrome: Použijte --incognito --new-window {URL} , kde zástupný symbol je adresa URL, která se má otevřít {URL} (například https://localhost:5001 ).
      • Mozilla Firefox: Použijte -private -url {URL} , kde zástupný symbol je adresa URL, která se má otevřít {URL} (například https://localhost:5001 ).
    • Do pole Popisný název zadejte název. Například, Firefox Auth Testing.
    • Vyberte tlačítko OK.
    • Pokud se chcete vyhnout výběru profilu prohlížeče pro každou iteraci testování pomocí aplikace, nastavte profil jako výchozí pomocí tlačítka Nastavit jako výchozí.
    • Ujistěte se, že integrované vývojové prostředí zavře prohlížeč kvůli jakékoli změně konfigurace aplikace, testovacího uživatele nebo zprostředkovatele.

Upgrady aplikací

Funkční aplikace může selhat okamžitě po upgradu .NET Core SDK na vývojovém počítači nebo změně verzí balíčků v rámci aplikace. V některých případech může při provádění významných upgradů dojít k přerušení aplikace v neschválených balíčcích. Většinu těchto problémů můžete vyřešit pomocí těchto pokynů:

  1. Vymažte mezipaměť balíčků NuGet systému spuštěním příkazu dotnet nuget locals all --clear z příkazového prostředí.
  2. Odstraňte složky a bin obj projektu.
  3. Obnovte a znovu sestavte projekt.
  4. Před znovunasazování aplikace odstraňte všechny soubory ve složce nasazení na serveru.

Poznámka

Použití verzí balíčků nekompatibilních s cílovou architekturou aplikace se nepodporuje. Pokud chcete získat informace o balíčku, použijte NuGet Gallery nebo FuGet Package Explorer.

Spuštění aplikace Server

Při testování hostovaného řešení a řešení souvisejících potíží se ujistěte, že aplikaci používáte Blazor z Server projektu. Například v Visual Studio před zahájením aplikace potvrďte, že je projekt Server zvýrazněný v Průzkumník řešení, a to pomocí libovolného z následujících přístupů:

  • Vyberte tlačítko Run (Spustit).
  • V nabídce > použijte Ladění spustit ladění.
  • Stiskněte klávesu F5.

Kontrola obsahu souboru JSON Web Token (JWT)

Pokud chcete dekódovat JSON Web Token (JWT), použijte nástroj jwt.ms Microsoftu. Hodnoty v uživatelském rozhraní nikdy neopustí váš prohlížeč.

Příklad kódovaného JWT (zkráceně pro zobrazení):

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q

Příklad JWT dekódovaný nástrojem pro aplikaci, která se ověřuje vůči Azure AAD B2C:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "exp": 1610059429,
  "nbf": 1610055829,
  "ver": "1.0",
  "iss": "https://mysiteb2c.b2clogin.com/5cc15ea8-a296-4aa3-97e4-226dcc9ad298/v2.0/",
  "sub": "5ee963fb-24d6-4d72-a1b6-889c6e2c7438",
  "aud": "70bde375-fce3-4b82-984a-b247d823a03f",
  "nonce": "b2641f54-8dc4-42ca-97ea-7f12ff4af871",
  "iat": 1610055829,
  "auth_time": 1610055822,
  "idp": "idp.com",
  "tfp": "B2C_1_signupsignin"
}.[Signature]

Další zdroje informací

tento článek popisuje, jak vytvořit hostované Blazor WebAssembly řešení , které pro ověřování používá Azure Active Directory (AAD) B2C .

registrace aplikací v AAD B2C a vytvoření řešení

Vytvoření tenanta

postupujte podle pokynů v kurzu: vytvoření klienta Azure Active Directory B2C k vytvoření tenanta AAD B2C. Hned po vytvoření nebo určení klienta, který se má použít, se vraťte k tomuto článku.

poznamenejte si instanci AAD B2C (například https://contoso.b2clogin.com/ , která obsahuje koncové lomítko). Instance je schéma a hostitel registrace aplikace Azure B2C, který najdete otevřením okna koncové body na stránce Registrace aplikací v Azure Portal.

Registrace aplikace API serveru

registrace aplikace AAD B2C pro aplikaci API serveru:

  1. v Azure Portal přejděte na Azure Active Directory . Na bočním panelu vyberte Registrace aplikací . Klikněte na tlačítko Nová registrace .
  2. zadejte název aplikace (například Blazor Server AAD B2C).
  3. U podporovaných typů účtů vyberte možnost více tenantů: účty v jakémkoli zprostředkovateli identity nebo adresáři organizace (pro ověřování uživatelů pomocí toků uživatelů) .
  4. Aplikace API serveru v tomto scénáři nevyžaduje identifikátor URI přesměrování , proto nechejte rozevírací seznam nastavený na Web a nezadávejte identifikátor URI přesměrování.
  5. Pokud používáte neověřenou doménu vydavatele, potvrďte, že > je vybrána oprávnění udělit souhlas správce k OpenID a oprávněním offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.
  6. Vyberte Zaregistrovat.

Zaznamenejte následující informace:

  • Aplikace API serveru ID aplikace (klienta) (například 41451fa7-82d9-4673-8fa5-69eff5a761fd )
  • AAD primární/Publisher/Tenant doména (například contoso.onmicrosoft.com ): doména je k dispozici jako Publisher doména v okně značky Azure Portal pro registrovanou aplikaci.

Ve vystavení rozhraní API:

  1. Vyberte Přidat obor.
  2. Vyberte Uložit a pokračovat.
  3. Zadejte název oboru (například API.Access ).
  4. Zadejte Zobrazovaný název souhlasu správce (například Access API ).
  5. Zadejte Popis souhlasu správce (například Allows the app to access server app API endpoints. ).
  6. Potvrďte, že je stav nastavený na povoleno.
  7. Vyberte Přidat obor.

Zaznamenejte následující informace:

  • Identifikátor URI ID aplikace (například, api://41451fa7-82d9-4673-8fa5-69eff5a761fd , https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd nebo vlastní hodnota, kterou jste zadali)
  • Název oboru (například API.Access )

Registrace klientské aplikace

registrace aplikace AAD B2C pro klientskou aplikaci:

  1. v Azure Portal přejděte na Azure Active Directory . Na bočním panelu vyberte Registrace aplikací . Klikněte na tlačítko Nová registrace .
  2. Zadejte Název aplikace (například Blazor Client AAD B2C).
  3. V části Podporované typy účtů vyberte možnost více tenantů: Účty v libovolném zprostředkovateli identity nebo organizačním adresáři (pro ověřování uživatelů pomocí toků uživatelů).
  4. Ponechte rozevírací seznam Identifikátor URI pro přesměrování nastavený na Web a zadejte následující identifikátor URI přesměrování: https://localhost:{PORT}/authentication/login-callback . Výchozí port pro aplikaci běžící na Kestrel je 5001. Pokud je aplikace spuštěná na jiném Kestrel portu, použijte port aplikace. Například IIS Express náhodně generovaný port pro aplikaci najdete ve vlastnostech aplikace na Server panelu Ladění. Vzhledem k tomu, že aplikace v tuto chvíli neexistuje a port IIS Express není známý, vraťte se k tomuto kroku po vytvoření aplikace a aktualizujte identifikátor URI přesměrování. V části Vytvoření aplikace se zobrazí poznámka, která uživatelům IIS Express, aby identifikátor URI přesměrování aktualizovat.
  5. Pokud používáte neověřenou doménu vydavatele,ověřte, že je vybraná možnost Oprávnění Udělit souhlas správce s > openid offline_access oprávnění. Pokud je doména vydavatele ověřená, toto zaškrtávací políčko není k dispozici.
  6. Vyberte Zaregistrovat.

Zaznamente SI ID aplikace (klienta) (například 4369008b-21fa-427c-abaa-9b53bf58e538 ).

V části Konfigurace > platformy ověřování > Web:

  1. Ověřte, že je k dispozici identifikátor URI pro https://localhost:{PORT}/authentication/login-callback přesměrování.
  2. U implicitního udělení zaškrtněte políčka Přístupové tokeny a Tokeny ID.
  3. Zbývající výchozí hodnoty pro aplikaci jsou pro toto prostředí přijatelné.
  4. Vyberte tlačítko Uložit.

V části Oprávnění rozhraní API:

  1. Vyberte Přidat oprávnění a pak Moje rozhraní API.
  2. Ve sloupci Název vyberte aplikaci Server API (například Blazor Server AAD B2C).
  3. Otevřete seznam rozhraní API.
  4. Povolte přístup k rozhraní API (například API.Access ).
  5. Vyberte Přidat oprávnění.
  6. Vyberte tlačítko Udělit souhlas správce pro {NÁZEV TENANTA}. Akci potvrďte výběrem Ano.

V Home > Azure AD B2C > Toky uživatelů:

Vytvoření toku uživatelů pro přihlášení a přihlášení

Minimálně vyberte atribut uživatele Zobrazované jméno > deklarací identity aplikace a naplňte ho context.User.Identity.Name v LoginDisplay komponentě ( Shared/LoginDisplay.razor ).

Záznam názvu toku uživatele pro přihlášení a registrace vytvořeného pro aplikaci (například B2C_1_signupsignin ).

Vytvoření aplikace

Zástupné symboly v následujícím příkazu nahraďte dříve zaznamenaými informacemi a spusťte příkaz v příkazovém prostředí:

dotnet new blazorwasm -au IndividualB2C --aad-b2c-instance "{AAD B2C INSTANCE}" --api-client-id "{SERVER API APP CLIENT ID}" --app-id-uri "{SERVER API APP ID URI}" --client-id "{CLIENT APP CLIENT ID}" --default-scope "{DEFAULT SCOPE}" --domain "{TENANT DOMAIN}" -ho -o {APP NAME} -ssp "{SIGN UP OR SIGN IN POLICY}"

Upozornění

V názvu aplikace nepoužívejte pomlčky ( ), které naruší vytváření - {APP NAME} identifikátoru aplikace OIDC. Logika Blazor WebAssembly v šabloně projektu používá název projektu pro identifikátor aplikace OIDC v konfiguraci řešení. Přijatelné alternativy jsou case jazyka Pascal ( ) nebo podtržítka BlazorSample ( Blazor_Sample ). Další informace najdete v tématu Pomlčky v názvu hostovaného projektu, který přeruší zabezpečení Blazor WebAssembly OIDC (dotnet/aspnetcore #35337).

Zástupný symbol Azure Portal názvu Příklad
{AAD B2C INSTANCE} Instance https://contoso.b2clogin.com/
{APP NAME} BlazorSample
{CLIENT APP CLIENT ID} ID aplikace (klienta) Client pro aplikaci 4369008b-21fa-427c-abaa-9b53bf58e538
{DEFAULT SCOPE} Název oboru API.Access
{SERVER API APP CLIENT ID} ID aplikace (klienta) pro aplikaci Server API 41451fa7-82d9-4673-8fa5-69eff5a761fd
{SERVER API APP ID URI} Identifikátor URI ID aplikace† 41451fa7-82d9-4673-8fa5-69eff5a761fd
{SIGN UP OR SIGN IN POLICY} Tok uživatele registrace/přihlášení B2C_1_signupsignin1
{TENANT DOMAIN} Primární/Publisher/doména tenanta contoso.onmicrosoft.com

†Šablona Blazor WebAssembly automaticky přidá schéma do api:// argumentu identifikátoru URI ID aplikace předané v dotnet new příkazu . Při poskytování identifikátoru URI ID aplikace pro zástupný symbol a pokud je schéma , odeberte schéma ( ) z argumentu, jak ukazuje příklad {SERVER API APP ID URI} api:// hodnoty v předchozí api:// tabulce. Pokud je identifikátor URI ID aplikace vlastní hodnota nebo má nějaké jiné schéma (například pro neověřenou doménu vydavatele podobně jako ), musíte ručně aktualizovat výchozí identifikátor URI oboru a po vytvoření aplikace šablonou toto schéma https:// https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd api:// Client odebrat. Další informace najdete v poznámce v části Obory přístupového tokenu. Šablona Blazor WebAssembly může být změněna v budoucí verzi ASP.NET Core řešení těchto scénářů. Další informace najdete v tématu Dvojité schéma pro identifikátor URI ID aplikace s šablonou Blazor WASM (hostovaná, jedna organizace) (dotnet/aspnetcore #27417).

Výstupní umístění zadané pomocí možnosti vytvoří složku projektu, pokud neexistuje, a stane se součástí -o|--output názvu aplikace. V názvu aplikace nepoužívejte pomlčky ( ), které přeruší vytvoření identifikátoru aplikace - OIDC (viz předchozí upozornění).

Poznámka

V oboru nastaveném v hostovaném řešení šablonou projektu se může hostitel Blazor WebAssembly identifikátoru URI ID aplikace opakovat. Blazor WebAssembly Ověřte správnost oboru nakonfigurovaného pro kolekci v DefaultAccessTokenScopes Program.cs Client aplikaci.

Poznámka

V Azure Portal je identifikátor URI přesměrování konfigurace platformy aplikace nakonfigurovaný pro Client port 5001 pro aplikace, které běží na serveru s výchozím Kestrel nastavením.

Pokud se aplikace spustí na náhodném IIS Express portu, najdete port pro aplikaci ve vlastnostech aplikace serverového rozhraní API na Client panelu Ladění.

Pokud port nebyl nakonfigurovaný dříve se známým portem aplikace, vraťte se k registraci aplikace v Azure Portal a aktualizujte identifikátor URI přesměrování se správným Client Client portem.

Server konfigurace aplikace

Tato část se týká aplikace Server řešení.

Ověřovací balíček

Balíček poskytuje podporu ověřování a ověřování volání ASP.NET Core webových rozhraní Microsoft.AspNetCore.Authentication.AzureADB2C.UI API:

<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureADB2C.UI" 
  Version="{VERSION}" />

Pro zástupný symbol najdete nejnovější stabilní verzi balíčku, která odpovídá verzi sdílené architektury aplikace, v historii verzí balíčku na {VERSION} NuGet.org.

Podpora ověřovací služby

Metoda nastaví ověřovací služby v rámci aplikace a nakonfiguruje obslužnou rutinu AddAuthentication bearer JWT jako výchozí metodu ověřování. Metoda nastaví konkrétní parametry v obslužné rutině beareru JWT vyžadované k ověření tokenů vygenerované Azure Active Directory AddAzureADB2CBearer B2C:

services.AddAuthentication(AzureADB2CDefaults.BearerAuthenticationScheme)
    .AddAzureADB2CBearer(options => Configuration.Bind("AzureAdB2C", options));

UseAuthentication a UseAuthorization ujistěte se, že:

  • Aplikace se pokusí analyzovat a ověřovat tokeny u příchozích požadavků.
  • Všechny požadavky, které se pokoušejí o přístup k chráněnému prostředku bez správných přihlašovacích údajů, se nezdaří.
app.UseAuthentication();
app.UseAuthorization();

Uživatel. Identity . Jméno

Ve výchozím nastavení User.Identity.Name se hodnota nevyplní.

Konfigurace aplikace pro příjem hodnoty z typu name deklarace identity:

Nastavení aplikace

Soubor appsettings.json obsahuje možnosti konfigurace obslužné rutiny beareru JWT používané k ověření přístupových tokenů.

{
  "AzureAdB2C": {
    "Instance": "https://{TENANT}.b2clogin.com/",
    "ClientId": "{SERVER API APP CLIENT ID}",
    "Domain": "{TENANT DOMAIN}",
    "SignUpSignInPolicyId": "{SIGN UP OR SIGN IN POLICY}"
  }
}

Příklad:

{
  "AzureAdB2C": {
    "Instance": "https://contoso.b2clogin.com/",
    "ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
    "Domain": "contoso.onmicrosoft.com",
    "SignUpSignInPolicyId": "B2C_1_signupsignin1",
  }
}

Kontroler WeatherForecast

Kontroler WeatherForecast (Controllers/WeatherForecastController.cs) zpřístupňuje chráněné rozhraní API s atributem [Authorize] použitým na kontroler. Je důležité pochopit, že:

  • Atribut [Authorize] v tomto kontroleru rozhraní API je jedinou věcí, která chrání toto rozhraní API před neoprávněným přístupem.
  • Atribut [Authorize] použitý v aplikaci slouží pouze jako nápověda pro aplikaci, že uživatel by měl mít oprávnění k tomu, aby Blazor WebAssembly aplikace správně fungovala.
[Authorize]
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    [HttpGet]
    public IEnumerable<WeatherForecast> Get()
    {
        ...
    }
}

Client konfigurace aplikace

Tato část se týká aplikace Client řešení.

Ověřovací balíček

Když se vytvoří aplikace pro použití individuálního účtu B2C ( ), aplikace automaticky obdrží odkaz na balíček pro IndividualB2C Knihovnu ověřování Microsoftu ( Microsoft.Authentication.WebAssembly.Msal ). Balíček poskytuje sadu primitiv, které aplikaci pomáhají ověřovat uživatele a získávat tokeny pro volání chráněných rozhraní API.

Pokud přidáváte ověřování do aplikace, ručně přidejte balíček do souboru projektu aplikace:

<PackageReference Include="Microsoft.Authentication.WebAssembly.Msal" 
  Version="{VERSION}" />

Pro zástupný symbol najdete nejnovější stabilní verzi balíčku, která odpovídá verzi sdílené architektury aplikace, v historii verzí balíčku na {VERSION} NuGet.org.

Balíček Microsoft.Authentication.WebAssembly.Msal tranzitivně přidá Microsoft.AspNetCore.Components.WebAssembly.Authentication balíček do aplikace.

Podpora ověřovací služby

Přidá se podpora instancí, které při vytváření požadavků na serverový projekt zahrnují HttpClient přístupové tokeny.

Program.cs:

builder.Services.AddHttpClient("{APP ASSEMBLY}.ServerAPI", client => 
    client.BaseAddress = new Uri(builder.HostEnvironment.BaseAddress))
    .AddHttpMessageHandler<BaseAddressAuthorizationMessageHandler>();

builder.Services.AddScoped(sp => sp.GetRequiredService<IHttpClientFactory>()
    .CreateClient("{APP ASSEMBLY}.ServerAPI"));

Zástupný {APP ASSEMBLY} symbol je název sestavení aplikace (například BlazorSample.Client ).

Podpora ověřování uživatelů je zaregistrovaná v kontejneru služby pomocí AddMsalAuthentication metody rozšíření poskytované Microsoft.Authentication.WebAssembly.Msal balíčkem. Tato metoda nastaví služby potřebné pro interakci aplikace s Identity poskytovatelem (IP).

Program.cs:

builder.Services.AddMsalAuthentication(options =>
{
    builder.Configuration.Bind("AzureAdB2C", options.ProviderOptions.Authentication);
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

Metoda AddMsalAuthentication přijímá zpětné volání a konfiguruje parametry potřebné k ověření aplikace. Hodnoty vyžadované pro konfiguraci aplikace můžete získat z webu Azure Portal AAD konfigurace při registraci aplikace.

Konfigurace je dodána wwwroot/appsettings.json souborem:

{
  "AzureAdB2C": {
    "Authority": "{AAD B2C INSTANCE}{TENANT DOMAIN}/{SIGN UP OR SIGN IN POLICY}",
    "ClientId": "{CLIENT APP CLIENT ID}",
    "ValidateAuthority": false
  }
}

Příklad:

{
  "AzureAdB2C": {
    "Authority": "https://contoso.b2clogin.com/contoso.onmicrosoft.com/B2C_1_signupsignin1",
    "ClientId": "4369008b-21fa-427c-abaa-9b53bf58e538",
    "ValidateAuthority": false
  }
}

Rozsahy přístupových tokenů

Výchozí obory přístupového tokenu představují seznam oborů přístupových tokenů, které jsou:

  • Ve výchozím nastavení je součástí žádosti o přihlášení.
  • Slouží ke zřízení přístupového tokenu ihned po ověření.

Všechny obory musí patřit do stejné aplikace pro Azure Active Directory pravidla. Podle potřeby je možné přidat další obory pro další aplikace API:

builder.Services.AddMsalAuthentication(options =>
{
    ...
    options.ProviderOptions.DefaultAccessTokenScopes.Add("{SCOPE URI}");
});

Poznámka

Šablona Blazor WebAssembly automaticky přidá schéma do api:// argumentu identifikátoru URI ID aplikace předané v dotnet new příkazu . Při generování aplikace ze šablony projektu Blazor ověřte,že hodnota výchozího oboru přístupového tokenu používá buď správnou vlastní hodnotu identifikátoru URI ID aplikace, kterou jste za předpokladu Azure Portal, nebo hodnotu s jedním z následujících formátů:

  • Pokud je doména vydavatele adresáře důvěryhodná, výchozí obor přístupového tokenu je obvykle hodnota podobná následujícímu příkladu, kde API.Access je výchozí název oboru:

    options.ProviderOptions.DefaultAccessTokenScopes.Add(
        "api://41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
    

    Zkontrolujte hodnotu dvojitého schématu ( api://api://... ). Pokud je k dispozici dvojité schéma, odeberte api:// z hodnoty první schéma.

  • Pokud je doména vydavatele adresáře nedůvěryhodná, výchozí obor přístupového tokenu je obvykle hodnota podobná následujícímu příkladu, kde API.Access je výchozí název oboru:

    options.ProviderOptions.DefaultAccessTokenScopes.Add(
        "https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
    

    Zkontrolujte hodnotu pro dodatečné api:// schéma ( api://https://contoso.onmicrosoft.com/... ). Pokud je api:// k dispozici další schéma, api:// odeberte schéma z hodnoty.

Šablona Blazor WebAssembly může být změněna v budoucí verzi ASP.NET Core řešení těchto scénářů. Další informace najdete v tématu Dvojité schéma pro identifikátor URI ID aplikace s šablonou Blazor WASM (hostovaná, jedna organizace) (dotnet/aspnetcore #27417).

Pomocí zadejte další AdditionalScopesToConsent obory:

options.ProviderOptions.AdditionalScopesToConsent.Add("{ADDITIONAL SCOPE URI}");

Další informace najdete v následujících částech článku Další scénáře:

Soubor importů

Obor Microsoft.AspNetCore.Components.Authorization názvů je k dispozici v celé aplikaci prostřednictvím souboru _Imports.razor :

@using System.Net.Http
@using System.Net.Http.Json
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.Forms
@using Microsoft.AspNetCore.Components.Routing
@using Microsoft.AspNetCore.Components.Web
@using Microsoft.AspNetCore.Components.Web.Virtualization
@using Microsoft.AspNetCore.Components.WebAssembly.Http
@using Microsoft.JSInterop
@using {APPLICATION ASSEMBLY}.Client
@using {APPLICATION ASSEMBLY}.Client.Shared

Indexová stránka

Stránka index page ( wwwroot/index.html ) obsahuje skript, který definuje AuthenticationService v jazyce JavaScript. AuthenticationService zpracovává podrobnosti nízké úrovně protokolu OIDC. Aplikace interně volá metody definované ve skriptu k provedení operací ověřování.

<script src="_content/Microsoft.Authentication.WebAssembly.Msal/
    AuthenticationService.js"></script>

Komponenta aplikace

AppSoučást ( App.razor ) je podobná App komponentě, kterou najdete v Blazor Server aplikacích:

  • Komponenta spravuje vystavení CascadingAuthenticationState AuthenticationState do zbytku aplikace.
  • AuthorizeRouteViewKomponenta zajistí, že aktuální uživatel má oprávnění pro přístup k dané stránce nebo jinak vykreslí RedirectToLogin součást.
  • RedirectToLoginKomponenta spravuje přesměrování neautorizovaných uživatelů na přihlašovací stránku.

v důsledku změn v rozhraní napříč verzemi ASP.NET Core se Razor App App.razor v této části nezobrazí značka pro komponentu (). Chcete-li zkontrolovat označení komponenty pro danou verzi, použijte některý z následujících přístupů:

  • vytvořte aplikaci zřízenou pro ověřování z výchozí Blazor WebAssembly šablony projektu pro verzi ASP.NET Core, kterou chcete použít. Zkontrolujte App součást ( App.razor ) ve vygenerované aplikaci.

  • Zkontrolujte App součást ( App.razor ) v referenčním zdroji.

    Poznámka

    dokumentace odkazuje na zdrojový odkaz na ASP.NET Core načtení main větve úložiště, která představuje aktuální vývoj jednotky produktu pro další verzi ASP.NET Core. Pokud chcete vybrat větev pro jinou verzi, vyberte ji pomocí rozevíracího seznamu větve přepínače nebo značky . vyberte například release/5.0 větev pro verzi ASP.NET Core 5,0.

Komponenta RedirectToLogin

RedirectToLoginSoučást ( Shared/RedirectToLogin.razor ):

  • Spravuje přesměrování neautorizovaných uživatelů na přihlašovací stránku.
  • Zachová aktuální adresu URL, ke které se uživatel pokouší získat přístup, aby se mohla vrátit na tuto stránku, pokud je ověření úspěšné.
@inject NavigationManager Navigation
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@code {
    protected override void OnInitialized()
    {
        Navigation.NavigateTo(
            $"authentication/login?returnUrl={Uri.EscapeDataString(Navigation.Uri)}");
    }
}

Komponenta LoginDisplay

LoginDisplaySoučást ( Shared/LoginDisplay.razor ) je vykreslena v MainLayout komponentě ( Shared/MainLayout.razor ) a spravuje následující chování:

  • Pro ověřené uživatele:
    • Zobrazí aktuální uživatelské jméno.
    • Nabízí tlačítko pro odhlášení od aplikace.
  • Pro anonymní uživatele nabízí možnost přihlásit se.
@using Microsoft.AspNetCore.Components.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject NavigationManager Navigation
@inject SignOutSessionStateManager SignOutManager

<AuthorizeView>
    <Authorized>
        Hello, @context.User.Identity.Name!
        <button class="nav-link btn btn-link" @onclick="BeginLogout">
            Log out
        </button>
    </Authorized>
    <NotAuthorized>
        <a href="authentication/login">Log in</a>
    </NotAuthorized>
</AuthorizeView>

@code {
    private async Task BeginLogout(MouseEventArgs args)
    {
        await SignOutManager.SetSignOutState();
        Navigation.NavigateTo("authentication/logout");
    }
}

Ověřovací komponenta

Stránka vytvořená komponentou ( ) definuje trasy vyžadované Authentication pro zpracování různých fází Pages/Authentication.razor ověřování.

RemoteAuthenticatorViewKomponenta:

@page "/authentication/{action}"
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication

<RemoteAuthenticatorView Action="@Action" />

@code {
    [Parameter]
    public string Action { get; set; }
}

Komponenta FetchData

Tato FetchData součást ukazuje, jak:

  • Zřízení přístupového tokenu
  • Pomocí přístupového tokenu v serverové aplikaci zavolejte chráněné rozhraní API prostředků.

Tato @attribute [Authorize] direktiva indikuje Blazor WebAssembly autorizačnímu systému, že uživatel musí být autorizovaný, aby mohl navštívit tuto součást. Přítomnost atributu v Client aplikaci nebrání volání rozhraní API na serveru bez správných přihlašovacích údajů. Server [Authorize] K jejich správné ochraně musí aplikace také použít příslušné koncové body.

IAccessTokenProvider.RequestAccessToken postará o vyžadování přístupového tokenu, který se dá přidat do žádosti o volání rozhraní API. Pokud je token uložen v mezipaměti nebo služba může zřídit nový přístupový token bez zásahu uživatele, požadavek na token je úspěšný. V opačném případě požadavek tokenu selže s objektem AccessTokenNotAvailableException , který je zachycen v try-catch příkazu.

Aby bylo možné získat skutečný token, který se má zahrnout do žádosti, musí aplikace ověřit, jestli žádost proběhla úspěšně voláním tokenResult.TryGetToken(out var token) .

Pokud byl požadavek úspěšný, je proměnná tokenu naplněná přístupovým tokenem. AccessToken.ValueVlastnost tokenu zpřístupňuje řetězec literálu, který má být zahrnut v Authorization hlavičce požadavku.

Pokud se žádost nezdařila, protože se token nepodařilo zřídit bez zásahu uživatele, výsledek tokenu obsahuje adresu URL pro přesměrování. Když přejdete na tuto adresu URL, uživatel přejde na přihlašovací stránku a vrátí se zpátky na aktuální stránku po úspěšném ověření.

@page "/fetchdata"
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@using {APP NAMESPACE}.Shared
@attribute [Authorize]
@inject HttpClient Http

...

@code {
    private WeatherForecast[] forecasts;

    protected override async Task OnInitializedAsync()
    {
        try
        {
            forecasts = await Http.GetFromJsonAsync<WeatherForecast[]>("WeatherForecast");
        }
        catch (AccessTokenNotAvailableException exception)
        {
            exception.Redirect();
        }
    }
}

Spuštění aplikace

Spusťte aplikaci z projektu Server. Při použití Visual Studio:

  • V rozevíracím seznamu Projekty po spuštění na panelu nástrojů nastavte aplikaci Server API a vyberte tlačítko Spustit.
  • Vyberte projekt Server v Průzkumník řešení a na panelu nástrojů vyberte tlačítko Spustit nebo spusťte aplikaci z nabídky Ladit.

Vlastní toky uživatelů

Microsoft Authentication Library ( , NuGet ) ve výchozím nastavení nepodporuje Microsoft.Authentication.WebAssembly.Msal AAD B2C toky uživatelů. Vytváření vlastních toků uživatelů v kódu pro vývojáře

Další informace o tom, jak vytvořit výzvu pro vlastní tok uživatele, najdete v tématu Toky uživatelů v Azure Active Directory B2C.

Řešení potíží

Běžné chyby

  • Chybné konfigurace aplikace nebo Identity zprostředkovatele (IP)

    Nejčastější chyby jsou způsobené nesprávnou konfigurací. Tady je několik příkladů:

    • V závislosti na požadavcích scénáře brání chybějící nebo nesprávná autorita, instance, ID tenanta, doména tenanta, ID klienta nebo identifikátor URI přesměrování aplikaci v ověřování klientů.
    • Nesprávný obor přístupového tokenu brání klientům v přístupu ke koncovým bodům webového rozhraní API serveru.
    • Nesprávná nebo chybějící oprávnění rozhraní API serveru brání klientům v přístupu ke koncovým bodům webového rozhraní API serveru.
    • Spuštění aplikace na jiném portu, než je nakonfigurované v identifikátoru URI přesměrování Identity registrace aplikace poskytovatele.

    V částech s pokyny pro konfiguraci najdete příklady správné konfigurace. Pečlivě zkontrolujte každou část článku a zkontrolujte chybné konfigurace aplikace a IP adresy.

    Pokud se konfigurace zdá být správná:

    • Analýza aplikačních protokolů

    • Prozkoumejte síťový provoz mezi klientskou aplikací a IP adresou nebo serverovou aplikací pomocí vývojářských nástrojů prohlížeče. Ip adresa nebo serverová aplikace často vrátí klientovi přesnou chybovou zprávu nebo zprávu s vodítkem k příčině problému. Vývojářské nástroje najdete v následujících článcích:

    • Dekódujte obsah souboru JWT (JSON Web Token), který se používá k ověřování klienta nebo přístupu k webovému rozhraní API serveru v závislosti na tom, kde k problému dochází. Další informace najdete v tématu Kontrola obsahu souboru JSON WEB TOKEN (JWT).

    Dokumentační tým reaguje na zpětnou vazbu k dokumentům a chyby v článcích (otevřete problém v části Tato zpětná vazba na stránce), ale nemůže poskytovat podporu k produktům. Při řešení potíží s aplikací je k dispozici několik veřejných fór podpory. Doporučujeme postupovat následovně:

    Předchozí fóra nejsou vlastněna ani řízena společností Microsoft.

    V případě zpráv o chybách architektury bez zabezpečení, bez citlivosti a bez důvěrných reprodukovatelných architektur otevřete problém v ASP.NET Core produktové jednotce. Neotevřete problém s produktovou jednotkou, dokud pečlivě neprošetříte příčinu problému a nemůžete ho vyřešit sami a s pomocí komunity na veřejném fóru podpory. Produktová jednotka nemůže řešit potíže s jednotlivými aplikacemi, které jsou poškozené kvůli jednoduché chybné konfiguraci nebo případům použití zahrnujícím služby třetích stran. Pokud je sestava citlivá nebo důvěrná nebo popisuje potenciální chybu zabezpečení v produktu, kterou mohou útočníci zneužít, podívejte se na téma Hlášení problémů a chyb zabezpečení (dotnet/aspnetcore GitHub úložiště).

  • Neautorizovaný klient pro AAD

    info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Autorizace se nezdařila. Tyto požadavky nebyly splněny: DenyAnonymousAuthorizationRequirement: Vyžaduje ověřeného uživatele.

    Chyba zpětného volání přihlášení z AAD:

    • Chyba: unauthorized_client
    • Popis: AADB2C90058: The provided application is not configured to allow public clients.

    Řešení chyby:

    1. V Azure Portal přístup k manifestu aplikace.
    2. Nastavte allowPublicClient atribut na null nebo true .

Cookies a data lokality

CookieData webů a se mohou uchovat napříč aktualizacemi aplikací a interferovat s testováním a řešením potíží. Při provádění změn kódu aplikace, změn uživatelského účtu u poskytovatele nebo změn konfigurace aplikace zprostředkovatele vymažte následující:

  • Přihlášení cookie uživatele
  • Aplikace cookie
  • Uložená data lokality a uložená v mezipaměti

Jedním z přístupů, jak zabránit tomu, aby se při testování a řešení potíží přerušují cookie data lokality, je:

  • Konfigurace prohlížeče
    • Pro testování použijte prohlížeč, který můžete nakonfigurovat tak, aby při každém zavření prohlížeče odstranil všechna data a cookie data webu.
    • Ujistěte se, že je prohlížeč ručně zavřen nebo integrované vývojové prostředí (IDE) kvůli jakékoli změně konfigurace aplikace, testovacího uživatele nebo zprostředkovatele.
  • Pomocí vlastního příkazu otevřete prohlížeč v anonymním nebo privátním režimu v Visual Studio:
    • V dialogovém okně Procházet Visual Studio tlačítko Spustit.
    • Vyberte tlačítko Přidat.
    • Do pole Program zadejte cestu k prohlížeči. Následující spustitelné cesty jsou typická umístění instalace pro Windows 10. Pokud je váš prohlížeč nainstalovaný na jiném místě nebo pokud ho Windows 10, zadejte cestu ke spustitelnému souboru prohlížeče.
      • Microsoft Edge:C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • Do pole Argumenty zadejte možnost příkazového řádku, kterou prohlížeč používá k otevření v anonymním nebo privátním režimu. Některé prohlížeče vyžadují adresu URL aplikace.
      • Microsoft Edge: Použijte -inprivate .
      • Google Chrome: Použijte --incognito --new-window {URL} , kde zástupný symbol je adresa URL, která se má otevřít {URL} (například https://localhost:5001 ).
      • Mozilla Firefox: Použijte -private -url {URL} , kde zástupný symbol je adresa URL, která se má otevřít {URL} (například https://localhost:5001 ).
    • Do pole Popisný název zadejte název. Například, Firefox Auth Testing.
    • Vyberte tlačítko OK.
    • Pokud se chcete vyhnout výběru profilu prohlížeče pro každou iteraci testování pomocí aplikace, nastavte profil jako výchozí pomocí tlačítka Nastavit jako výchozí.
    • Ujistěte se, že integrované vývojové prostředí zavře prohlížeč kvůli jakékoli změně konfigurace aplikace, testovacího uživatele nebo zprostředkovatele.

Upgrady aplikací

Funkční aplikace může selhat okamžitě po upgradu .NET Core SDK na vývojovém počítači nebo změně verzí balíčků v rámci aplikace. V některých případech může při provádění významných upgradů dojít k přerušení aplikace v neschválených balíčcích. Většinu těchto problémů můžete vyřešit pomocí těchto pokynů:

  1. Vymažte mezipaměť balíčků NuGet systému spuštěním příkazu dotnet nuget locals all --clear z příkazového prostředí.
  2. Odstraňte složky a bin obj projektu.
  3. Obnovte a znovu sestavte projekt.
  4. Před znovunasazování aplikace odstraňte všechny soubory ve složce nasazení na serveru.

Poznámka

Použití verzí balíčků nekompatibilních s cílovou architekturou aplikace se nepodporuje. Pokud chcete získat informace o balíčku, použijte NuGet Gallery nebo FuGet Package Explorer.

Spuštění aplikace Server

Při testování hostovaného řešení a řešení souvisejících potíží se ujistěte, že aplikaci používáte Blazor z Server projektu. Například v Visual Studio před zahájením aplikace potvrďte, že je projekt Server zvýrazněný v Průzkumník řešení, a to pomocí libovolného z následujících přístupů:

  • Vyberte tlačítko Run (Spustit).
  • V nabídce > použijte Ladění spustit ladění.
  • Stiskněte klávesu F5.

Kontrola obsahu souboru JSON Web Token (JWT)

Pokud chcete dekódovat JSON Web Token (JWT), použijte nástroj jwt.ms Microsoftu. Hodnoty v uživatelském rozhraní nikdy neopustí váš prohlížeč.

Příklad kódovaného JWT (zkráceně pro zobrazení):

eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIsImtpZCI6Ilg1ZVhrNHh5b2pORnVtMWtsMll0djhkbE5QNC1j... bQdHBHGcQQRbW7Wmo6SWYG4V_bU55Ug_PW4pLPr20tTS8Ct7_uwy9DWrzCMzpD-EiwT5IjXwlGX3IXVjHIlX50IVIydBoPQtadvT7saKo1G5Jmutgq41o-dmz6-yBMKV2_nXA25Q

Příklad JWT dekódovaný nástrojem pro aplikaci, která se ověřuje vůči Azure AAD B2C:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dlNP4-c57dO6QGTVBwaNk"
}.{
  "exp": 1610059429,
  "nbf": 1610055829,
  "ver": "1.0",
  "iss": "https://mysiteb2c.b2clogin.com/5cc15ea8-a296-4aa3-97e4-226dcc9ad298/v2.0/",
  "sub": "5ee963fb-24d6-4d72-a1b6-889c6e2c7438",
  "aud": "70bde375-fce3-4b82-984a-b247d823a03f",
  "nonce": "b2641f54-8dc4-42ca-97ea-7f12ff4af871",
  "iat": 1610055829,
  "auth_time": 1610055822,
  "idp": "idp.com",
  "tfp": "B2C_1_signupsignin"
}.[Signature]

Další zdroje informací