Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Note
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 10 tohoto článku.
Tento článek popisuje, jak zabezpečit Blazor Web App pomocí OpenID Connect (OIDC) a ukázkovou aplikací v úložišti GitHub dotnet/blazor-samples (.NET 8 nebo novější) (jak stáhnout).
Pro Microsoft Entra ID nebo Azure AD B2C můžete použít
Tato verze článku popisuje implementaci OIDC bez použití modelu back-endu pro front-end (BFF) spolu s aplikací, která využívá globální interaktivní automatické vykreslování (server a .Client projekty). Model BFF je užitečný pro provádění ověřených požadavků na externí služby. Pokud specifikace aplikace požaduje přijetí vzoru BFF, změňte selektor verze článku na BFF pattern.
Přijímá se následující specifikace:
- Používá Blazor Web Apprežim automatického vykreslování s globální interaktivitou.
- Vlastní služby poskytovatele stavu ověřování používají serverové a klientské aplikace k zachycení stavu ověření uživatele a k jeho přenosu mezi serverem a klientem.
- Tato aplikace je výchozím bodem pro jakýkoli tok ověřování OIDC. OIDC je v aplikaci nakonfigurován ručně a nespoléhá na Microsoft Entra ID ani na balíčky Identity, a ukázková aplikace ani nevyžaduje hostování v Microsoft Azure. Ukázkovou aplikaci ale můžete použít s Entra, Webem Microsoftu Identity a hostováním v Azure.
- Automatická neinteraktivní aktualizace tokenu
- Samostatný projekt webového rozhraní API ukazuje zabezpečené volání webového rozhraní API pro data o počasí.
Alternativní způsob použití Microsoft Authentication Library pro .NET, Microsoft Identity Web, a Microsoft Entra ID, viz Zabezpečení ASP.NET Core Blazor Web App pomocí Microsoft Entra ID.
Ukázkové řešení
Ukázková aplikace se skládá z následujících projektů:
-
BlazorWebAppOidc: Projekt Blazor Web Appna straně serveru , který obsahuje příklad minimálního koncového bodu rozhraní API pro data o počasí. -
BlazorWebAppOidc.Client: Klientský projekt Blazor Web App. -
MinimalApiJwt: Back-endové webové rozhraní API s minimálním koncovým bodem rozhraní API pro data o počasí.
Přejděte k ukázce prostřednictvím složky nejnovější verze v úložišti ukázek Blazor s následujícím odkazem. Ukázka je ve složce BlazorWebAppOidc pro .NET 8 nebo novější.
Spusťte řešení z Aspire/Aspire.AppHost projektu.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Ukázkové funkce řešení:
Automatická neinteraktivní aktualizace tokenů pomocí vlastního cookie aktualizačního modulu (
CookieOidcRefresher.cs).Data o počasí se zpracovávají pomocí minimálního koncového
/weather-forecastbodu rozhraní API (Program) vProgram.cssouboru (MinimalApiJwt) projektu. Koncový bod vyžaduje autorizaci voláním RequireAuthorization. Pro všechny kontrolery, které přidáte do projektu, přidejte[Authorize]atribut do kontroleru nebo akce. Další informace o vyžadování autorizace v aplikaci prostřednictvím zásad autorizace a odhlášení z autorizace v podmnožině veřejných koncových bodů najdete v doprovodných materiálech Razor Pages OIDC.Aplikace bezpečně volá webové API pro data o počasí.
- Při vykreslování komponenty
Weatherna serveru komponenta využíváServerWeatherForecasterk získání dat o počasí z webového rozhraní API v projektuMinimalApiJwt. To se děje pomocí DelegatingHandler (TokenHandler), který k požadavku připojí přístupový token ze HttpContext. - Když se komponenta vykreslí na klientovi, použije implementaci služby
ClientWeatherForecaster, která používá předkonfigurované HttpClient (v souboru klientského projektuProgram) k volání webového rozhraní API ze serverového projektuServerWeatherForecaster.
- Při vykreslování komponenty
- Projekt serveru volá AddAuthenticationStateSerialization, aby přidal poskytovatele stavu ověřování na straně serveru, který používá PersistentComponentState k přenosu stavu ověřování do klienta. Klient volá AddAuthenticationStateDeserialization ke deserializaci a používá stav ověřování, který byl předán serverem. Stav ověřování je nastavený na celou dobu životnosti aplikace WebAssembly.
-
PersistingAuthenticationStateProviderTřída (PersistingAuthenticationStateProvider.cs) je serverový komponentAuthenticationStateProvider, který používá PersistentComponentState k přenosu stavu ověřování ke klientovi, který je pak fixní po dobu životnosti aplikace WebAssembly.
Další informace o volání (webových) rozhraní API pomocí abstrakcí služby v Blazor Web Apps si přečtěte v tématu Volání webového rozhraní API z aplikace ASP.NET Core Blazor.
Terminologie a pokyny k poskytovateli OIDC
I když pro použití ukázkové aplikace a pokynů v tomto článku nemusíte používat Microsoft Entra (ME-ID) jako poskytovatele OIDC, tento článek popisuje nastavení pro ME-ID pomocí názvů, které najdete v dokumentaci Microsoftu a na portálech Azure/Entra. Nastavení OIDC mají podobné pojmenování napříč poskytovateli OIDC. Pokud používáte poskytovatele OIDC třetí strany, použijte dokumentaci poskytovatele společně s pokyny v tomto článku pro registraci aplikací a webových rozhraní API.
Registrace aplikací Microsoft Entra ID
Doporučujeme používat samostatné registrace pro aplikace a webová rozhraní API, i když jsou aplikace a webová rozhraní API ve stejném řešení. Následující pokyny jsou určené pro BlazorWebAppOidc aplikace a MinimalApiJwt webové rozhraní API ukázkového řešení, ale stejné pokyny platí obecně pro všechny registrace založené na Entra pro aplikace a webová rozhraní API.
Pokyny k registraci aplikací a webových rozhraní API najdete v tématu Registrace aplikace v Microsoft Entra ID.
Nejprve zaregistrujte webové rozhraní API (MinimalApiJwt), abyste při registraci aplikace mohli udělit přístup k webovému rozhraní API. ID tenanta a ID klienta webového rozhraní API slouží ke konfiguraci webového rozhraní API v souboru Program . Po registraci webového rozhraní API zpřístupněte webové rozhraní API v Registrace aplikací>Zpřístupnění rozhraní API s názvem oboru Weather.Get. Poznamenejte si identifikátor URI ID aplikace pro použití v konfiguraci aplikace.
Dále zaregistrujte aplikaci (BlazorWebAppOidc/BlazorWebApOidc.Client) s konfigurací webové platformy a přesměrovacím URIhttps://localhost/signin-oidc (port není vyžadován). ID tenanta a ID klienta aplikace spolu s základní adresou webového rozhraní API, identifikátorem URI ID aplikace a názvem rozsahu počasí se používají ke konfiguraci aplikace v souboru Program . Udělete rozhraní API oprávnění pro přístup k webovému rozhraní API v registraci aplikací>oprávněních rozhraní API. Pokud k tomu specifikace zabezpečení aplikace volá, můžete organizaci udělit souhlas správce pro přístup k webovému rozhraní API. Autorizovaní uživatelé a skupiny se přiřazují k registraci aplikace vpodnikových aplikacích>.
V konfiguraci registrace aplikace pro implicitní udělení a hybridní toky v portálu Entra nebo Azure nezaškrtávejte políčko u koncového bodu autorizace pro vrácení přístupových tokenů nebo ID tokenů. Obslužná rutina OpenID Connect automaticky požaduje příslušné tokeny pomocí kódu vráceného z autorizačního koncového bodu.
Vytvořte tajný klíč klienta v registraci aplikace na webu Entra nebo Azure Portal (Správa>certifikátů a tajných kódů>Nový tajný klíč klienta). Pro použití v následující části uchovejte hodnotu tajného klíče klienta.
Další pokyny k konfiguraci entra pro konkrétní nastavení najdete dále v tomto článku.
Nastavte tajný klíč klienta
Tato část se vztahuje pouze na serverový projekt Blazor Web App (BlazorWebAppOidc projekt).
Warning
Neukládejte tajné kódy aplikací, připojovací řetězec, přihlašovací údaje, hesla, osobní identifikační čísla (PIN), privátní kód C#/.NET nebo privátní klíče/tokeny v kódu na straně klienta, což je vždy nezabezpečené. V testovacích a produkčních prostředích by kód na straně serveruBlazor a webová rozhraní API měly používat toky zabezpečeného ověřování, které se vyhýbají uchovávání přihlašovacích údajů v kódu projektu nebo konfiguračních souborech. Mimo místní testování vývoje doporučujeme vyhnout se použití proměnných prostředí k ukládání citlivých dat, protože proměnné prostředí nejsou nejbezpečnějším přístupem. Pro místní testování vývoje se pro zabezpečení citlivých dat doporučuje nástroj Secret Manager. Další informace najdete v tématu Bezpečné udržování citlivých dat a přihlašovacích údajů.
K místnímu testování vývoje použijte nástroj Secret Manager k uložení Blazor tajného klíče klienta projektu serveru pod konfiguračním klíčem Authentication:Schemes:MicrosoftOidc:ClientSecret.
Serverový Blazor projekt nebyl inicializován pro nástroj Secret Manager. K provedení následujícího příkazu použijte příkazové prostředí, například příkazové prostředí Developer PowerShell v sadě Visual Studio. Před provedením příkazu změňte adresář příkazem cd na adresář projektu serveru. Příkaz vytvoří identifikátor tajných kódů uživatele (<UserSecretsId> v souboru projektu serverové aplikace):
dotnet user-secrets init
Spuštěním následujícího příkazu nastavte tajný klíč klienta. Zástupný {SECRET} symbol je tajný klíč klienta získaný z registrace aplikace:
dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"
Pokud používáte Visual Studio, můžete ověřit, že je tajný kód nastavený tak, že v Průzkumník řešení kliknete pravým tlačítkem na projekt serveru a vyberete Spravovat tajné kódy uživatelů.
MinimalApiJwt projekt
Projekt MinimalApiJwt je back-endové webové rozhraní API pro více front-endových projektů. Projekt nakonfiguruje minimální koncový bod rozhraní API pro data o počasí.
Soubor MinimalApiJwt.http lze použít k testování žádosti o data o počasí. Mějte na paměti, že projekt MinimalApiJwt musí být spuštěn pro otestování koncového bodu a koncový bod je pevně zakódovaný do souboru. Další informace naleznete v tématu Použití souborů .http v sadě Visual Studio 2022.
Projekt obsahuje balíčky a konfiguraci pro vytváření dokumentů OpenAPI.
Projekt obsahuje balíčky a konfiguraci pro vytváření dokumentů OpenAPI a uživatelského rozhraní Swagger ve vývojovém prostředí. Další informace najdete v tématu Použití vygenerovaných dokumentů OpenAPI.
Projekt vytvoří minimální koncový bod rozhraní API pro data o počasí:
app.MapGet("/weather-forecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
}).RequireAuthorization();
Nakonfigurujte projekt v JwtBearerOptions volání AddJwtBearer v souboru Program projektu.
Nastaví Authority autoritu pro provádění volání OIDC. Doporučujeme pro projekt použít samostatnou registraci aplikace MinimalApiJwt. Autorita odpovídá vydavateli (iss) JWT, které vrací poskytovatel identity.
jwtOptions.Authority = "{AUTHORITY}";
Formát autority závisí na typu používaného tenanta. Následující příklady pro Microsoft Entra ID používají ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee.
příklad autority tenanta ME-ID:
jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";
Příklad autority tenanta AAD B2C:
jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
Nastaví Audience cílovou skupinu pro jakýkoli přijatý token OIDC.
jwtOptions.Audience = "{APP ID URI}";
Note
Při použití ID Microsoft Entra odpovídá pouze hodnota cesty identifikátoru URI ID aplikace, která je nakonfigurována při přidání oboru Weather.Get pod Zpřístupnění rozhraní API na portálu Entra nebo Azure. Do hodnoty nezahrnujte název rozsahu "Weather.Get".
Formát cílové skupiny závisí na typu používaného tenanta. Následující příklady pro Microsoft Entra ID používají ID tenanta contoso a ID 11112222-bbbb-3333-cccc-4444dddd5555klienta .
příklad identifikátoru URI ID aplikace tenanta ME-ID:
jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";
Příklad identifikátoru URI ID aplikace tenanta AAD B2C:
jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";
Blazor Web App serverový projekt (BlazorWebAppOidc)
Projekt BlazorWebAppOidc je projekt na straně serveru Blazor Web App.
A DelegatingHandler (TokenHandler) spravuje připojení přístupového tokenu uživatele k odchozím požadavkům. Obslužná rutina tokenu se provádí pouze během statického serverového vykreslování (static SSR), takže použití HttpContext je v tomto případě bezpečné. Další informace najdete v tématu IHttpContextAccessor/HttpContext v aplikacích ASP.NET Core Blazor a na straně serveru ASP.NET Core a Blazor Web App dalších scénářích zabezpečení.
TokenHandler.cs:
public class TokenHandler(IHttpContextAccessor httpContextAccessor) :
DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
if (httpContextAccessor.HttpContext is null)
{
throw new Exception("HttpContext not available");
}
var accessToken = await httpContextAccessor.HttpContext
.GetTokenAsync("access_token");
request.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);
return await base.SendAsync(request, cancellationToken);
}
}
V souboru projektu Program je obslužná rutina tokenu (TokenHandler) zaregistrovaná jako služba a určená jako obslužná rutina zpráv pro AddHttpMessageHandler provádění zabezpečených požadavků na back-endové MinimalApiJwt webové rozhraní API pomocí pojmenovaného klienta HTTP ("ExternalApi").
builder.Services.AddScoped<TokenHandler>();
builder.Services.AddHttpClient("ExternalApi",
client => client.BaseAddress = new Uri(builder.Configuration["ExternalApiUri"] ??
throw new Exception("Missing base address!")))
.AddHttpMessageHandler<TokenHandler>();
V souboru projektu appsettings.json nakonfigurujte identifikátor URI externího rozhraní API:
"ExternalApiUri": "{BASE ADDRESS}"
Example:
"ExternalApiUri": "https://localhost:7277"
Následující OpenIdConnectOptions konfigurace se nachází v souboru projektu Program při volání na AddOpenIdConnect:
PushedAuthorizationBehavior: Řídí podporu předaných žádostí o autorizaci (PAR). Ve výchozím nastavení se použije funkce PAR, pokud dokument zjišťování zprostředkovatele identity (obvykle nalezený na .well-known/openid-configuration) inzeruje podporu PAR. Pokud chcete vynutit podporu PAR pro aplikaci, můžete přiřadit hodnotu PushedAuthorizationBehavior.Require. Funkce PAR není podporována společností Microsoft Entra a v budoucnu nemáme žádné plány, aby ji entra podporovala.
oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;
SignInScheme: Nastaví schéma ověřování odpovídající middlewaru zodpovědnému za zachování identity uživatele po úspěšném ověření. Obslužná rutina OIDC musí používat schéma přihlašování, které dokáže uchovávat přihlašovací údaje uživatelů napříč požadavky. Následující řádek je k dispozici pouze pro demonstrační účely. Pokud tuto hodnotu vynecháte, DefaultSignInScheme použije se jako záložní hodnota.
oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
Rozsahy pro openid a profile (Scope) (volitelné): Rozsahy openid a profile jsou také ve výchozím nastavení nakonfigurovány, protože jsou nezbytné pro funkci obslužné rutiny OIDC. Tyto rozsahy budou možná nutné znovu přidat, pokud jsou zahrnuty v konfiguraci Authentication:Schemes:MicrosoftOidc:Scope. Obecné pokyny ke konfiguraci najdete v tématu Konfigurace v ASP.NET Core a Blazor.
oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
SaveTokens: Určuje, zda mají být přístupové a obnovovací tokeny uloženy v AuthenticationProperties po úspěšné autorizaci. Tato vlastnost je nastavená na true, aby se obnovovací token uložil pro neinteraktivní aktualizaci tokenu.
oidcOptions.SaveTokens = true;
Rozsah pro offline přístup (Scope): Obor offline_access je vyžadován pro obnovovací token.
oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
Authority a ClientId: Nastaví autoritu a ID klienta pro volání OIDC.
oidcOptions.Authority = "{AUTHORITY}";
oidcOptions.ClientId = "{CLIENT ID}";
Následující příklad používá ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee a ID 00001111-aaaa-2222-bbbb-3333cccc4444klienta :
oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
U aplikací s více tenanty by se měla používat "společná" autorita. Můžete také použít "společnou" autoritu pro aplikace s jedním tenantem, ale vyžaduje se vlastní IssuerValidator , jak je znázorněno dále v této části.
oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";
ResponseType: Nakonfiguruje obslužnou rutinu OIDC tak, aby prováděla pouze tok autorizačního kódu. Implicitní granty a hybridní toky nejsou v tomto režimu zbytečné. Obslužná rutina OIDC automaticky požaduje příslušné tokeny pomocí kódu vráceného z autorizačního koncového bodu.
oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
MapInboundClaims a konfigurace NameClaimType a RoleClaimType: Mnoho serverů OIDC používá "name" a "role" namísto výchozích hodnot SOAP/WS-Fed v rámci ClaimTypes. Pokud je MapInboundClaims nastaven na false, obsluha neprovádí mapování deklarací identity a názvy deklarací z JWT jsou přímo použity aplikací. Následující příklad nastaví typ deklarace identity role na "roles, což je vhodné pro Microsoft Entra ID (ME-ID). Další informace najdete v dokumentaci zprostředkovatele identity.
Note
MapInboundClaims musí být nastavena na false u většiny zprostředkovatelů OIDC, což brání přejmenování nároků.
oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";
Konfigurace cesty: Cesty musí odpovídat identifikátoru URI přesměrování (cesta zpětného volání pro přihlášení) a cestě ke zpětnému přesměrování po odhlášení (cesta zpětného volání po odhlášení) nakonfigurované při registraci aplikace u poskytovatele OIDC. Na webu Azure Portal jsou cesty konfigurovány v panelu Ověřování registrace aplikace. Přihlašovací i odhlašovací cesty musejí být zaregistrované jako identifikátory URI přesměrování. Výchozí hodnoty jsou /signin-oidc a /signout-callback-oidc.
CallbackPath: Cesta požadavku v rámci základní cesty aplikace, kde se vrátí uživatelský agent.
Nakonfigurujte v registraci zprostředkovatele OIDC aplikace cestu zpětného volání pro odhlášení. V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost:{PORT}/signin-oidc
Note
Při použití ID Microsoft Entra se pro tyto adresy port nevyžaduje localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port.
SignedOutCallbackPath (konfigurační klíč: "SignedOutCallbackPath"): Cesta požadavku v rámci základní cesty aplikace zachycená obslužnou rutinou OIDC, kde se agent uživatele poprvé vrátí po odhlášení od zprostředkovatele identity. Ukázková aplikace nenastaví pro cestu hodnotu, protože se použije výchozí hodnota/signout-callback-oidc. Po zachycení požadavku se obslužná rutina OIDC přesměruje na SignedOutRedirectUri nebo RedirectUri, pokud je to specifikováno.
Nakonfigurujte v registraci zprostředkovatele OIDC aplikace cestu zpětného volání pro odhlášení. V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost:{PORT}/signout-callback-oidc
Note
Pokud používáte ID Microsoft Entra, nastavte cestu v konfiguraci platformy Web v položkách identifikátoru URI přesměrování v portálu Entra nebo Azure. Port se při použití Entra nevyžaduje pro adresy localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port. Pokud do registrace aplikace v Entra nepřidáte identifikátor URI cesty zpětného volání po odhlášení, Entra nepřesměruje uživatele zpět do aplikace a pouze je vyzve, aby zavřeli okno prohlížeče.
RemoteSignOutPath: Požadavky přijaté na této cestě způsobí, že obslužná rutina vyvolá odhlášení pomocí schématu pro odhlášení.
V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost/signout-oidc
Note
Pokud používáte ID Microsoft Entra, nastavte adresu URL pro odhlášení front-channel v portálu Entra nebo Azure. Port se při použití Entra nevyžaduje pro adresy localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port.
oidcOptions.CallbackPath = new PathString("{PATH}");
oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
oidcOptions.RemoteSignOutPath = new PathString("{PATH}");
Příklady (výchozí hodnoty):
oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");
(Microsoft Azure pouze s "běžným" koncovým bodem): TokenValidationParameters.IssuerValidatorMnoho zprostředkovatelů OIDC pracuje s výchozím validátorem vystavitele, ale musíme počítat s parametrizovaným vystavitelem s ID tenanta ({TENANT ID}) vráceným https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration. Další informace najdete v tématu SecurityTokenInvalidIssuerException s OpenID Connect a běžným koncovým bodem Azure AD (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).
Pouze pro aplikace používající Microsoft Entra ID nebo Azure AD B2C s "běžným" koncovým bodem:
var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;
Blazor Web App projekt klienta (BlazorWebAppOidc.Client)
Projekt BlazorWebAppOidc.Client je klientská část projektu Blazor Web App.
Klient volá AddAuthenticationStateDeserialization ke deserializaci a používá stav ověřování, který byl předán serverem. Stav ověřování je nastavený na celou dobu životnosti aplikace WebAssembly.
PersistentAuthenticationStateProvider Třída (PersistentAuthenticationStateProvider.cs) je klientská strana AuthenticationStateProvider, která určuje stav ověření uživatele hledáním dat uchovaných na stránce při vykreslování na serveru. Stav ověřování je nastavený na celou dobu životnosti aplikace WebAssembly.
Pokud se uživatel potřebuje přihlásit nebo odhlásit, vyžaduje se opětovné načtení celé stránky.
Ukázková aplikace poskytuje jenom uživatelské jméno a e-mail pro účely zobrazení.
Pro Microsoft Entra ID nebo Azure AD B2C můžete použít
Tato verze článku popisuje, jak implementovat OIDC bez použití vzoru backend pro frontend (BFF) v aplikaci, která používá globální interaktivní renderování serveru (jednotlivý projekt). Model BFF je užitečný pro provádění ověřených požadavků na externí služby. Pokud specifikace aplikace požaduje přijetí vzoru BFF s globálním interaktivním automatickým renderováním, změňte selektor verze článku na vzor BFF ve formátu .
Přijímá se následující specifikace:
- Blazor Web App používá serverový režim vykreslování s globální interaktivitou.
- Tato aplikace je výchozím bodem pro jakýkoli tok ověřování OIDC. OIDC je v aplikaci nakonfigurován ručně a nespoléhá na Microsoft Entra ID ani na balíčky Identity, a ukázková aplikace ani nevyžaduje hostování v Microsoft Azure. Ukázkovou aplikaci ale můžete použít s Entra, Webem Microsoftu Identity a hostováním v Azure.
- Automatická neinteraktivní aktualizace tokenu
- Samostatný projekt webového rozhraní API ukazuje zabezpečené volání webového rozhraní API pro data o počasí.
Alternativní způsob použití Microsoft Authentication Library pro .NET, Microsoft Identity Web, a Microsoft Entra ID, viz Zabezpečení ASP.NET Core Blazor Web App pomocí Microsoft Entra ID.
Ukázkové řešení
Ukázková aplikace se skládá z následujících projektů:
-
BlazorWebAppOidcServer: Blazor Web App projekt na straně serveru (globální interaktivní vykreslování serveru). -
MinimalApiJwt: Back-endové webové rozhraní API s minimálním koncovým bodem rozhraní API pro data o počasí.
Přejděte k ukázce prostřednictvím složky nejnovější verze v úložišti ukázek Blazor s následujícím odkazem. Ukázka je ve složce BlazorWebAppOidcServer pro .NET 8 nebo novější.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Registrace aplikací Microsoft Entra ID
Doporučujeme používat samostatné registrace pro aplikace a webová rozhraní API, i když jsou aplikace a webová rozhraní API ve stejném řešení. Následující pokyny jsou určené pro BlazorWebAppOidcServer aplikace a MinimalApiJwt webové rozhraní API ukázkového řešení, ale stejné pokyny platí obecně pro všechny registrace založené na Entra pro aplikace a webová rozhraní API.
Nejprve zaregistrujte webové rozhraní API (MinimalApiJwt), abyste při registraci aplikace mohli udělit přístup k webovému rozhraní API. ID tenanta a ID klienta webového rozhraní API slouží ke konfiguraci webového rozhraní API v souboru Program . Po registraci webového rozhraní API zpřístupněte webové rozhraní API v Registrace aplikací>Zpřístupnění rozhraní API s názvem oboru Weather.Get. Poznamenejte si identifikátor URI ID aplikace pro použití v konfiguraci aplikace.
Dále zaregistrujte aplikaci (BlazorWebAppOidcServer) s konfigurací webové platformy a přesměrovávacím URIhttps://localhost/signin-oidc (port se nevyžaduje). ID tenanta a ID klienta aplikace spolu s základní adresou webového rozhraní API, identifikátorem URI ID aplikace a názvem rozsahu počasí se používají ke konfiguraci aplikace v souboru Program . Udělete rozhraní API oprávnění pro přístup k webovému rozhraní API v registraci aplikací>oprávněních rozhraní API. Pokud k tomu specifikace zabezpečení aplikace volá, můžete organizaci udělit souhlas správce pro přístup k webovému rozhraní API. Autorizovaní uživatelé a skupiny se přiřazují k registraci aplikace vpodnikových aplikacích>.
V konfiguraci registrace aplikace pro implicitní udělení a hybridní toky v portálu Entra nebo Azure nezaškrtávejte políčko u koncového bodu autorizace pro vrácení přístupových tokenů nebo ID tokenů. Obslužná rutina OpenID Connect automaticky požaduje příslušné tokeny pomocí kódu vráceného z autorizačního koncového bodu.
Vytvořte tajný klíč klienta v registraci aplikace na webu Entra nebo Azure Portal (Správa>certifikátů a tajných kódů>Nový tajný klíč klienta). Pro použití v následující části uchovejte hodnotu tajného klíče klienta.
Další pokyny k konfiguraci entra pro konkrétní nastavení najdete dále v tomto článku.
Nastavte tajný klíč klienta
Tato část se vztahuje pouze na serverový projekt Blazor Web App (BlazorWebAppOidcServer projekt).
Warning
Neukládejte tajné kódy aplikací, připojovací řetězec, přihlašovací údaje, hesla, osobní identifikační čísla (PIN), privátní kód C#/.NET nebo privátní klíče/tokeny v kódu na straně klienta, což je vždy nezabezpečené. V testovacích a produkčních prostředích by kód na straně serveruBlazor a webová rozhraní API měly používat toky zabezpečeného ověřování, které se vyhýbají uchovávání přihlašovacích údajů v kódu projektu nebo konfiguračních souborech. Mimo místní testování vývoje doporučujeme vyhnout se použití proměnných prostředí k ukládání citlivých dat, protože proměnné prostředí nejsou nejbezpečnějším přístupem. Pro místní testování vývoje se pro zabezpečení citlivých dat doporučuje nástroj Secret Manager. Další informace najdete v tématu Bezpečné udržování citlivých dat a přihlašovacích údajů.
K místnímu testování vývoje použijte nástroj Secret Manager k uložení Blazor tajného klíče klienta projektu serveru pod konfiguračním klíčem Authentication:Schemes:MicrosoftOidc:ClientSecret.
Serverový Blazor projekt nebyl inicializován pro nástroj Secret Manager. K provedení následujícího příkazu použijte příkazové prostředí, například příkazové prostředí Developer PowerShell v sadě Visual Studio. Před provedením příkazu změňte adresář příkazem cd na adresář projektu serveru. Příkaz vytvoří identifikátor tajných kódů uživatele (<UserSecretsId> v souboru projektu aplikace):
dotnet user-secrets init
Spuštěním následujícího příkazu nastavte tajný klíč klienta. Zástupný {SECRET} symbol je tajný klíč klienta získaný z registrace aplikace:
dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"
Pokud používáte Visual Studio, můžete ověřit, že je tajný kód nastavený tak, že kliknete pravým tlačítkem na projekt v průzkumníku řešení a vyberete Spravovat tajné kódy uživatelů.
MinimalApiJwt projekt
Projekt MinimalApiJwt je back-endové webové rozhraní API pro více front-endových projektů. Projekt nakonfiguruje minimální koncový bod rozhraní API pro data o počasí.
Soubor MinimalApiJwt.http lze použít k testování žádosti o data o počasí. Mějte na paměti, že projekt MinimalApiJwt musí být spuštěn pro otestování koncového bodu a koncový bod je pevně zakódovaný do souboru. Další informace naleznete v tématu Použití souborů .http v sadě Visual Studio 2022.
Projekt obsahuje balíčky a konfiguraci pro vytváření dokumentů OpenAPI.
Projekt obsahuje balíčky a konfiguraci pro vytváření dokumentů OpenAPI a uživatelského rozhraní Swagger ve vývojovém prostředí. Další informace najdete v tématu Použití vygenerovaných dokumentů OpenAPI.
Projekt vytvoří minimální koncový bod rozhraní API pro data o počasí:
app.MapGet("/weather-forecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
}).RequireAuthorization();
Nakonfigurujte projekt v JwtBearerOptions volání AddJwtBearer v souboru Program projektu.
Nastaví Authority autoritu pro provádění volání OIDC. Doporučujeme pro projekt použít samostatnou registraci aplikace MinimalApiJwt. Autorita odpovídá vydavateli (iss) JWT, které vrací poskytovatel identity.
jwtOptions.Authority = "{AUTHORITY}";
Formát autority závisí na typu používaného tenanta. Následující příklady pro Microsoft Entra ID používají ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee.
příklad autority tenanta ME-ID:
jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";
Příklad autority tenanta AAD B2C:
jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
Nastaví Audience cílovou skupinu pro jakýkoli přijatý token OIDC.
jwtOptions.Audience = "{APP ID URI}";
Note
Při použití ID Microsoft Entra odpovídá pouze hodnota cesty identifikátoru URI ID aplikace, která je nakonfigurována při přidání oboru Weather.Get pod Zpřístupnění rozhraní API na portálu Entra nebo Azure. Do hodnoty nezahrnujte název rozsahu "Weather.Get".
Formát cílové skupiny závisí na typu používaného tenanta. Následující příklady pro Microsoft Entra ID používají ID tenanta contoso a ID 11112222-bbbb-3333-cccc-4444dddd5555klienta .
příklad identifikátoru URI ID aplikace tenanta ME-ID:
jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";
Příklad identifikátoru URI ID aplikace tenanta AAD B2C:
jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";
BlazorWebAppOidcServer projekt
Automatickou neinteraktivní aktualizaci tokenu spravuje vlastní cookie aktualizační nástroj (CookieOidcRefresher.cs).
A DelegatingHandler (TokenHandler) spravuje připojení přístupového tokenu uživatele k odchozím požadavkům. Obslužná rutina tokenu se provádí pouze během statického serverového vykreslování (static SSR), takže použití HttpContext je v tomto případě bezpečné. Další informace najdete v tématu IHttpContextAccessor/HttpContext v aplikacích ASP.NET Core Blazor a na straně serveru ASP.NET Core a Blazor Web App dalších scénářích zabezpečení.
TokenHandler.cs:
public class TokenHandler(IHttpContextAccessor httpContextAccessor) :
DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
if (httpContextAccessor.HttpContext is null)
{
throw new Exception("HttpContext not available");
}
var accessToken = await httpContextAccessor.HttpContext
.GetTokenAsync("access_token");
request.Headers.Authorization =
new AuthenticationHeaderValue("Bearer", accessToken);
return await base.SendAsync(request, cancellationToken);
}
}
V souboru projektu Program je obslužná rutina tokenu (TokenHandler) zaregistrovaná jako služba a určená jako obslužná rutina zpráv pro AddHttpMessageHandler provádění zabezpečených požadavků na back-endové MinimalApiJwt webové rozhraní API pomocí pojmenovaného klienta HTTP ("ExternalApi").
builder.Services.AddScoped<TokenHandler>();
builder.Services.AddHttpClient("ExternalApi",
client => client.BaseAddress = new Uri(builder.Configuration["ExternalApiUri"] ??
throw new Exception("Missing base address!")))
.AddHttpMessageHandler<TokenHandler>();
Komponenta Weather používá atribut [Authorize] k zabránění neoprávněnému přístupu. Další informace o vyžadování autorizace v aplikaci prostřednictvím zásad autorizace a odhlášení z autorizace v podmnožině veřejných koncových bodů najdete v doprovodných materiálech Razor Pages OIDC.
Klient ExternalApi HTTP slouží k vyžádání dat o počasí do zabezpečeného webového rozhraní API.
OnInitializedAsync Během události životního cykluWeather.razor:
using var request = new HttpRequestMessage(HttpMethod.Get, "/weather-forecast");
var client = ClientFactory.CreateClient("ExternalApi");
using var response = await client.SendAsync(request);
response.EnsureSuccessStatusCode();
forecasts = await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
throw new IOException("No weather forecast!");
V souboru projektu appsettings.json nakonfigurujte identifikátor URI externího rozhraní API:
"ExternalApiUri": "{BASE ADDRESS}"
Example:
"ExternalApiUri": "https://localhost:7277"
Následující OpenIdConnectOptions konfigurace se nachází v souboru projektu Program při volání na AddOpenIdConnect:
PushedAuthorizationBehavior: Řídí podporu předaných žádostí o autorizaci (PAR). Ve výchozím nastavení se použije funkce PAR, pokud dokument zjišťování zprostředkovatele identity (obvykle nalezený na .well-known/openid-configuration) inzeruje podporu PAR. Pokud chcete vynutit podporu PAR pro aplikaci, můžete přiřadit hodnotu PushedAuthorizationBehavior.Require. Funkce PAR není podporována společností Microsoft Entra a v budoucnu nemáme žádné plány, aby ji entra podporovala.
oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;
SignInScheme: Nastaví schéma ověřování odpovídající middlewaru zodpovědnému za zachování identity uživatele po úspěšném ověření. Obslužná rutina OIDC musí používat schéma přihlašování, které dokáže uchovávat přihlašovací údaje uživatelů napříč požadavky. Následující řádek je k dispozici pouze pro demonstrační účely. Pokud tuto hodnotu vynecháte, DefaultSignInScheme použije se jako záložní hodnota.
oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
Rozsahy pro openid a profile (Scope) (volitelné): Rozsahy openid a profile jsou také ve výchozím nastavení nakonfigurovány, protože jsou nezbytné pro funkci obslužné rutiny OIDC. Tyto rozsahy budou možná nutné znovu přidat, pokud jsou zahrnuty v konfiguraci Authentication:Schemes:MicrosoftOidc:Scope. Obecné pokyny ke konfiguraci najdete v tématu Konfigurace v ASP.NET Core a Blazor.
oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
Nakonfigurujte rozsah pro přístup k externímu webovému API pro data o počasí. Následující příklad vychází z použití ID Entra v doméně tenanta ME-ID. V následujícím příkladu se zástupný symbol {APP ID URI} nachází v portálu Entra nebo Azure, kde je vystaveno webové rozhraní API. Pro libovolného jiného zprostředkovatele identity použijte příslušný rozsah.
oidcOptions.Scope.Add("{APP ID URI}/Weather.Get");
Formát oboru závisí na typu používaného tenanta. V následujících příkladech je contoso.onmicrosoft.comdoména klienta a ID klienta je 11112222-bbbb-3333-cccc-4444dddd5555.
příklad identifikátoru URI ID aplikace tenanta ME-ID:
oidcOptions.Scope.Add("api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");
Příklad identifikátoru URI ID aplikace tenanta AAD B2C:
oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");
SaveTokens: Určuje, zda mají být přístupové a obnovovací tokeny uloženy v AuthenticationProperties po úspěšné autorizaci. Tato vlastnost je nastavená na true, aby se obnovovací token uložil pro neinteraktivní aktualizaci tokenu.
oidcOptions.SaveTokens = true;
Rozsah pro offline přístup (Scope): Obor offline_access je vyžadován pro obnovovací token.
oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
Authority a ClientId: Nastaví autoritu a ID klienta pro volání OIDC.
oidcOptions.Authority = "{AUTHORITY}";
oidcOptions.ClientId = "{CLIENT ID}";
Následující příklad používá ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee a ID 00001111-aaaa-2222-bbbb-3333cccc4444klienta :
oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
U aplikací s více tenanty by se měla používat "společná" autorita. Můžete také použít "společnou" autoritu pro aplikace s jedním tenantem, ale vyžaduje se vlastní IssuerValidator , jak je znázorněno dále v této části.
oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";
ResponseType: Nakonfiguruje obslužnou rutinu OIDC tak, aby prováděla pouze tok autorizačního kódu. Implicitní granty a hybridní toky nejsou v tomto režimu zbytečné. Obslužná rutina OIDC automaticky požaduje příslušné tokeny pomocí kódu vráceného z autorizačního koncového bodu.
oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
MapInboundClaims a konfigurace NameClaimType a RoleClaimType: Mnoho serverů OIDC používá "name" a "role" namísto výchozích hodnot SOAP/WS-Fed v rámci ClaimTypes. Pokud je MapInboundClaims nastaven na false, obsluha neprovádí mapování deklarací identity a názvy deklarací z JWT jsou přímo použity aplikací. Následující příklad nastaví typ deklarace identity role na "roles, což je vhodné pro Microsoft Entra ID (ME-ID). Další informace najdete v dokumentaci zprostředkovatele identity.
Note
MapInboundClaims musí být nastavena na false u většiny zprostředkovatelů OIDC, což brání přejmenování nároků.
oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";
Konfigurace cesty: Cesty musí odpovídat identifikátoru URI přesměrování (cesta zpětného volání pro přihlášení) a cestě ke zpětnému přesměrování po odhlášení (cesta zpětného volání po odhlášení) nakonfigurované při registraci aplikace u poskytovatele OIDC. Na webu Azure Portal jsou cesty konfigurovány v panelu Ověřování registrace aplikace. Přihlašovací i odhlašovací cesty musejí být zaregistrované jako identifikátory URI přesměrování. Výchozí hodnoty jsou /signin-oidc a /signout-callback-oidc.
CallbackPath: Cesta požadavku v rámci základní cesty aplikace, kde se vrátí uživatelský agent.
Nakonfigurujte v registraci zprostředkovatele OIDC aplikace cestu zpětného volání pro odhlášení. V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost:{PORT}/signin-oidc
Note
Při použití ID Microsoft Entra se pro tyto adresy port nevyžaduje localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port.
SignedOutCallbackPath (konfigurační klíč: "SignedOutCallbackPath"): Cesta požadavku v rámci základní cesty aplikace zachycená obslužnou rutinou OIDC, kde se agent uživatele poprvé vrátí po odhlášení od zprostředkovatele identity. Ukázková aplikace nenastaví pro cestu hodnotu, protože se použije výchozí hodnota/signout-callback-oidc. Po zachycení požadavku se obslužná rutina OIDC přesměruje na SignedOutRedirectUri nebo RedirectUri, pokud je to specifikováno.
Nakonfigurujte v registraci zprostředkovatele OIDC aplikace cestu zpětného volání pro odhlášení. V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost:{PORT}/signout-callback-oidc
Note
Pokud používáte ID Microsoft Entra, nastavte cestu v konfiguraci platformy Web v položkách identifikátoru URI přesměrování v portálu Entra nebo Azure. Port se při použití Entra nevyžaduje pro adresy localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port. Pokud do registrace aplikace v Entra nepřidáte identifikátor URI cesty zpětného volání po odhlášení, Entra nepřesměruje uživatele zpět do aplikace a pouze je vyzve, aby zavřeli okno prohlížeče.
RemoteSignOutPath: Požadavky přijaté na této cestě způsobí, že obslužná rutina vyvolá odhlášení pomocí schématu pro odhlášení.
V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost/signout-oidc
Note
Pokud používáte ID Microsoft Entra, nastavte adresu URL pro odhlášení front-channel v portálu Entra nebo Azure. Port se při použití Entra nevyžaduje pro adresy localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port.
oidcOptions.CallbackPath = new PathString("{PATH}");
oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
oidcOptions.RemoteSignOutPath = new PathString("{PATH}");
Příklady (výchozí hodnoty):
oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");
(Microsoft Azure pouze s "běžným" koncovým bodem): TokenValidationParameters.IssuerValidatorMnoho zprostředkovatelů OIDC pracuje s výchozím validátorem vystavitele, ale musíme počítat s parametrizovaným vystavitelem s ID tenanta ({TENANT ID}) vráceným https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration. Další informace najdete v tématu SecurityTokenInvalidIssuerException s OpenID Connect a běžným koncovým bodem Azure AD (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).
Pouze pro aplikace používající Microsoft Entra ID nebo Azure AD B2C s "běžným" koncovým bodem:
var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;
Pro Microsoft Entra ID nebo Azure AD B2C můžete použít
Tato verze článku popisuje implementaci OIDC pomocí vzoru Backend for Frontend (BFF). Pokud specifikace aplikace nevyžaduje přijetí vzoru BFF, změňte selektor verze článku na model Non-BFF (Interaktivní auto) nebo model Non-BFF (Interaktivní server).
Prerequisites
Aspire vyžaduje Visual Studio verze 17.10 nebo novější.
Viz také část Požadavkyrychlého startu: Sestavení prvního Aspire řešení.
Ukázkové řešení
Ukázková aplikace se skládá z následujících projektů:
-
Aspire:
-
Aspire.AppHost: Slouží ke správě problémů orchestrace vysoké úrovně aplikace. -
Aspire.ServiceDefaults: Obsahuje výchozí Aspire konfigurace aplikací, které je možné podle potřeby rozšířit a přizpůsobit.
-
-
MinimalApiJwt: Backendové webové rozhraní API, které obsahuje příklad Minimal API koncového bodu pro data o počasí. -
BlazorWebAppOidc: Projekt na straně serveru Blazor Web App. Projekt používá YARP k přesměrování žádostí na koncový bod předpovědi počasí v projektu webového rozhraní API backendu (MinimalApiJwt), kde jeaccess_tokenuložené v rámci ověřování cookie. -
BlazorWebAppOidc.Client: Klientský projekt Blazor Web App.
Přejděte k ukázce prostřednictvím složky nejnovější verze v úložišti ukázek Blazor s následujícím odkazem. Ukázka je ve složce BlazorWebAppOidcBff pro .NET 8 nebo novější.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Používá Blazor Web Apprežim automatického vykreslování s globální interaktivitou.
Projekt serveru volá AddAuthenticationStateSerialization, aby přidal poskytovatele stavu ověřování na straně serveru, který používá PersistentComponentState k přenosu stavu ověřování do klienta. Klient volá AddAuthenticationStateDeserialization ke deserializaci a používá stav ověřování, který byl předán serverem. Stav ověřování je nastavený na celou dobu životnosti aplikace WebAssembly.
PersistingAuthenticationStateProvider Třída (PersistingAuthenticationStateProvider.cs) je serverový komponentAuthenticationStateProvider, který používá PersistentComponentState k přenosu stavu ověřování ke klientovi, který je pak fixní po dobu životnosti aplikace WebAssembly.
Tato aplikace je výchozím bodem pro jakýkoli tok ověřování OIDC. OIDC je v aplikaci nakonfigurován ručně a nespoléhá na Microsoft Entra ID ani na balíčky Identity, a ukázková aplikace ani nevyžaduje hostování v Microsoft Azure. Ukázkovou aplikaci ale můžete použít s Entra, Webem Microsoftu Identity a hostováním v Azure.
Automatická neinteraktivní aktualizace tokenů pomocí vlastního cookie aktualizačního modulu (CookieOidcRefresher.cs).
Model Back-endu pro front-end (BFF) je přijat pomocí Aspire pro zjišťování služeb a s využitím YARP pro proxyování požadavků na koncový bod předpovědi počasí v back-endové aplikaci.
Webové API (MinimalApiJwt) používá ověřování pomocí JWT-beareru k ověření tokenů JWT uložených při přihlášení Blazor Web App pomocí cookie.
Aspire zlepšuje prostředí vytváření aplikací nativních pro cloud .NET. Poskytuje konzistentní sadu nástrojů a vzorů pro vytváření a spouštění distribuovaných aplikací.
YARP (další reverzní proxy server) je knihovna, která slouží k vytvoření reverzního proxy serveru.
MapForwarder
Program v souboru projektu serveru přidává přímé předávání požadavků HTTP, které odpovídají zadanému vzoru konkrétnímu cíli pomocí výchozí konfigurace odchozího požadavku, přizpůsobených transformací a výchozího klienta HTTP:
- Při vykreslování komponenty
Weatherna serveru tato komponenta používá tříduServerWeatherForecasterk proxy žádosti o data o počasí pomocí přístupového tokenu uživatele. IHttpContextAccessor.HttpContext určuje, jestli je HttpContext k dispozici pro použití metodouGetWeatherForecastAsync. Další informace najdete v tématu ASP.NET Core Razor komponenty. - Při vykreslování komponenty na straně klienta používá komponenta implementaci
ClientWeatherForecasterslužby, která využívá předkonfigurované HttpClient (v souboruProgramklientského projektu) k volání webového API na serverovém projektu. Minimální koncový bod rozhraní API (/weather-forecast) definovaný v souboru projektuProgramserveru transformuje požadavek pomocí přístupového tokenu uživatele k získání dat o počasí.
Další informace o volání (webových) rozhraní API pomocí abstrakcí služby v Blazor Web Apps si přečtěte v tématu Volání webového rozhraní API z aplikace ASP.NET Core Blazor.
Registrace aplikací Microsoft Entra ID
Doporučujeme používat samostatné registrace pro aplikace a webová rozhraní API, i když jsou aplikace a webová rozhraní API ve stejném řešení. Následující pokyny jsou určené pro BlazorWebAppOidc aplikace a MinimalApiJwt webové rozhraní API ukázkového řešení, ale stejné pokyny platí obecně pro všechny registrace založené na Entra pro aplikace a webová rozhraní API.
Nejprve zaregistrujte webové rozhraní API (MinimalApiJwt), abyste při registraci aplikace mohli udělit přístup k webovému rozhraní API. ID tenanta a ID klienta webového rozhraní API slouží ke konfiguraci webového rozhraní API v souboru Program . Po registraci webového rozhraní API zpřístupněte webové rozhraní API v Registrace aplikací>Zpřístupnění rozhraní API s názvem oboru Weather.Get. Poznamenejte si identifikátor URI ID aplikace pro použití v konfiguraci aplikace.
Dále zaregistrujte aplikaci (BlazorWebAppOidc/BlazorWebApOidc.Client) s konfigurací webové platformy a přesměrovacím URIhttps://localhost/signin-oidc (port není vyžadován). ID tenanta a ID klienta aplikace spolu s základní adresou webového rozhraní API, identifikátorem URI ID aplikace a názvem rozsahu počasí se používají ke konfiguraci aplikace v souboru Program . Udělete rozhraní API oprávnění pro přístup k webovému rozhraní API v registraci aplikací>oprávněních rozhraní API. Pokud k tomu specifikace zabezpečení aplikace volá, můžete organizaci udělit souhlas správce pro přístup k webovému rozhraní API. Autorizovaní uživatelé a skupiny se přiřazují k registraci aplikace vpodnikových aplikacích>.
V konfiguraci registrace aplikace pro implicitní udělení a hybridní toky v portálu Entra nebo Azure nezaškrtávejte políčko u koncového bodu autorizace pro vrácení přístupových tokenů nebo ID tokenů. Obslužná rutina OpenID Connect automaticky požaduje příslušné tokeny pomocí kódu vráceného z autorizačního koncového bodu.
Vytvořte tajný klíč klienta v registraci aplikace na webu Entra nebo Azure Portal (Správa>certifikátů a tajných kódů>Nový tajný klíč klienta). Pro použití v následující části uchovejte hodnotu tajného klíče klienta.
Další pokyny k konfiguraci entra pro konkrétní nastavení najdete dále v tomto článku.
Nastavte tajný klíč klienta
Tato část se vztahuje pouze na serverový projekt Blazor Web App (BlazorWebAppOidc projekt).
Warning
Neukládejte tajné kódy aplikací, připojovací řetězec, přihlašovací údaje, hesla, osobní identifikační čísla (PIN), privátní kód C#/.NET nebo privátní klíče/tokeny v kódu na straně klienta, což je vždy nezabezpečené. V testovacích a produkčních prostředích by kód na straně serveruBlazor a webová rozhraní API měly používat toky zabezpečeného ověřování, které se vyhýbají uchovávání přihlašovacích údajů v kódu projektu nebo konfiguračních souborech. Mimo místní testování vývoje doporučujeme vyhnout se použití proměnných prostředí k ukládání citlivých dat, protože proměnné prostředí nejsou nejbezpečnějším přístupem. Pro místní testování vývoje se pro zabezpečení citlivých dat doporučuje nástroj Secret Manager. Další informace najdete v tématu Bezpečné udržování citlivých dat a přihlašovacích údajů.
K místnímu testování vývoje použijte nástroj Secret Manager k uložení Blazor tajného klíče klienta projektu serveru pod konfiguračním klíčem Authentication:Schemes:MicrosoftOidc:ClientSecret.
Serverový Blazor projekt nebyl inicializován pro nástroj Secret Manager. K provedení následujícího příkazu použijte příkazové prostředí, například příkazové prostředí Developer PowerShell v sadě Visual Studio. Před provedením příkazu změňte adresář příkazem cd na adresář projektu serveru. Příkaz vytvoří identifikátor tajných kódů uživatele (<UserSecretsId> v souboru projektu serverové aplikace):
dotnet user-secrets init
Spuštěním následujícího příkazu nastavte tajný klíč klienta. Zástupný {SECRET} symbol je tajný klíč klienta získaný z registrace aplikace:
dotnet user-secrets set "Authentication:Schemes:MicrosoftOidc:ClientSecret" "{SECRET}"
Pokud používáte Visual Studio, můžete ověřit, že je tajný kód nastavený tak, že v Průzkumník řešení kliknete pravým tlačítkem na projekt serveru a vyberete Spravovat tajné kódy uživatelů.
Aspire projektů
Další informace o použití Aspire a .AppHost podrobnostech o .ServiceDefaults projektech ukázkové aplikace najdete v Aspire dokumentaci.
Ověřte, že jste splnili požadavky pro Aspire. Další informace najdete v části Požadavky v rychlém startu: Sestavení prvního Aspire řešení.
Ukázková aplikace konfiguruje jenom nezabezpečený spouštěcí profil HTTP (http) pro použití při testování vývoje. Další informace, včetně příkladu nezabezpečených a zabezpečených profilů nastavení spuštění, naleznete v tématu Povolení nezabezpečeného přenosu v Aspire (Aspire dokumentace).
MinimalApiJwt projekt
Projekt MinimalApiJwt je back-endové webové rozhraní API pro více front-endových projektů. Projekt nakonfiguruje minimální koncový bod rozhraní API pro data o počasí. Požadavky z Blazor Web App projektu na straně serveru (BlazorWebAppOidc) se proxiují do MinimalApiJwt projektu.
Soubor MinimalApiJwt.http lze použít k testování žádosti o data o počasí. Mějte na paměti, že projekt MinimalApiJwt musí být spuštěn pro otestování koncového bodu a koncový bod je pevně zakódovaný do souboru. Další informace naleznete v tématu Použití souborů .http v sadě Visual Studio 2022.
Projekt obsahuje balíčky a konfiguraci pro vytváření dokumentů OpenAPI.
Projekt obsahuje balíčky a konfiguraci pro vytváření dokumentů OpenAPI a uživatelského rozhraní Swagger ve vývojovém prostředí. Další informace najdete v tématu Použití vygenerovaných dokumentů OpenAPI.
Koncový bod zabezpečeného rozhraní předpovědi počasí je v souboru projektu Program:
app.MapGet("/weather-forecast", () =>
{
var forecast = Enumerable.Range(1, 5).Select(index =>
new WeatherForecast
(
DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
Random.Shared.Next(-20, 55),
summaries[Random.Shared.Next(summaries.Length)]
))
.ToArray();
return forecast;
}).RequireAuthorization();
Metoda RequireAuthorization rozšíření vyžaduje autorizaci pro definici trasy. Pro všechny kontrolery, které přidáte do projektu, přidejte [Authorize] atribut do kontroleru nebo akce.
Nakonfigurujte projekt v JwtBearerOptions volání AddJwtBearer v souboru Program projektu.
Nastaví Authority autoritu pro provádění volání OIDC. Doporučujeme pro projekt použít samostatnou registraci aplikace MinimalApiJwt. Autorita odpovídá vydavateli (iss) JWT, které vrací poskytovatel identity.
jwtOptions.Authority = "{AUTHORITY}";
Formát autority závisí na typu používaného tenanta. Následující příklady pro Microsoft Entra ID používají ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee.
příklad autority tenanta ME-ID:
jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee";
Příklad autority tenanta AAD B2C:
jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
Nastaví Audience cílovou skupinu pro jakýkoli přijatý token OIDC.
jwtOptions.Audience = "{APP ID URI}";
Note
Při použití ID Microsoft Entra odpovídá pouze hodnota cesty identifikátoru URI ID aplikace, která je nakonfigurována při přidání oboru Weather.Get pod Zpřístupnění rozhraní API na portálu Entra nebo Azure. Do hodnoty nezahrnujte název rozsahu "Weather.Get".
Formát cílové skupiny závisí na typu používaného tenanta. Následující příklady pro Microsoft Entra ID používají ID tenanta contoso a ID 11112222-bbbb-3333-cccc-4444dddd5555klienta .
příklad identifikátoru URI ID aplikace tenanta ME-ID:
jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";
Příklad identifikátoru URI ID aplikace tenanta AAD B2C:
jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";
Serverový Blazor Web App projekt (BlazorWebAppOidc)
Tato část vysvětluje, jak nakonfigurovat projekt na straně Blazor serveru.
Následující OpenIdConnectOptions konfigurace se nachází v souboru projektu Program při volání AddOpenIdConnect.
PushedAuthorizationBehavior: Řídí podporu předaných žádostí o autorizaci (PAR). Ve výchozím nastavení se použije funkce PAR, pokud dokument zjišťování zprostředkovatele identity (obvykle nalezený na .well-known/openid-configuration) inzeruje podporu PAR. Pokud chcete vynutit podporu PAR pro aplikaci, můžete přiřadit hodnotu PushedAuthorizationBehavior.Require. Funkce PAR není podporována společností Microsoft Entra a v budoucnu nemáme žádné plány, aby ji entra podporovala.
oidcOptions.PushedAuthorizationBehavior = PushedAuthorizationBehavior.UseIfAvailable;
SignInScheme: Nastaví schéma ověřování odpovídající middlewaru zodpovědnému za zachování identity uživatele po úspěšném ověření. Obslužná rutina OIDC musí používat schéma přihlašování, které dokáže uchovávat přihlašovací údaje uživatelů napříč požadavky. Následující řádek je k dispozici pouze pro demonstrační účely. Pokud tuto hodnotu vynecháte, DefaultSignInScheme použije se jako záložní hodnota.
oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
Rozsahy pro openid a profile (Scope) (volitelné): Rozsahy openid a profile jsou také ve výchozím nastavení nakonfigurovány, protože jsou nezbytné pro funkci obslužné rutiny OIDC. Tyto rozsahy budou možná nutné znovu přidat, pokud jsou zahrnuty v konfiguraci Authentication:Schemes:MicrosoftOidc:Scope. Obecné pokyny ke konfiguraci najdete v tématu Konfigurace v ASP.NET Core a Blazor.
oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
SaveTokens: Určuje, zda mají být přístupové a obnovovací tokeny uloženy v AuthenticationProperties po úspěšné autorizaci. Hodnota je nastavena na true k autentizaci požadavků na data o počasí z backendového projektu webového API (MinimalApiJwt).
oidcOptions.SaveTokens = true;
Rozsah pro offline přístup (Scope): Obor offline_access je vyžadován pro obnovovací token.
oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
Obory pro získání dat o počasí z webového rozhraní API (Scope): Nakonfigurujte Weather.Get obor pro přístup k externímu webovému rozhraní API pro data o počasí. V následujícím příkladu se zástupný symbol {APP ID URI} nachází v portálu Entra nebo Azure, kde je vystaveno webové rozhraní API. Pro libovolného jiného zprostředkovatele identity použijte příslušný rozsah.
oidcOptions.Scope.Add("{APP ID URI}/Weather.Get");
Formát oboru závisí na typu používaného tenanta. V následujících příkladech je contoso.onmicrosoft.comdoména klienta a ID klienta je 11112222-bbbb-3333-cccc-4444dddd5555.
příklad identifikátoru URI ID aplikace tenanta ME-ID:
oidcOptions.Scope.Add("api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");
Příklad identifikátoru URI ID aplikace tenanta AAD B2C:
oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get");
Authority a ClientId: Nastaví autoritu a ID klienta pro volání OIDC.
oidcOptions.Authority = "{AUTHORITY}";
oidcOptions.ClientId = "{CLIENT ID}";
Následující příklad používá ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee a ID 00001111-aaaa-2222-bbbb-3333cccc4444klienta :
oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
U aplikací s více tenanty by se měla používat "společná" autorita. Můžete také použít "společnou" autoritu pro aplikace s jedním tenantem, ale vyžaduje se vlastní IssuerValidator , jak je znázorněno dále v této části.
oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0";
ResponseType: Nakonfiguruje obslužnou rutinu OIDC tak, aby prováděla pouze tok autorizačního kódu. Implicitní granty a hybridní toky nejsou v tomto režimu zbytečné. Obslužná rutina OIDC automaticky požaduje příslušné tokeny pomocí kódu vráceného z autorizačního koncového bodu.
oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
MapInboundClaims a konfigurace NameClaimType a RoleClaimType: Mnoho serverů OIDC používá "name" a "role" namísto výchozích hodnot SOAP/WS-Fed v rámci ClaimTypes. Pokud je MapInboundClaims nastaveno na false, zpracovatel neprovádí mapování deklarací identity a aplikace přímo využívá názvy deklarací identity z JWT. Následující příklad nastaví typ deklarace identity role na "roles, což je vhodné pro Microsoft Entra ID (ME-ID). Další informace najdete v dokumentaci zprostředkovatele identity.
Note
MapInboundClaims musí být nastavena na false u většiny zprostředkovatelů OIDC, což brání přejmenování nároků.
oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = "name";
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";
Konfigurace cesty: Cesty musí odpovídat identifikátoru URI přesměrování (cesta zpětného volání pro přihlášení) a cestě ke zpětnému přesměrování po odhlášení (cesta zpětného volání po odhlášení) nakonfigurované při registraci aplikace u poskytovatele OIDC. Na webu Azure Portal jsou cesty konfigurovány v panelu Ověřování registrace aplikace. Přihlašovací i odhlašovací cesty musejí být zaregistrované jako identifikátory URI přesměrování. Výchozí hodnoty jsou /signin-oidc a /signout-callback-oidc.
Nakonfigurujte v registraci zprostředkovatele OIDC aplikace cestu zpětného volání pro odhlášení. V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost:{PORT}/signin-oidc
Note
Při použití ID Microsoft Entra se pro tyto adresy port nevyžaduje localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port.
SignedOutCallbackPath (konfigurační klíč: "SignedOutCallbackPath"): Cesta požadavku v rámci základní cesty aplikace zachycená obslužnou rutinou OIDC, kde se agent uživatele poprvé vrátí po odhlášení od zprostředkovatele identity. Ukázková aplikace nenastaví pro cestu hodnotu, protože se použije výchozí hodnota/signout-callback-oidc. Po zachycení požadavku se obslužná rutina OIDC přesměruje na SignedOutRedirectUri nebo RedirectUri, pokud je to specifikováno.
Nakonfigurujte v registraci zprostředkovatele OIDC aplikace cestu zpětného volání pro odhlášení. V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost:{PORT}/signout-callback-oidc
Note
Pokud používáte ID Microsoft Entra, nastavte cestu v konfiguraci platformy Web v položkách identifikátoru URI přesměrování v portálu Entra nebo Azure. Port se při použití Entra nevyžaduje pro adresy localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port. Pokud do registrace aplikace v Entra nepřidáte identifikátor URI cesty zpětného volání po odhlášení, Entra nepřesměruje uživatele zpět do aplikace a pouze je vyzve, aby zavřeli okno prohlížeče.
RemoteSignOutPath: Požadavky přijaté na této cestě způsobí, že obslužná rutina vyvolá odhlášení pomocí schématu pro odhlášení.
V následujícím příkladu je zástupný symbol {PORT} portem aplikace:
https://localhost/signout-oidc
Note
Pokud používáte ID Microsoft Entra, nastavte adresu URL pro odhlášení front-channel v portálu Entra nebo Azure. Port se při použití Entra nevyžaduje pro adresy localhost. Většina ostatních zprostředkovatelů OIDC vyžaduje správný port.
oidcOptions.CallbackPath = new PathString("{PATH}");
oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
oidcOptions.RemoteSignOutPath = new PathString("{PATH}");
Příklady (výchozí hodnoty):
oidcOptions.CallbackPath = new PathString("/signin-oidc");
oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");
(Microsoft Azure pouze s "běžným" koncovým bodem): TokenValidationParameters.IssuerValidatorMnoho zprostředkovatelů OIDC pracuje s výchozím validátorem vystavitele, ale musíme počítat s parametrizovaným vystavitelem s ID tenanta ({TENANT ID}) vráceným https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration. Další informace najdete v tématu SecurityTokenInvalidIssuerException s OpenID Connect a běžným koncovým bodem Azure AD (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).
Pouze pro aplikace používající Microsoft Entra ID nebo Azure AD B2C s "běžným" koncovým bodem:
var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;
Klientský projekt Blazor Web App (BlazorWebAppOidc.Client)
Projekt BlazorWebAppOidc.Client je klientská část projektu Blazor Web App.
Klient volá AddAuthenticationStateDeserialization ke deserializaci a používá stav ověřování, který byl předán serverem. Stav ověřování je nastavený na celou dobu životnosti aplikace WebAssembly.
PersistentAuthenticationStateProvider Třída (PersistentAuthenticationStateProvider.cs) je klientská strana AuthenticationStateProvider, která určuje stav ověření uživatele hledáním dat uchovaných na stránce při vykreslování na serveru. Stav ověřování je nastavený na celou dobu životnosti aplikace WebAssembly.
Pokud se uživatel potřebuje přihlásit nebo odhlásit, vyžaduje se opětovné načtení celé stránky.
Ukázková aplikace poskytuje jenom uživatelské jméno a e-mail pro účely zobrazení.
Serializovat pouze deklarace názvů a rolí
Tato část se týká jenom vzoru jiného typu než BFF (Interactive Auto) a BFF (Interactive Auto) a jejich ukázkových aplikací.
V souboru Program jsou všechny nároky serializovány tím, že se nastaví SerializeAllClaims na true. Pokud chcete, aby se deklarace identity názvu a role serializovaly pouze pro CSR, odeberte možnost nebo ji nastavte na false.
Poskytnutí konfigurace pomocí zprostředkovatele konfigurace JSON (nastavení aplikace)
Ukázkové projekty řešení konfigurují ověřování nosného kódu OIDC a JWT ve svých Program souborech, aby bylo možné zjistit nastavení konfigurace pomocí automatického dokončování jazyka C#. Profesionální aplikace obvykle používají zprostředkovatele konfigurace ke konfiguraci možností OIDC, jako je výchozí zprostředkovatel konfigurace JSON. Zprostředkovatel konfigurace JSON načte konfiguraci ze souborů appsettings.json/appsettings.{ENVIRONMENT}.json, které obsahují nastavení aplikace, kde {ENVIRONMENT} zástupný symbol je provozní prostředí aplikace. Pokud chcete ke konfiguraci použít soubory nastavení aplikace, postupujte podle pokynů v této části.
Do souboru nastavení aplikace (appsettings.json) BlazorWebAppOidc projektu nebo BlazorWebAppOidcServer projektu přidejte následující konfiguraci JSON:
"Authentication": {
"Schemes": {
"MicrosoftOidc": {
"Authority": "https://login.microsoftonline.com/{TENANT ID (BLAZOR APP)}/v2.0",
"ClientId": "{CLIENT ID (BLAZOR APP)}",
"CallbackPath": "/signin-oidc",
"SignedOutCallbackPath": "/signout-callback-oidc",
"RemoteSignOutPath": "/signout-oidc",
"SignedOutRedirectUri": "/",
"Scope": [
"openid",
"profile",
"offline_access",
"{APP ID URI (WEB API)}/Weather.Get"
]
}
}
},
Aktualizujte zástupné symboly v předchozí konfiguraci tak, aby odpovídaly hodnotám, které aplikace používá v Program souboru:
-
{TENANT ID (BLAZOR APP)}: ID tenanta aplikace Blazor. -
{CLIENT ID (BLAZOR APP)}: ID Blazor klienta aplikace. -
{APP ID URI (WEB API)}: Identifikátor URI ID aplikace webového rozhraní API.
Pro aplikace s více tenanty by se měla používat "společná" autorita (https://login.microsoftonline.com/common/v2.0). Pokud chcete použít "společnou" autoritu pro aplikace s jedním tenantem, přečtěte si část Použití společné autority pro aplikace s jedním tenantem .
Aktualizujte všechny ostatní hodnoty v předchozí konfiguraci tak, aby odpovídaly vlastním nebo jiným než výchozím hodnotám používaným Program v souboru.
Konfigurace se automaticky načte sestavovatelem ověřování.
Ze souboru odeberte následující řádky Program :
- oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
- oidcOptions.Scope.Add("...");
- oidcOptions.CallbackPath = new PathString("...");
- oidcOptions.SignedOutCallbackPath = new PathString("...");
- oidcOptions.RemoteSignOutPath = new PathString("...");
- oidcOptions.Authority = "...";
- oidcOptions.ClientId = "...";
ConfigureCookieOidc V metodě CookieOidcServiceCollectionExtensions.cs odebrat následující řádek:
- oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
MinimalApiJwt V projektu přidejte do appsettings.json souboru následující konfiguraci nastavení aplikace:
"Authentication": {
"Schemes": {
"Bearer": {
"Authority": "https://sts.windows.net/{TENANT ID (WEB API)}",
"ValidAudiences": [ "{APP ID URI (WEB API)}" ]
}
}
},
Aktualizujte zástupné symboly v předchozí konfiguraci tak, aby odpovídaly hodnotám, které aplikace používá v Program souboru:
-
{TENANT ID (WEB API)}: ID tenanta webového rozhraní API. -
{APP ID URI (WEB API)}: Identifikátor URI ID aplikace webového rozhraní API.
Formáty autorit přijímají následující vzory:
- typ tenanta ME-ID:
https://sts.windows.net/{TENANT ID} - Externí ID Microsoft Entra:
https://{DIRECTORY NAME}.ciamlogin.com/{TENANT ID}/v2.0 - Typ nájemce B2C:
https://login.microsoftonline.com/{TENANT ID}/v2.0
Formáty cílové skupiny přijímají následující vzory ({CLIENT ID} je ID klienta webového rozhraní API; {DIRECTORY NAME} je název adresáře, contosonapříklad ):
- typ tenanta ME-ID:
api://{CLIENT ID} - Externí ID Microsoft Entra:
{CLIENT ID} - Typ nájemce B2C:
https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
Konfigurace je automaticky zpracovávána tvůrcem autentizace JWT bearer.
Ze souboru odeberte následující řádky Program :
- jwtOptions.Authority = "...";
- jwtOptions.Audience = "...";
Další informace o konfiguraci najdete v následujících zdrojích informací:
- Konfigurace v ASP.NET Core
- Konfigurace Blazor pro ASP.NET Core
Použijte "běžnou" autoritu pro aplikace s jedním tenantem
Pro aplikace s jedním tenantem můžete použít "společnou" autoritu, ale k implementaci vlastního validátoru vystavitele musíte provést následující kroky.
Microsoft.IdentityModel.Validators Přidejte balíček NuGet do BlazorWebAppOidcsouboru , BlazorWebAppOidcServernebo BlazorWebAppOidcBff projektu.
Note
Pokyny k přidávání balíčků do aplikací .NET najdete v článcích v části Instalace a správa balíčků na webu Pracovní postup používání balíčků (dokumentace k NuGetu). Ověřte správné verze balíčků na NuGet.org.
V horní části souboru Program provedeme úpravu, aby byl obor názvů Microsoft.IdentityModel.Validators k dispozici:
using Microsoft.IdentityModel.Validators;
V souboru, kde jsou nakonfigurované možnosti OIDC, použijte následující Program kód:
var microsoftIssuerValidator =
AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
oidcOptions.TokenValidationParameters.IssuerValidator =
microsoftIssuerValidator.Validate;
Další informace najdete v tématu SecurityTokenInvalidIssuerException s OpenID Connect a běžným koncovým bodem Azure AD (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).
Přesměrování na domovskou stránku při odhlášení
Komponenta LogInOrOut (Layout/LogInOrOut.razor) nastaví skryté pole pro zpáteční adresu URL (ReturnUrl) na aktuální adresu URL (currentURL). Když se uživatel z aplikace odhlásí, zprostředkovatel identity vrátí uživatele na stránku, ze které se odhlásil. Pokud se uživatel odhlásí ze zabezpečené stránky, vrátí se na stejnou zabezpečenou stránku a odešle se zpět prostřednictvím procesu ověřování. Tento tok ověřování je přiměřený, když uživatelé potřebují pravidelně měnit účty.
Případně použijte následující LogInOrOut komponentu, která při odhlášení nezadává zpáteční adresu URL.
Layout/LogInOrOut.razor:
<div class="nav-item px-3">
<AuthorizeView>
<Authorized>
<form action="authentication/logout" method="post">
<AntiforgeryToken />
<button type="submit" class="nav-link">
<span class="bi bi-arrow-bar-left-nav-menu" aria-hidden="true">
</span> Logout
</button>
</form>
</Authorized>
<NotAuthorized>
<a class="nav-link" href="authentication/login">
<span class="bi bi-person-badge-nav-menu" aria-hidden="true"></span>
Login
</a>
</NotAuthorized>
</AuthorizeView>
</div>
Aktualizace tokenu
Implementace vlastního cookie refresheru (CookieOidcRefresher.cs) aktualizuje deklarace identity uživatele automaticky, jakmile vyprší jejich platnost. Aktuální implementace očekává, že obdrží token ID z koncového bodu tokenu výměnou za obnovovací token. Nároky v tomto ID tokenu se pak použijí k přepsání nároků uživatele.
Ukázková implementace neobsahuje kód pro vyžádání deklarací identity z koncového bodu UserInfo při aktualizaci tokenu. Další informace najdete v tématu BlazorWebAppOidc AddOpenIdConnect with GetClaimsFromUserInfoEndpoint = true doesn't propogate [sic] role claims to client (dotnet/aspnetcore #58826).
Note
Někteří zprostředkovatelé identity vracejí přístupový token pouze při použití obnovovacího tokenu.
CookieOidcRefresher je možné aktualizovat pomocí další logiky, abyste mohli dál používat předchozí sadu deklarací identity uložených v ověřovacím cookie nebo použít přístupový token k vyžádání deklarací identity z koncového bodu UserInfo.
Kryptografická nešifrovaná
Nonce
Pokud během vývoje a testování ověřování obdržíte chybu nonce, použijte pro každé testovací spuštění novou relaci prohlížeče InPrivate nebo inkognito, bez ohledu na to, jak malá je změna provedená v aplikaci nebo testovacím uživateli, protože zastaralá data mohou vést k chybě nonce. Další informace najdete v části Soubory cookie a data webu.
Nonce se nepožaduje ani nepoužívá, když se obnovovací token vymění za nový přístupový token. V ukázkové aplikaci CookieOidcRefresher (CookieOidcRefresher.cs) záměrně nastavuje OpenIdConnectProtocolValidator.RequireNonce na false.
Aplikační role pro aplikace, které nejsou zaregistrované v Microsoft Entra (ME-ID)
Tato část se týká aplikací, které jako zprostředkovatele identity nepoužívají Microsoft Entra ID (ME-ID). U aplikací registrovaných pomocí ME-ID se podívejte na role aplikací zaregistrovaných v části Microsoft Entra (ME-ID).
Nakonfigurujte typ deklarace role (TokenValidationParameters.RoleClaimType) v OpenIdConnectOptions:Program.cs
oidcOptions.TokenValidationParameters.RoleClaimType = "{ROLE CLAIM TYPE}";
Pro mnoho zprostředkovatelů identity OIDC je typ deklarace role role. Zkontrolujte správnou hodnotu v dokumentaci zprostředkovatele identity.
UserInfo Nahraďte třídu v BlazorWebAppOidc.Client projektu následující třídou.
UserInfo.cs:
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using System.Security.Claims;
namespace BlazorWebAppOidc.Client;
// Add properties to this class and update the server and client
// AuthenticationStateProviders to expose more information about
// the authenticated user to the client.
public sealed class UserInfo
{
public required string UserId { get; init; }
public required string Name { get; init; }
public required string[] Roles { get; init; }
public const string UserIdClaimType = "sub";
public const string NameClaimType = "name";
private const string RoleClaimType = "role";
public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) =>
new()
{
UserId = GetRequiredClaim(principal, UserIdClaimType),
Name = GetRequiredClaim(principal, NameClaimType),
Roles = principal.FindAll(RoleClaimType).Select(c => c.Value)
.ToArray(),
};
public ClaimsPrincipal ToClaimsPrincipal() =>
new(new ClaimsIdentity(
Roles.Select(role => new Claim(RoleClaimType, role))
.Concat([
new Claim(UserIdClaimType, UserId),
new Claim(NameClaimType, Name),
]),
authenticationType: nameof(UserInfo),
nameType: NameClaimType,
roleType: RoleClaimType));
private static string GetRequiredClaim(ClaimsPrincipal principal,
string claimType) =>
principal.FindFirst(claimType)?.Value ??
throw new InvalidOperationException(
$"Could not find required '{claimType}' claim.");
}
V tuto chvíli Razor můžou komponenty přijímat autorizaci na základě rolí a na základě zásad. Role aplikace se zobrazují v role nárocích, jeden nárok na každou roli.
Aplikační role pro aplikace zaregistrované v Microsoft Entra (ME-ID)
Pokyny v této části použijte k implementaci aplikačních rolí, skupin zabezpečení ME-ID a předdefinovaných rolí správce ME-ID pro aplikace pomocí Microsoft Entra ID (ME-ID).
Přístup popsaný v této části konfiguruje ME-ID pro odesílání skupin a rolí v hlavičce ověřování cookie . Pokud jsou uživatelé členem pouze několika skupin zabezpečení a rolí, měl by následující přístup fungovat pro většinu hostitelských platforem, aniž by narazili na problém, kdy hlavičky jsou příliš dlouhé, například u hostování služby IIS s výchozím limitem délky záhlaví 16 kB (MaxRequestBytes). Pokud je délka záhlaví problém kvůli vysokému členství ve skupině nebo členství v rolích, raději doporučujeme implementovat Microsoft Graph pro získání skupin a rolí uživatele z ME-ID samostatně, což je přístup, který nezvětšuje velikost ověřování cookie. Další informace naleznete v tématu Chybný požadavek – Požadavek je příliš dlouhý – Server IIS (dotnet/aspnetcore #57545).
Nakonfigurujte typ deklarace role (TokenValidationParameters.RoleClaimType) v souboru OpenIdConnectOptionsProgram.cs. Nastavte hodnotu na roles:
oidcOptions.TokenValidationParameters.RoleClaimType = "roles";
I když nemůžete přiřadit role skupinám bez účtu ME-ID Premium, můžete přiřadit role uživatelům a přijímat deklarace rolí pro uživatele se standardním účtem Azure. Pokyny v této části nevyžadují účet ME-ID Premium.
Při práci s výchozím adresářem postupujte podle pokynů v Přidání rolí aplikace do vaší aplikace a jejich přijetí v tokenu (dokumentace k ME-ID) pro konfiguraci a přiřazení rolí. Pokud nepracujete s výchozím adresářem, upravte manifest aplikace na webu Azure Portal a nastavte role aplikace ručně v appRoles položce souboru manifestu. Další informace najdete v tématu Konfigurace deklarace identity role (dokumentace k ME-ID).
Skupiny zabezpečení Azure uživatele se objevují v groups deklaracích identity a přiřazení rolí správce ME-ID z vestavěných funkcí se objevují ve známých ID deklaracích (wids). Hodnoty obou typů nároků jsou identifikátory GUID. Po přijetí aplikací je možné tyto nároky použít k vytvoření autorizace rolí a zásad v Razor komponentách.
V manifestu aplikace na webu Azure Portal nastavte groupMembershipClaims atribut na All. Hodnota All má za následek, že ME-ID odesílá všechny skupiny zabezpečení a distribuce (groups příznaky) a role (wids příznaky) přihlášeného uživatele. Nastavení atributu groupMembershipClaims :
- Otevřete registraci aplikace na webu Azure Portal.
- Na bočním panelu vyberte Spravovat>manifest.
- Vyhledejte
groupMembershipClaimsatribut. - Nastavte hodnotu na
All("groupMembershipClaims": "All"). - Vyberte tlačítko Uložit.
UserInfo Nahraďte třídu v BlazorWebAppOidc.Client projektu následující třídou.
UserInfo.cs:
using Microsoft.AspNetCore.Components.WebAssembly.Authentication;
using System.Security.Claims;
namespace BlazorWebAppOidc.Client;
// Add properties to this class and update the server and client
// AuthenticationStateProviders to expose more information about
// the authenticated user to the client.
public sealed class UserInfo
{
public required string UserId { get; init; }
public required string Name { get; init; }
public required string[] Roles { get; init; }
public required string[] Groups { get; init; }
public required string[] Wids { get; init; }
public const string UserIdClaimType = "sub";
public const string NameClaimType = "name";
private const string RoleClaimType = "roles";
private const string GroupsClaimType = "groups";
private const string WidsClaimType = "wids";
public static UserInfo FromClaimsPrincipal(ClaimsPrincipal principal) =>
new()
{
UserId = GetRequiredClaim(principal, UserIdClaimType),
Name = GetRequiredClaim(principal, NameClaimType),
Roles = principal.FindAll(RoleClaimType).Select(c => c.Value)
.ToArray(),
Groups = principal.FindAll(GroupsClaimType).Select(c => c.Value)
.ToArray(),
Wids = principal.FindAll(WidsClaimType).Select(c => c.Value)
.ToArray(),
};
public ClaimsPrincipal ToClaimsPrincipal() =>
new(new ClaimsIdentity(
Roles.Select(role => new Claim(RoleClaimType, role))
.Concat(Groups.Select(role => new Claim(GroupsClaimType, role)))
.Concat(Wids.Select(role => new Claim(WidsClaimType, role)))
.Concat([
new Claim(UserIdClaimType, UserId),
new Claim(NameClaimType, Name),
]),
authenticationType: nameof(UserInfo),
nameType: NameClaimType,
roleType: RoleClaimType));
private static string GetRequiredClaim(ClaimsPrincipal principal,
string claimType) =>
principal.FindFirst(claimType)?.Value ??
throw new InvalidOperationException(
$"Could not find required '{claimType}' claim.");
}
V tomto okamžiku Razor můžou komponenty přijímat autorizaci na základě rolí a zásad:
- Role aplikace se zobrazují v
rolesnárocích, jeden nárok na každou roli. - Skupiny zabezpečení se zobrazují v
groupsnárocích, jeden nárok na skupinu. Identifikátory GUID skupin zabezpečení se zobrazí v portálu Azure při vytváření skupiny zabezpečení a jsou uvedeny při výběru Identity>Přehled>Skupiny>Zobrazení. - Předdefinované role správce ME-ID se zobrazují v
widsnárocích, jeden nárok na roli. Deklaracewidss hodnotoub79fbf4d-3ef9-4689-8143-76b194e85509je vždy odeslána ME-ID pro ne-hostující účty tenanta a neodkazuje na roli správce. Identifikátory GUID rolí správce (ID šablon rolí) se zobrazí v portálu Azure při výběru Rolí a správců, následuje kliknutí na elipsu (…) >Popis uvedené role. ID šablon rolí jsou uvedená také v předdefinovaných rolích Microsoft Entra (dokumentace k Entra).
Alternativní řešení: Správa přístupových tokenů Duende
V ukázkové aplikaci se k automatické neinteraktivní aktualizaci tokenů používá vlastní cookie implementace aktualizačního modulu (CookieOidcRefresher.cs). Alternativní řešení najdete v opensourcovém Duende.AccessTokenManagement.OpenIdConnect balíčku.
Služba Duende Access Token Management poskytuje funkce automatické správy přístupových tokenů pro pracovní proces .NET a webové aplikace ASP.NET Core, včetně Blazor, bez nutnosti přidat vlastní cookie aktualizační nástroj.
Po instalaci balíčku odeberte CookieOidcRefresher a přidejte správu přístupového tokenu pro aktuálně přihlášeného uživatele v Program souboru:
// Add services for token management
builder.Services.AddOpenIdConnectAccessTokenManagement();
// Register a typed HTTP client with token management support
builder.Services.AddHttpClient<InvoiceClient>(client =>
{
client.BaseAddress = new Uri("https://api.example.com/invoices/");
})
.AddUserAccessTokenHandler();
Zadaný klient HTTP (nebo pojmenovaný klient HTTP, pokud je implementovaný) má automatickou správu životnosti přístupového tokenu jménem aktuálně přihlášeného uživatele, včetně transparentní správy tokenů aktualizace.
Další informace naleznete v dokumentaci ke správě přístupových tokenů Duende pro Blazor.
Troubleshoot
Logging
Serverová aplikace je standardní aplikace ASP.NET Core. Informace o povolení nižší úrovně protokolování v serverové aplikaci najdete v pokynech k protokolování ASP.NET Core.
Pokud chcete povolit protokolování ladění nebo trasování pro Blazor WebAssembly ověřování, přečtěte si část protokolování ověřování na straně klientaASP.NET Core Blazor s výběrem verze článku nastavit na ASP.NET Core v .NET 7 nebo novějším.
Běžné chyby
Ladicí program se zastaví na výjimce při odhlašování s externím ID Microsoft Entra
Následující výjimka zastaví ladicí program Visual Studio při odhlašování s Microsoft Entra External ID:
Uncaught TypeError TypeError: Failed to execute 'postMessage' on 'Window': The provided value cannot be converted to a sequence.
Výjimka je vyvolána z JavaScriptového kódu Entra, takže to není problém s ASP.NET Core. Tato výjimka nemá vliv na funkčnost aplikace v produkčním prostředí, takže výjimku je možné ignorovat během místního testování vývoje.
Chybná konfigurace aplikace nebo Identity poskytovatele (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 zabrá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 ověřovat klienty.
- Nesprávné obory požadavků 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 nakonfigurováno v přesměrovávacím URI registrace aplikace IP. Všimněte si, že port není nutný pro Microsoft Entra ID a aplikaci spuštěnou na adrese pro testování vývoje (
localhost), ale nastavení portu aplikace a port, na kterém je aplikace spuštěná, se musí shodovat pro jiné adresy nežlocalhost.
Tento článek obsahuje příklady správného nastavení konfigurace. Pečlivě zkontrolujte konfiguraci kvůli nesprávné konfiguraci aplikace a IP adres.
Pokud se konfigurace zobrazí správně:
Analyzujte protokoly aplikace.
Prozkoumejte síťový provoz mezi klientskou aplikací a IP nebo serverovou aplikací pomocí vývojářských nástrojů prohlížeče. Často je přesná chybová zpráva nebo zpráva s povědomím o příčině problému vrácena klientovi ip adresou nebo serverovou aplikací po provedení požadavku. Pokyny ke vývojářským nástrojům najdete v následujících článcích.
- Google Chrome (dokumentace Google)
- Microsoft Edge
- Mozilla Firefox (dokumentace k Mozilla)
Tým dokumentace reaguje na zpětnou vazbu a chyby v článcích (otevřete nový požadavek v sekci zpětné vazby na této stránce), ale nemůže poskytnout podporu k produktům. K dispozici je několik veřejných fór podpory, která vám pomůžou s řešením potíží s aplikací. Doporučujeme následující:
Předchozí fóra nejsou vlastněna ani řízena Společností Microsoft.
V případě reprodukovatelných hlášení chyb rozhraní, které nejsou nezabezpečené, nedůvěrné a necitlivé, zadejte problém produktové jednotce ASP.NET Core. Neotevírejte problém s produktovou jednotkou, dokud důkladně 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 nedokáž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á povahy nebo popisuje potenciální chybu zabezpečení v produktu, kterou mohou kyberútočníci zneužít, přečtěte si téma Hlášení bezpečnostních problémů a chyb (
dotnet/aspnetcoreúložiště GitHub).Neautorizovaný klient pro ME-ID
info: Autorizace Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] selhala. Tyto požadavky nebyly splněny: DenyAnonymousAuthorizationRequirement: Vyžaduje ověřeného uživatele.
Chyba zpětného volání přihlášení z ME-ID:
- Chyba:
unauthorized_client - Popis:
AADB2C90058: The provided application is not configured to allow public clients.
Řešení chyby:
- Na webu Azure Portal přejděte k manifestu aplikace.
-
allowPublicClientNastavte atribut nanullnebotrue.
- Chyba:
Soubory cookie a data webu
Soubory cookie a data webu se můžou uchovávat v aktualizacích aplikací a kolidovat s testováním a odstraňování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 poskytovatele zrušte následující:
- Soubory cookie přihlašování uživatelů
- Soubory cookie aplikace
- Data webu uložená v mezipaměti a uložená
Jedním z přístupů k tomu, aby se zabránilo zasahování souborů cookie a dat webu do testování a řešení potíží, je:
- Konfigurace prohlížeče
- K testování můžete použít prohlížeč, který můžete nakonfigurovat tak, aby při každém zavření prohlížeče odstranil všechna cookie data a data webu.
- Ujistěte se, že je prohlížeč zavřený ručně, nebo že ho zavře integrované vývojové prostředí (IDE) při každé změně aplikace, testovacího uživatele nebo konfigurace poskytovatele.
- Pomocí vlastního příkazu otevřete prohlížeč v režimu InPrivate nebo Incognito v sadě Visual Studio:
- Otevřete dialogové okno Procházet pomocí z tlačítka Spustit ve Visual Studio.
- 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ý v jiném umístění nebo nepoužíváte 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:
-
V poli Argumenty zadejte možnost příkazového řádku, kterou prohlížeč používá k otevření v režimu InPrivate nebo Anonymní režim. Některé prohlížeče vyžadují adresu URL aplikace.
- Microsoft Edge: Použijte
-inprivate. - Google Chrome: Použijte
--incognito --new-window {URL}, kde místo{URL}je adresa URL k otevření (napříkladhttps://localhost:5001). - Mozilla Firefox: Použijte
-private -url {URL}, kde je{URL}zástupný znak pro adresu URL k otevření (napříkladhttps://localhost:5001).
- Microsoft Edge: Použijte
- Do pole Uživatelsky příjemný 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í tlačítkem Nastavit jako výchozí .
- Ujistěte se, že integrované vývojové prostředí (IDE) zavře prohlížeč při jakékoliv změně aplikace, testovacího uživatele nebo konfigurace poskytovatele.
Upgrady aplikací
Funkční aplikace může selhat okamžitě po upgradu sady .NET SDK na vývojovém počítači nebo změně verzí balíčků v aplikaci. V některých případech můžou inkoherentní balíčky přerušit aplikaci při provádění hlavních upgradů. Většinu těchto problémů je možné vyřešit pomocí těchto pokynů:
- Vymažte mezipaměti balíčků NuGet místního systému spuštěním
dotnet nuget locals all --clearz příkazového prostředí. - Odstraňte složky
binaobjprojektu. - Obnovte a znovu sestavte projekt.
- Před opětovným nasazením aplikace odstraňte všechny soubory ve složce nasazení na serveru.
Note
Použití verzí balíčků nekompatibilních s cílovou architekturou aplikace se nepodporuje. Informace o balíčku najdete v galerii NuGet.
Spuštění řešení ze správného projektu
Blazor Web Apps:
- U jedné z ukázek vzorů typu Backend-for-Frontend (BFF) začněte řešení z projektu
Aspire/Aspire.AppHost. - V případě jedné z ukázek vzorů, které nejsou BFF, spusťte řešení ze serverového projektu.
Blazor Server:
Spusťte řešení ze serverového projektu.
Kontrola uživatele
Následující UserClaims komponentu lze použít přímo v aplikacích nebo sloužit jako základ pro další přizpůsobení.
UserClaims.razor:
@page "/user-claims"
@using System.Security.Claims
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]
<PageTitle>User Claims</PageTitle>
<h1>User Claims</h1>
@if (claims.Any())
{
<ul>
@foreach (var claim in claims)
{
<li><b>@claim.Type:</b> @claim.Value</li>
}
</ul>
}
@code {
private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();
[CascadingParameter]
private Task<AuthenticationState>? AuthState { get; set; }
protected override async Task OnInitializedAsync()
{
if (AuthState == null)
{
return;
}
var authState = await AuthState;
claims = authState.User.Claims;
}
}
Dodatečné zdroje
-
AzureAD/microsoft-identity-webÚložiště GitHub: Užitečné pokyny k implementaci Microsoft Web for Microsoft Identity Entra ID a Azure Active Directory B2C pro aplikace ASP.NET Core, včetně odkazů na ukázkové aplikace a související dokumentace k Azure. V současné době nejsou Blazor Web Apps výslovně řešené dokumentací k Azure, ale nastavení a konfigurace pro ME-ID a hostování Azure jsou stejné jako u jakékoli webové aplikace ASP.NET Core. -
AuthenticationStateProviderslužba - Správa stavu ověřování v Blazor Web Apps
-
Obnovovací token při HTTP požadavku na Blazor interaktivním serveru s OIDC (
dotnet/aspnetcore#55213) - Zabezpečte data v Blazor Web Apps pomocí interaktivního automatického vykreslování
-
Jak získat přístup k
AuthenticationStateProviderzDelegatingHandler