Zabezpečení ASP.NET Core aplikace Blazor WebAssembly pomocí Azure Active Directory
Tento článek popisuje, jak vytvořit hostované Blazor WebAssembly řešení, které používá Azure Active Directory (AAD) pro ověřování.
Poznámka
Pro aplikace vytvořené v Visual Studio AAD, které jsou nakonfigurované pro podporu účtů v organizačním adresáři s platformou Microsoft, použijte k vytvoření aplikace se správnou konfigurací Azure Visual Studio verzi Blazor WebAssembly Identity 16.10 nebo novější. Pokud používáte verzi Visual Studio starší než 16.10, musíte po vygenerování **** aplikace ručně aktualizovat konfiguraci aplikace podle jednotlivých částí tohoto článku.
Registrace aplikací v AAD a vytvoření řešení
Vytvoření tenanta
Postupujte podle pokynů v tématu Rychlý start: Nastavení tenanta pro vytvoření tenanta v AAD.
Registrace serverové aplikace API
Registrace AAD pro aplikaci Server API:
- V Azure Active Directory přejděte na Azure Portal. Vyberte Registrace aplikací na bočním panelu. Vyberte tlačítko Nová registrace.
- Zadejte Název aplikace (například Blazor Server AAD).
- Zvolte podporované typy účtů. Pro toto prostředí můžete vybrat Účty pouze v tomto organizačním adresáři (jeden tenant).
- Aplikace Server API v tomto scénáři nevyžaduje identifikátor URI přesměrování, takže rozevírací seznam ponechte nastavený na Web a nezadávejte identifikátor URI přesměrování.
- Pokud používáte neověřenou doménu vydavatele,zrušte zaškrtnutí políčka Permissions Grant admin consent to openid and offline_access permissions (Udělit souhlas správce s openid a > offline_access oprávnění). Pokud je doména vydavatele ověřená, toto zaškrtávací políčko není k dispozici.
- Vyberte Zaregistrovat.
Zaznamente si následující informace:
- Serverová aplikace API ID aplikace (klienta) (například
41451fa7-82d9-4673-8fa5-69eff5a761fd) - ID adresáře (tenanta) (například
e86c78e2-8bb4-4c41-aefd-918e0565a45e) - AAD Primární/Publisher/doména tenanta (například ): Doména je k dispozici jako doména Publisher v okně
contoso.onmicrosoft.comBranding Azure Portal pro zaregistrovanou aplikaci.
V části Oprávnění rozhraní API odeberte oprávnění Microsoft Graph > User.Read, protože aplikace nevyžaduje přihlášení ani přístup k profilu uživatele.
V části Expose an API (Zveřejnit rozhraní API):
- Vyberte Přidat obor.
- Vyberte Uložit a pokračovat.
- Zadejte Název oboru (například
API.Access). - Zadejte zobrazované jméno souhlasu správce (například
Access API). - Zadejte popis souhlasu správce (například
Allows the app to access server app API endpoints.). - Ověřte, že stav je nastavený na Povoleno.
- Vyberte Přidat obor.
Zaznamente si následující informace:
- Identifikátor URI ID aplikace (například
api://41451fa7-82d9-4673-8fa5-69eff5a761fdhttps://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd, nebo vlastní hodnota, kterou poskytnete) - Název oboru (například
API.Access)
Registrace klientské aplikace
Registrace AAD aplikace pro klientskou aplikaci:
- V Azure Active Directory přejděte na Azure Portal. Vyberte Registrace aplikací na bočním panelu. Vyberte tlačítko Nová registrace.
- Zadejte Název aplikace (například Blazor Klientská AAD).
- Zvolte podporované typy účtů. Pro toto prostředí můžete vybrat Účty pouze v tomto organizačním adresáři (jeden tenant).
- V rozevíracím seznamu Identifikátor URI pro přesměrování nastavte Jedno stránkovanou aplikaci (SPA) 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 naServerpanelu 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. - Pokud používáte neověřenou doménu vydavatele,zrušte zaškrtnutí políčka Permissions Grant admin consent to openid and offline_access permissions (Udělit souhlas správce s openid a > offline_access oprávnění). Pokud je doména vydavatele ověřená, toto zaškrtávací políčko není k dispozici.
- Vyberte Zaregistrovat.
Client Zaznamente si ID aplikace (klienta) (například 4369008b-21fa-427c-abaa-9b53bf58e538 ).
V části Konfigurace > platformy ověřování jedno > stránková aplikace (SPA):
- Ověřte, že je k dispozici identifikátor URI pro
https://localhost:{PORT}/authentication/login-callbackpřesměrování. - V případě implicitního udělení se ujistěte, že nejsou zaškrtnuté políčko Přístupové tokeny a Tokeny ID.
- Zbývající výchozí hodnoty pro aplikaci jsou pro toto prostředí přijatelné.
- Vyberte tlačítko Uložit.
V části Oprávnění rozhraní API:
- Ověřte, že aplikace má oprávnění Microsoft Graph > User.Read.
- Vyberte Přidat oprávnění a pak Moje rozhraní API.
- Ve sloupci Název vyberte aplikaci Server API (například Blazor Server AAD).
- Otevřete seznam rozhraní API.
- Povolte přístup k rozhraní API (například
API.Access). - Vyberte Přidat oprávnění.
- Vyberte tlačítko Udělit souhlas správce pro {NÁZEV TENANTA}. Akci potvrďte výběrem Ano.
Vytvoření aplikace
V prázdné složce nahraďte zástupné symboly v následujícím příkazu dříve zaznamenané informace a spusťte příkaz v příkazovém prostředí:
dotnet new blazorwasm -au SingleOrg --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} --tenant-id "{TENANT ID}"
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 |
|---|---|---|
{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† |
{TENANT DOMAIN} |
Primární/Publisher/doména tenanta | contoso.onmicrosoft.com |
{TENANT ID} |
ID adresáře (tenanta) | e86c78e2-8bb4-4c41-aefd-918e0565a45e |
†Š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
Při použití tenanta Azure s neověřené domény vydavatele ,která je popsaná v části Nastavení aplikace, může být nutná změna konfigurace.
Poznámka
V Azure Portal je pro aplikace, které běží na serveru s výchozím nastavením, nakonfigurovaný identifikátor URI přesměrování konfigurace platformy aplikace pro Client port 5001. Kestrel
Pokud se aplikace spustí na náhodném IIS Express portu, najdete port pro aplikaci ve vlastnostech aplikace Server API na Client panelu Ladění.
Pokud port nebyl dříve nakonfigurovaný 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í ASP.NET Core webových rozhraní API pomocí Identity platformy Microsoft.Identity.Web Microsoft:
<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á AzureAd v konfiguraci aplikace oddíl s nezbytným nastavením pro inicializaci možností ověřování.
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));
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í Server rozhraní API aplikace naplní User.Identity.Name hodnotu z http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name typu deklarace (například 2d64b3da-d9d5-42c6-9352-53d8df33d770@contoso.onmicrosoft.com ).
Pokud chcete aplikaci nakonfigurovat tak, aby přijímala hodnotu z name typu deklarace:
Přidejte obor názvů pro Microsoft.AspNetCore.Authentication.JwtBearer
Program.cs:using Microsoft.AspNetCore.Authentication.JwtBearer;Nakonfigurujte TokenValidationParameters.NameClaimType JwtBearerOptions v
Program.cs:builder.Services.Configure<JwtBearerOptions>( JwtBearerDefaults.AuthenticationScheme, options => { options.TokenValidationParameters.NameClaimType = "name"; });
Nastavení aplikace
appsettings.jsonSoubor obsahuje možnosti pro konfiguraci obslužné rutiny nosiče JWT používané k ověření přístupových tokenů:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "{DOMAIN}",
"TenantId": "{TENANT ID}",
"ClientId": "{SERVER API APP CLIENT ID}",
"CallbackPath": "/signin-oidc"
}
}
Příklad:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "contoso.onmicrosoft.com",
"TenantId": "e86c78e2-8bb4-4c41-aefd-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
"CallbackPath": "/signin-oidc"
}
}
Při práci s rozhraním API serveru zaregistrovanou v AAD a registrace AAD aplikace je v tenantovi, který závisí na neověřené doméně vydavatele,identifikátor URI ID aplikace serverového rozhraní API není, ale je ve api://{SERVER API APP CLIENT ID OR CUSTOM VALUE} formátu https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE} . V takovém případě se výchozí obor přístupového tokenu v aplikaci bude podobá Program.cs Client následujícímu:
options.ProviderOptions.DefaultAccessTokenScopes
.Add("https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}/{DEFAULT SCOPE}");
Pokud chcete nakonfigurovat serverovou aplikaci API pro odpovídající cílovou skupinu, nastavte v souboru nastavení aplikace API ( ) tak, aby odpovídal cílové skupině aplikace poskytované Audience Server appsettings.json Azure Portal:
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/{TENANT ID}",
"ClientId": "{SERVER API APP CLIENT ID}",
"ValidateAuthority": true,
"Audience": "https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}"
}
}
V předchozí konfiguraci nezahrnuje konec Audience hodnoty výchozí obor /{DEFAULT SCOPE} .
Příklad:
V Program.cs Client aplikaci:
options.ProviderOptions.DefaultAccessTokenScopes
.Add("https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
Nakonfigurujte Server soubor nastavení aplikace API ( ) s odpovídající appsettings.json cílovou skupinou ( Audience ):
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/e86c78e2-...-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
"ValidateAuthority": true,
"Audience": "https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd"
}
}
V předchozím příkladu neobsahuje konec Audience hodnoty výchozí obor /API.Access .
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 pracovní nebo školní účty ( SingleOrg ), 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("AzureAd", 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 :
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/{TENANT ID}",
"ClientId": "{CLIENT APP CLIENT ID}",
"ValidateAuthority": true
}
}
Příklad:
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/e86c78e2-...-918e0565a45e",
"ClientId": "4369008b-21fa-427c-abaa-9b53bf58e538",
"ValidateAuthority": true
}
}
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.Accessje 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.Accessje 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 kapi://dispozici další schéma, odeberteapi://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í
RedirectToLoginsoučá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
Appsoučást (App.razor) ve vygenerované aplikaci.Zkontrolujte
Appsoučást (App.razor) v referenčním zdroji.Poznámka
dokumentace odkazuje na zdrojový odkaz na ASP.NET Core načtení
mainvě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říkladrelease/5.0vě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:
- Je poskytován
Microsoft.AspNetCore.Components.WebAssembly.Authenticationbalíčkem . - Spravuje provádění příslušných akcí v každé fázi ověřování.
@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í .
Ř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:
- Google Chrome (dokumentace Google)
- Microsoft Edge
- Mozilla Firefox (dokumentace Mozilla)
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:
- V Azure Portal přístup k manifestu aplikace.
- Nastavte
allowPublicClientatribut nanullnebotrue.
- Chyba:
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
- Microsoft Edge:
- 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říkladhttps://localhost:5001). - Mozilla Firefox: Použijte
-private -url {URL}, kde zástupný symbol je adresa URL, která se má otevřít{URL}(napříkladhttps://localhost:5001).
- Microsoft Edge: Použijte
- 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ů:
- Vymažte mezipaměť balíčků NuGet systému spuštěním příkazu
dotnet nuget locals all --clearz příkazového prostředí. - Odstraňte složky a
binobjprojektu. - Obnovte a znovu sestavte projekt.
- 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í
- Blazor WebAssemblyASP.NET Core další scénáře zabezpečení
- Sestavení vlastní verze knihovny pro ověřování. MSAL JavaScript
- Neověřené nebo neautorizované požadavky webového rozhraní API v aplikaci s zabezpečeným výchozím klientem
- ASP.NET Core Blazor WebAssembly s Azure Active Directorymi skupinami a rolemi
- Microsoft identity platform a Azure Active Directory s ASP.NET Core
- Dokumentace k platformě Microsoft Identity Platform
- Rychlý Start: registrace aplikace pomocí Microsoft identity platform
tento článek popisuje, jak vytvořit hostované Blazor WebAssembly řešení , které pro ověřování používá Azure Active Directory (AAD) .
Poznámka
pro Blazor WebAssembly aplikace vytvořené v Visual Studio, které jsou nakonfigurované pro podporu účtů v AAD organizačním adresáři s Identity platformou Microsoft, použijte Visual Studio verze 16,10 nebo novější, aby se vytvořila aplikace se správnou konfigurací Azure. pokud používáte verzi Visual Studio starší než 16,10, je po vytvoření aplikace nutné ručně aktualizovat konfiguraci aplikace podle každé části tohoto článku .
registrace aplikací v AAD a vytvoření řešení
Vytvoření tenanta
Postupujte podle pokynů v části rychlý Start: nastavení tenanta pro vytvoření tenanta v AAD.
Registrace aplikace API serveru
registrace aplikace AAD pro aplikaci API serveru:
- 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 .
- zadejte název aplikace (například Blazor Server AAD).
- Vyberte podporované typy účtů. Pro toto prostředí můžete vybrat účty pouze v tomto organizačním adresáři (jeden tenant).
- 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í.
- Pokud používáte neověřenou doménu vydavatele, zrušte zaškrtnutí políčka oprávnění > udělit souhlas správce oprávnění OpenID a offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.
- Vyberte Zaregistrovat.
Zaznamenejte následující informace:
- Aplikace API serveru ID aplikace (klienta) (například
41451fa7-82d9-4673-8fa5-69eff5a761fd) - ID adresáře (tenanta) (například
e86c78e2-8bb4-4c41-aefd-918e0565a45e) - AAD Primární/Publisher/doména tenanta (například ): Doména je k dispozici jako doména Publisher v okně
contoso.onmicrosoft.comBranding Azure Portal pro zaregistrovanou aplikaci.
V části Oprávnění rozhraní API odeberte oprávnění Microsoft Graph > User.Read, protože aplikace nevyžaduje přihlášení ani přístup k profilu uživatele.
V části Expose an API (Zveřejnit rozhraní API):
- Vyberte Přidat obor.
- Vyberte Uložit a pokračovat.
- Zadejte Název oboru (například
API.Access). - Zadejte zobrazované jméno souhlasu správce (například
Access API). - Zadejte popis souhlasu správce (například
Allows the app to access server app API endpoints.). - Ověřte, že stav je nastavený na Povoleno.
- Vyberte Přidat obor.
Zaznamente si následující informace:
- Identifikátor URI ID aplikace (například
api://41451fa7-82d9-4673-8fa5-69eff5a761fdhttps://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd, nebo vlastní hodnota, kterou poskytnete) - Název oboru (například
API.Access)
Registrace klientské aplikace
Registrace AAD aplikace pro klientskou aplikaci:
- V Azure Active Directory přejděte na Azure Portal. Vyberte Registrace aplikací na bočním panelu. Vyberte tlačítko Nová registrace.
- Zadejte Název aplikace (například Blazor Klientská AAD).
- Zvolte podporované typy účtů. Pro toto prostředí můžete vybrat Účty pouze v tomto organizačním adresáři (jeden tenant).
- V rozevíracím seznamu Identifikátor URI pro přesměrování nastavte Jedno stránkovanou aplikaci (SPA) 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 naServerpanelu 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. - Pokud používáte neověřenou doménu vydavatele,zrušte zaškrtnutí políčka Permissions > Grant admin consent to openid and offline_access permissions (Udělit souhlas správce s openid a offline_access oprávnění). Pokud je doména vydavatele ověřená, toto zaškrtávací políčko není k dispozici.
- Vyberte Zaregistrovat.
Client Zaznamente si ID aplikace (klienta) (například 4369008b-21fa-427c-abaa-9b53bf58e538 ).
V části Konfigurace > platformy ověřování jedno > stránková aplikace (SPA):
- Ověřte, že je k dispozici identifikátor URI pro
https://localhost:{PORT}/authentication/login-callbackpřesměrování. - V případě implicitního udělení se ujistěte, že nejsou zaškrtnuté políčko Přístupové tokeny a Tokeny ID.
- Zbývající výchozí hodnoty pro aplikaci jsou pro toto prostředí přijatelné.
- Vyberte tlačítko Uložit.
V části Oprávnění rozhraní API:
- Ověřte, že aplikace má oprávnění Microsoft Graph > User.Read.
- Vyberte Přidat oprávnění a pak Moje rozhraní API.
- Ve sloupci Název vyberte aplikaci Server API (například Blazor Server AAD).
- Otevřete seznam rozhraní API.
- Povolte přístup k rozhraní API (například
API.Access). - Vyberte Přidat oprávnění.
- Vyberte tlačítko Udělit souhlas správce pro {NÁZEV TENANTA}. Akci potvrďte výběrem Ano.
Vytvoření aplikace
V prázdné složce nahraďte zástupné symboly v následujícím příkazu dříve zaznamenané informace a spusťte příkaz v příkazovém prostředí:
dotnet new blazorwasm -au SingleOrg --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} --tenant-id "{TENANT ID}"
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 |
|---|---|---|
{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† |
{TENANT DOMAIN} |
Primární/Publisher/doména tenanta | contoso.onmicrosoft.com |
{TENANT ID} |
ID adresáře (tenanta) | e86c78e2-8bb4-4c41-aefd-918e0565a45e |
†Š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
Při použití tenanta Azure s neověřené domény vydavatele ,která je popsaná v části Nastavení aplikace, může být nutná změna konfigurace.
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í ASP.NET Core webových rozhraní API pomocí Identity platformy Microsoft.Identity.Web Microsoft:
<PackageReference Include="Microsoft.Identity.Web" Version="{VERSION}" />
Zástupný symbol představuje nejnovější stabilní verzi balíčku, která odpovídá verzi sdílené architektury aplikace, a najdete ji v historii verzí balíčku v NuGet {VERSION} Gallery.
Aplikace Server hostovaného řešení Blazor vytvořeného ze Blazor WebAssembly šablony obsahuje ve výchozím nastavení balíček Microsoft.Identity.Web.UI . Balíček přidá uživatelské rozhraní pro ověřování uživatelů ve webových aplikacích a není používán Blazor architekturou. Pokud se aplikace nikdy nebude používat k přímému ověřování uživatelů, je bezpečné odebrat odkaz na balíček ze souboru Server Server projektu aplikace.
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 AddMicrosoftIdentityWebApi konfiguruje služby pro ochranu webového rozhraní API pomocí platformy Microsoft Identity Platform v2.0. Tato metoda očekává oddíl v konfiguraci aplikace s potřebnými nastaveními pro AzureAd inicializaci možností ověřování.
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(Configuration.GetSection("AzureAd"));
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í Server se rozhraní API aplikace naplní User.Identity.Name hodnotou z typu deklarace http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name (například 2d64b3da-d9d5-42c6-9352-53d8df33d770@contoso.onmicrosoft.com ).
Konfigurace aplikace pro příjem hodnoty z typu name deklarace identity:
Přidejte obor názvů pro Microsoft.AspNetCore.Authentication.JwtBearer do
Startup.cs:using Microsoft.AspNetCore.Authentication.JwtBearer;Nakonfigurujte TokenValidationParameters.NameClaimType v JwtBearerOptions souboru
Startup.ConfigureServices:services.Configure<JwtBearerOptions>( JwtBearerDefaults.AuthenticationScheme, options => { options.TokenValidationParameters.NameClaimType = "name"; });
Nastavení aplikace
Soubor appsettings.json obsahuje možnosti konfigurace obslužné rutiny beareru JWT používané k ověření přístupových tokenů:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "{DOMAIN}",
"TenantId": "{TENANT ID}",
"ClientId": "{SERVER API APP CLIENT ID}",
"CallbackPath": "/signin-oidc"
}
}
Příklad:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "contoso.onmicrosoft.com",
"TenantId": "e86c78e2-8bb4-4c41-aefd-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
"CallbackPath": "/signin-oidc"
}
}
Při práci s rozhraním API serveru zaregistrovanou v AAD a registrace AAD aplikace je v tenantovi, který závisí na neověřené doméně vydavatele,identifikátor URI ID aplikace serverového rozhraní API není, ale je ve api://{SERVER API APP CLIENT ID OR CUSTOM VALUE} formátu https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE} . V takovém případě se výchozí obor přístupového tokenu v aplikaci bude podobá Program.cs Client následujícímu:
options.ProviderOptions.DefaultAccessTokenScopes
.Add("https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}/{DEFAULT SCOPE}");
Pokud chcete nakonfigurovat serverovou aplikaci API pro odpovídající cílovou skupinu, nastavte v souboru nastavení aplikace API ( ) tak, aby odpovídal cílové skupině aplikace poskytované Audience Server appsettings.json Azure Portal:
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/{TENANT ID}",
"ClientId": "{SERVER API APP CLIENT ID}",
"ValidateAuthority": true,
"Audience": "https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}"
}
}
V předchozí konfiguraci nezahrnuje konec Audience hodnoty výchozí obor /{DEFAULT SCOPE} .
Příklad:
V Program.cs Client aplikaci:
options.ProviderOptions.DefaultAccessTokenScopes
.Add("https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
Nakonfigurujte Server soubor nastavení aplikace API ( ) s odpovídající appsettings.json cílovou skupinou ( Audience ):
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/e86c78e2-...-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
"ValidateAuthority": true,
"Audience": "https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd"
}
}
V předchozím příkladu neobsahuje konec Audience hodnoty výchozí obor /API.Access .
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á Client aplikace řešení.
Ověřovací balíček
Když je aplikace vytvořená tak, aby používala pracovní nebo školní účty ( SingleOrg ), 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("AzureAd", 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 :
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/{TENANT ID}",
"ClientId": "{CLIENT APP CLIENT ID}",
"ValidateAuthority": true
}
}
Příklad:
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/e86c78e2-...-918e0565a45e",
"ClientId": "4369008b-21fa-427c-abaa-9b53bf58e538",
"ValidateAuthority": true
}
}
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.Accessje 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.Accessje 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 kapi://dispozici další schéma, odeberteapi://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í
RedirectToLoginsoučá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
Appsoučást (App.razor) ve vygenerované aplikaci.Zkontrolujte
Appsoučást (App.razor) v referenčním zdroji.Poznámka
dokumentace odkazuje na zdrojový odkaz na ASP.NET Core načtení
mainvě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říkladrelease/5.0vě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:
- Je poskytován
Microsoft.AspNetCore.Components.WebAssembly.Authenticationbalíčkem . - Spravuje provádění příslušných akcí v každé fázi ověřování.
@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í .
Ř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:
- Google Chrome (dokumentace Google)
- Microsoft Edge
- Mozilla Firefox (dokumentace Mozilla)
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:
- V Azure Portal přístup k manifestu aplikace.
- Nastavte
allowPublicClientatribut nanullnebotrue.
- Chyba:
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
- Microsoft Edge:
- 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říkladhttps://localhost:5001). - Mozilla Firefox: Použijte
-private -url {URL}, kde zástupný symbol je adresa URL, která se má otevřít{URL}(napříkladhttps://localhost:5001).
- Microsoft Edge: Použijte
- 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ů:
- Vymažte mezipaměť balíčků NuGet systému spuštěním příkazu
dotnet nuget locals all --clearz příkazového prostředí. - Odstraňte složky a
binobjprojektu. - Obnovte a znovu sestavte projekt.
- 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í
- Blazor WebAssemblyASP.NET Core další scénáře zabezpečení
- Sestavení vlastní verze knihovny pro ověřování. MSAL JavaScript
- Neověřené nebo neautorizované požadavky webového rozhraní API v aplikaci s zabezpečeným výchozím klientem
- ASP.NET Core Blazor WebAssembly s Azure Active Directorymi skupinami a rolemi
- Microsoft identity platform a Azure Active Directory s ASP.NET Core
- Dokumentace k platformě Microsoft Identity Platform
- Rychlý Start: registrace aplikace pomocí Microsoft identity platform
tento článek popisuje, jak vytvořit hostované Blazor WebAssembly řešení , které pro ověřování používá Azure Active Directory (AAD) .
registrace aplikací v AAD a vytvoření řešení
Vytvoření tenanta
Postupujte podle pokynů v části rychlý Start: nastavení tenanta pro vytvoření tenanta v AAD.
Registrace aplikace API serveru
registrace aplikace AAD pro aplikaci API serveru:
- 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 .
- zadejte název aplikace (například Blazor Server AAD).
- Vyberte podporované typy účtů. Pro toto prostředí můžete vybrat účty pouze v tomto organizačním adresáři (jeden tenant).
- 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í.
- Pokud používáte neověřenou doménu vydavatele, zrušte zaškrtnutí políčka oprávnění > udělit souhlas správce oprávnění OpenID a offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.
- Vyberte Zaregistrovat.
Zaznamenejte následující informace:
- Aplikace API serveru ID aplikace (klienta) (například
41451fa7-82d9-4673-8fa5-69eff5a761fd) - ID adresáře (tenanta) (například
e86c78e2-8bb4-4c41-aefd-918e0565a45e) - 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.
v okně oprávnění rozhraní API odeberte Microsoft Graph > uživatel. číst , protože aplikace nevyžaduje přihlášení ani přístup k profilu uživatele.
Ve vystavení rozhraní API:
- Vyberte Přidat obor.
- Vyberte Uložit a pokračovat.
- Zadejte název oboru (například
API.Access). - Zadejte Zobrazovaný název souhlasu správce (například
Access API). - Zadejte Popis souhlasu správce (například
Allows the app to access server app API endpoints.). - Potvrďte, že je stav nastavený na povoleno.
- 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-69eff5a761fdnebo vlastní hodnota, kterou zadáte) - Název oboru (například
API.Access)
Registrace klientské aplikace
registrace aplikace AAD pro klientskou aplikaci:
- 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 .
- Zadejte název aplikace (například Blazor AAD klienta).
- Vyberte podporované typy účtů. Pro toto prostředí můžete vybrat účty pouze v tomto organizačním adresáři (jeden tenant).
- Ponechte rozevírací seznam URI přesměrování nastavenou na Web 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 veServervlastnostech 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í. - Pokud používáte neověřenou doménu vydavatele, zrušte zaškrtnutí políčka oprávnění > udělit souhlas správce oprávnění OpenID a offline_access . Pokud je ověřena doména vydavatele, toto zaškrtávací políčko není k dispozici.
- Vyberte Zaregistrovat.
Poznamenejte si Client ID aplikace (klienta) aplikace (například 4369008b-21fa-427c-abaa-9b53bf58e538 ).
Na webu konfigurace ověřovacích > platforem > Web:
- Ověřte, zda je identifikátor URI přesměrování k
https://localhost:{PORT}/authentication/login-callbackdispozici. - Pro implicitní udělení vyberte zaškrtávací políčka pro přístupové tokeny a tokeny ID.
- Zbývající výchozí hodnoty pro aplikaci jsou pro toto prostředí přijatelné.
- Vyberte tlačítko Uložit.
V oprávněních rozhraní API:
- potvrďte, že aplikace má Microsoft Graph > oprávnění uživatel. číst .
- Vyberte Přidat oprávnění a potom Moje rozhraní API.
- ve sloupci název vyberte aplikace API serveru (například Blazor Server AAD).
- Otevřete seznam rozhraní API .
- Povolte přístup k rozhraní API (například
API.Access). - Vyberte Přidat oprávnění.
- Klikněte na tlačítko udělení souhlasu správce pro {Name} . Akci potvrďte výběrem Ano.
Vytvoření aplikace
V prázdné složce Nahraďte zástupné symboly v následujícím příkazu informacemi zaznamenanými dříve a spusťte příkaz v příkazovém prostředí:
dotnet new blazorwasm -au SingleOrg --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} --tenant-id "{TENANT ID}"
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 |
|---|---|---|
{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† |
{TENANT DOMAIN} |
primární/Publisher/Tenant doména | contoso.onmicrosoft.com |
{TENANT ID} |
ID adresáře (tenanta) | e86c78e2-8bb4-4c41-aefd-918e0565a45e |
†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
Změna konfigurace může být nutná při použití tenanta Azure s neověřenou doménou vydavatele, která je popsaná v části obory přístupového tokenu .
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 je zajištěna Microsoft.AspNetCore.Authentication.AzureAD.UI balíčkem:
<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI"
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.
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í. AddAzureADBearerMetoda nastavuje konkrétní parametry v obslužné rutině JWT nosiče vyžadované k ověření tokenů vygenerovaných Azure Active Directory:
services.AddAuthentication(AzureADDefaults.BearerAuthenticationScheme)
.AddAzureADBearer(options => Configuration.Bind("AzureAd", options));
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í Server rozhraní API aplikace naplní User.Identity.Name hodnotu z http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name typu deklarace (například 2d64b3da-d9d5-42c6-9352-53d8df33d770@contoso.onmicrosoft.com ).
Pokud chcete aplikaci nakonfigurovat tak, aby přijímala hodnotu z name typu deklarace:
Přidejte obor názvů pro Microsoft.AspNetCore.Authentication.JwtBearer
Startup.cs:using Microsoft.AspNetCore.Authentication.JwtBearer;Nakonfigurujte TokenValidationParameters.NameClaimType JwtBearerOptions v
Startup.ConfigureServices:services.Configure<JwtBearerOptions>( AzureADDefaults.JwtBearerAuthenticationScheme, options => { options.TokenValidationParameters.NameClaimType = "name"; });
Nastavení aplikace
appsettings.jsonSoubor obsahuje možnosti pro konfiguraci obslužné rutiny nosiče JWT používané k ověření přístupových tokenů:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "{DOMAIN}",
"TenantId": "{TENANT ID}",
"ClientId": "{SERVER API APP CLIENT ID}",
}
}
Příklad:
{
"AzureAd": {
"Instance": "https://login.microsoftonline.com/",
"Domain": "contoso.onmicrosoft.com",
"TenantId": "e86c78e2-8bb4-4c41-aefd-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
}
}
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 pracovní nebo školní účty ( SingleOrg ), 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("AzureAd", 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 :
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/{TENANT ID}",
"ClientId": "{CLIENT APP CLIENT ID}",
"ValidateAuthority": true
}
}
Příklad:
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/e86c78e2-...-918e0565a45e",
"ClientId": "4369008b-21fa-427c-abaa-9b53bf58e538",
"ValidateAuthority": true
}
}
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.Accessje 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.Accessje 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 jeapi://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}");
Při práci s rozhraním API serveru zaregistrovanou v AAD a registrace AAD aplikace je v tenantovi, který závisí na neověřené doméně vydavatele,identifikátor URI ID aplikace serverového rozhraní API není, ale je ve api://{SERVER API APP CLIENT ID OR CUSTOM VALUE} formátu https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE} . V takovém případě se výchozí obor přístupového tokenu v aplikaci bude podobá Program.cs Client následujícímu:
options.ProviderOptions.DefaultAccessTokenScopes
.Add("https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}/{DEFAULT SCOPE}");
Pokud chcete nakonfigurovat serverovou aplikaci API pro odpovídající cílovou skupinu, nastavte v souboru nastavení aplikace API ( ) tak, aby odpovídal cílové skupině aplikace poskytované Audience Server appsettings.json Azure Portal:
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/{TENANT ID}",
"ClientId": "{SERVER API APP CLIENT ID}",
"ValidateAuthority": true,
"Audience": "https://{TENANT}.onmicrosoft.com/{SERVER API APP CLIENT ID OR CUSTOM VALUE}"
}
}
V předchozí konfiguraci nezahrnuje konec Audience hodnoty výchozí obor /{DEFAULT SCOPE} .
Příklad:
V Program.cs Client aplikaci:
options.ProviderOptions.DefaultAccessTokenScopes
.Add("https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd/API.Access");
Nakonfigurujte Server soubor nastavení aplikace API ( ) s odpovídající appsettings.json cílovou skupinou ( Audience ):
{
"AzureAd": {
"Authority": "https://login.microsoftonline.com/e86c78e2-...-918e0565a45e",
"ClientId": "41451fa7-82d9-4673-8fa5-69eff5a761fd",
"ValidateAuthority": true,
"Audience": "https://contoso.onmicrosoft.com/41451fa7-82d9-4673-8fa5-69eff5a761fd"
}
}
V předchozím příkladu neobsahuje konec Audience hodnoty výchozí obor /API.Access .
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í
RedirectToLoginsoučá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
Appsoučást (App.razor) ve vygenerované aplikaci.Zkontrolujte
Appsoučást (App.razor) v referenčním zdroji.Poznámka
dokumentace odkazuje na zdrojový odkaz na ASP.NET Core načtení
mainvě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říkladrelease/5.0vě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:
- Je poskytován
Microsoft.AspNetCore.Components.WebAssembly.Authenticationbalíčkem . - Spravuje provádění příslušných akcí v každé fázi ověřování.
@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.
Ř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:
- Google Chrome (dokumentace Google)
- Microsoft Edge
- Mozilla Firefox (dokumentace Mozilla)
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:
- V Azure Portal přístup k manifestu aplikace.
- Nastavte
allowPublicClientatribut nanullnebotrue.
- Chyba:
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
- Microsoft Edge:
- 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říkladhttps://localhost:5001). - Mozilla Firefox: Použijte
-private -url {URL}, kde zástupný symbol je adresa URL, která se má otevřít{URL}(napříkladhttps://localhost:5001).
- Microsoft Edge: Použijte
- 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ů:
- Vymažte mezipaměť balíčků NuGet systému spuštěním příkazu
dotnet nuget locals all --clearz příkazového prostředí. - Odstraňte složky a
binobjprojektu. - Obnovte a znovu sestavte projekt.
- 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í
- Blazor WebAssemblyASP.NET Core další scénáře zabezpečení
- Vytvoření vlastní verze javascriptové knihovny Authentication.MSAL
- Neověřené nebo neoprávněné požadavky webového rozhraní API v aplikaci se zabezpečeným výchozím klientem
- ASP.NET Core Blazor WebAssembly s Azure Active Directorymi skupinami a rolemi
- Microsoft identity platform a Azure Active Directory s ASP.NET Core
- Dokumentace k platformě Microsoft Identity Platform
- Rychlý start: Registrace aplikace v Microsoft identity platform