Zabezpečení ASP.NET Core Blazor Web App pomocí OpenID Connect (OIDC)
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální vydání najdete v článku verze .NET 9.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Aktuální vydání najdete v článku verze .NET 9.
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).
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.
Probírá 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
- Bezpečně volá rozhraní API (webové) v serverovém projektu pro získání dat.
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á aplikace
Ukázková aplikace se skládá ze dvou 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.
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ší.
Zobrazení nebo stažení ukázkového kódu (postup stažení)
Serverový Blazor Web App projekt (BlazorWebAppOidc
)
Projekt BlazorWebAppOidc
je projekt na straně serveru Blazor Web App.
Soubor BlazorWebAppOidc.http
lze použít k testování žádosti o data o počasí. Mějte na paměti, že projekt BlazorWebAppOidc
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.
Konfigurace
Tato část vysvětluje, jak nakonfigurovat ukázkovou aplikaci.
Poznámka:
Pro Microsoft Entra ID nebo Azure AD B2C můžete použít
Nastavte tajný klíč klienta
Varování
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í tajného klíče klienta serverové aplikace pod konfiguračním klíčem Authentication:Schemes:MicrosoftOidc:ClientSecret
.
Poznámka:
Pokud aplikace používá Microsoft Entra ID nebo Azure AD B2C, vytvořte tajný klíč klienta v registraci aplikace na Portálu Entra nebo Azure (Spravovat>Certifikáty a tajné klíče>Nový tajný klíč klienta). Hodnotu nového tajného kódu použijte v následujících doprovodných materiálech.
Ukázková aplikace nebyla inicializována 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ů.
Konfigurace aplikace
Následující OpenIdConnectOptions konfigurace je uvedena v souboru projektu Program
při volání AddOpenIdConnect:
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
aprofile
(Scope) (volitelné): Rozsahyopenid
aprofile
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 konfiguraciAuthentication: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}";
Příklad:
- Autorita ():
{AUTHORITY}
(https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/
používá IDaaaabbbb-0000-cccc-1111-dddd2222eeee
tenanta) - ID klienta (
{CLIENT ID}
):00001111-aaaa-2222-bbbb-3333cccc4444
oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/"; oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
Příklad pro "společnou" autoritu Microsoft Azure:
Pro aplikace 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/";
- Autorita ():
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;
Poznámka:
V konfiguraci registrace aplikace v části Entra nebo Azure Portal Implicitní udělení a hybridní toky nevybírejte ani jedno z políček pro koncový bod autorizace pro vracení přístupových tokenů nebo ID tokenů.
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 nafalse
, 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.Poznámka:
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 se cesty konfigurují v okně 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
Poznámka:
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
Poznámka:
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 odhlášení.
V následujícím příkladu je zástupný symbol
{PORT}
portem aplikace:https://localhost/signout-oidc
Poznámka:
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 zohlednit vystavitele parametrizovaného s ID tenanta (
{TENANT ID}
) vrácenýmhttps://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;
Ukázkový kód aplikace
Zkontrolujte ukázkovou aplikaci a zkontrolujte následující funkce:
- Automatická neinteraktivní aktualizace tokenů pomocí vlastního cookie aktualizačního modulu (
CookieOidcRefresher.cs
). - 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.
- Příkladem požadavků na Blazor Web App data o počasí je zpracováván minimálním koncovým bodem rozhraní API (
/weather-forecast
) v souboruProgram
(Program.cs
). 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 v serverovém projektu pro data o počasí.
- Při vykreslování
Weather
komponenty na serveru komponenta používá komponentuServerWeatherForecaster
na serveru k přímému získání dat o počasí (ne prostřednictvím volání webového rozhraní API). - Při vykreslení komponenty na straně klienta používá komponenta implementaci služby
ClientWeatherForecaster
, která používá předkonfigurované HttpClient (v souboruProgram
klientského projektu) k volání webového rozhraní API na projekt serveru. Minimální koncový bod rozhraní API (/weather-forecast
) definovaný v souboru projektuProgram
serveru získá data o počasí zServerWeatherForecaster
klienta a vrátí data klientovi.
- Při vykreslování
- Automatická neinteraktivní aktualizace tokenů pomocí vlastního cookie aktualizačního modulu (
CookieOidcRefresher.cs
). -
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. - Příkladem požadavků na Blazor Web App data o počasí je zpracováván minimálním koncovým bodem rozhraní API (
/weather-forecast
) v souboruProgram
(Program.cs
). 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. - Aplikace bezpečně volá webové API v serverovém projektu pro data o počasí.
- Při vykreslování
Weather
komponenty na serveru komponenta používá komponentuServerWeatherForecaster
na serveru k přímému získání dat o počasí (ne prostřednictvím volání webového rozhraní API). - Při vykreslení komponenty v klientovi používá
ClientWeatherForecaster
komponenta implementaci služby, která používá předkonfigurované HttpClient (v souboru klientskéhoProgram
projektu) k volání webového rozhraní API do projektu serveru. Minimální koncový bod rozhraní API (/weather-forecast
) definovaný v souboru projektuProgram
serveru získá data o počasí zServerWeatherForecaster
klienta a vrátí data klientovi.
- Při vykreslování
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.
Projekt na straně Blazor Web App klienta (BlazorWebAppOidc.Client
)
Projekt BlazorWebAppOidc.Client
je projekt Blazor Web App na straně 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.
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í. Nezahrnuje tokeny pro autentizaci na serveru při dalších požadavcích; ty fungují samostatně s využitím cookie, které jsou zahrnuty v požadavcích na HttpClient server.
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 .
Probírá 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
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á aplikace
Ukázková aplikace se skládá z jednoho projektu Blazor Web App na straně serveru (BlazorWebAppOidcServer
).
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í)
Konfigurace
Tato část vysvětluje, jak nakonfigurovat ukázkovou aplikaci.
Poznámka:
Pro Microsoft Entra ID nebo Azure AD B2C můžete použít
Nastavte tajný klíč klienta
Varování
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í tajného klíče klienta aplikace pod konfiguračním klíčem Authentication:Schemes:MicrosoftOidc:ClientSecret
.
Poznámka:
Pokud aplikace používá Microsoft Entra ID nebo Azure AD B2C, vytvořte tajný klíč klienta v registraci aplikace na Portálu Entra nebo Azure (Spravovat>Certifikáty a tajné klíče>Nový tajný klíč klienta). Hodnotu nového tajného kódu použijte v následujících doprovodných materiálech.
Ukázková aplikace nebyla inicializována 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 spuštěním příkazu změňte adresář pomocí příkazu cd
na adresář projektu. 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ů.
Konfigurace aplikace
Následující OpenIdConnectOptions konfigurace se nachází v souboru projektu Program
při volání AddOpenIdConnect:
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
aprofile
(Scope) (volitelné): Rozsahyopenid
aprofile
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 konfiguraciAuthentication: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}";
Příklad:
- Autorita ():
{AUTHORITY}
(https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/
používá IDaaaabbbb-0000-cccc-1111-dddd2222eeee
tenanta) - ID klienta (
{CLIENT ID}
):00001111-aaaa-2222-bbbb-3333cccc4444
oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/"; oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
Příklad pro "společnou" autoritu Microsoft Azure:
Pro aplikace 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/";
- Autorita ():
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;
Poznámka:
V konfiguraci registrace aplikace v části Entra nebo Azure Portal Implicitní udělení a hybridní toky nevybírejte ani jedno z políček pro koncový bod autorizace pro vracení přístupových tokenů nebo ID tokenů.
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 nafalse
, 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.Poznámka:
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 se cesty konfigurují v okně 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
Poznámka:
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
Poznámka:
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 odhlášení.
V následujícím příkladu je zástupný symbol
{PORT}
portem aplikace:https://localhost/signout-oidc
Poznámka:
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 se společným koncovým bodem): TokenValidationParameters.IssuerValidatorMnoho zprostředkovatelů OIDC pracuje s výchozím validátorem vystavitele, ale musíme počítat s vystavitelem parametrizovaným pomocí ID tenanta (
{TENANT ID}
) vrácenýmhttps://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;
Ukázkový kód aplikace
Zkontrolujte ukázkovou aplikaci a zkontrolujte následující funkce:
- Automatická neinteraktivní aktualizace tokenů pomocí vlastního cookie aktualizačního modulu (
CookieOidcRefresher.cs
). - 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. Další informace o tom, jak tato aplikace zabezpečuje data o počasí, najdete v části Zabezpečení dat v Blazor Web Apps interaktivním automatickým vykreslováním.
Tato verze článku popisuje implementaci OIDC pomocí vzoru Backend for Frontend (BFF). Změňte selektor verze článku na vzor bez BFF (Interaktivní Auto) (vykreslování Interaktivního Auta) nebo vzor bez BFF (Interaktivní Server) (vykreslování Interaktivního Serveru), pokud specifikace aplikace nevyžaduje přijetí vzoru BFF.
Probírá 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
- Model Back-endu pro front-end (BFF) je přijat pomocí .NET 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.
- Back-endové webové rozhraní API používá ověřování pomocí JWT-bearer k ověření tokenů JWT uložených Blazor Web App při přihlášení 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.
Další informace o .NET Aspire najdete v části Obecná dostupnost .NET Aspire: Zjednodušení vývoje cloudových aplikací v .NET (květen 2024).
Požadavek
.NET Aspire vyžaduje Visual Studio verze 17.10 nebo novější.
Viz také část Požadavky Rychlý start : Sestavení Vaší první .NET Aspire aplikace.
Ukázková aplikace
Ukázková aplikace se skládá z pěti projektů:
-
.NET Aspire:
-
Aspire.AppHost
: Slouží ke správě problémů orchestrace vysoké úrovně aplikace. -
Aspire.ServiceDefaults
: Obsahuje výchozí .NET 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. -
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í)
.NET Aspire projektů
Další informace o použití .NET Aspire a .AppHost
podrobnostech o .ServiceDefaults
projektech ukázkové aplikace najdete v .NET Aspire dokumentaci.
Ověřte, že jste splnili požadavky pro .NET Aspire. Další informace najdete v části Požadavky v rychlém startu : Sestavení první .NET Aspire aplikace.
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 .NET Aspire (.NET Aspire dokumentace).
Serverový Blazor Web App projekt (BlazorWebAppOidc
)
Projekt BlazorWebAppOidc
je 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 je access_token
uložené v rámci ověřování cookie.
Konfigurace
Tato část vysvětluje, jak nakonfigurovat ukázkovou aplikaci.
Poznámka:
Pro Microsoft Entra ID nebo Azure AD B2C můžete použít
Nastavte tajný klíč klienta
Varování
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í tajného klíče klienta serverové aplikace pod konfiguračním klíčem Authentication:Schemes:MicrosoftOidc:ClientSecret
.
Poznámka:
Pokud aplikace používá Microsoft Entra ID nebo Azure AD B2C, vytvořte tajný klíč klienta v registraci aplikace na Portálu Entra nebo Azure (Spravovat>Certifikáty a tajné klíče>Nový tajný klíč klienta). Hodnotu nového tajného kódu použijte v následujících doprovodných materiálech.
Ukázková aplikace nebyla inicializována 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ů.
Konfigurace aplikace
V souboru projektu Program
je při volání AddOpenIdConnect nalezena následující OpenIdConnectOptions konfigurace:
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
aprofile
(Scope) (volitelné): Rozsahyopenid
aprofile
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 konfiguraciAuthentication: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);
Rozsahy pro získání dat o počasí z webového rozhraní API (Scope): Toto je nezbytné pro projekt back-endového webového rozhraní API (
MinimalApiJwt
) k ověření přístupového tokenu s Bearer JWT.oidcOptions.Scope.Add("{APP ID URI}/{API NAME}");
Poznámka:
Při použití Microsoft Entra ID se obor
Weather.Get
nakonfiguruje na portálu Entra nebo Azure v Expozice API.Příklad:
- Identifikátor URI ID aplikace (
{APP ID URI}
):https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
- Název adresáře (
{DIRECTORY NAME}
):contoso
- ID
{CLIENT ID}
aplikace (klienta):00001111-aaaa-2222-bbbb-3333cccc4444
- Název adresáře (
- Rozsah nakonfigurovaný pro data o počasí z
MinimalApiJwt
({API NAME}
):Weather.Get
oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444/Weather.Get");
Předchozí příklad se týká aplikace zaregistrované u klienta s typem klienta AAD B2C. Pokud je aplikace zaregistrovaná v tenantovi ME-ID, URI ID aplikace se liší, což znamená, že se liší i rozsah.
Příklad:
- Identifikátor URI ID aplikace (
{APP ID URI}
):api://{CLIENT ID}
s ID aplikace (klient) ({CLIENT ID}
):00001111-aaaa-2222-bbbb-3333cccc4444
- Rozsah nakonfigurovaný pro data o počasí z
MinimalApiJwt
({API NAME}
):Weather.Get
oidcOptions.Scope.Add("api://00001111-aaaa-2222-bbbb-3333cccc4444/Weather.Get");
- Identifikátor URI ID aplikace (
Authority a ClientId: Nastaví autoritu a ID klienta pro volání OIDC.
oidcOptions.Authority = "{AUTHORITY}"; oidcOptions.ClientId = "{CLIENT ID}";
Příklad:
- Autorita ():
{AUTHORITY}
(https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/
používá IDaaaabbbb-0000-cccc-1111-dddd2222eeee
tenanta) - ID klienta (
{CLIENT ID}
):00001111-aaaa-2222-bbbb-3333cccc4444
oidcOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/"; oidcOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
Příklad pro "společnou" autoritu Microsoft Azure:
Pro aplikace 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/";
- Autorita ():
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;
Poznámka:
Při použití ID Microsoft Entra nezaškrtávejte žádné políčko u koncového bodu autorizace pro vracení přístupových tokenů nebo tokenů ID v konfiguraci registrace aplikace implicitního udělení a hybridních toků.
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 nafalse
, 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.Poznámka:
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. V portálu Azure se cesty konfigurují 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
Poznámka:
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
Poznámka:
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 odhlášení.
V následujícím příkladu je zástupný symbol
{PORT}
portem aplikace:https://localhost/signout-oidc
Poznámka:
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 vzít v úvahu vystavitele parametrizovaného pomocí ID tenanta (
{TENANT ID}
) vrácenéhohttps://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;
Ukázkový kód aplikace
Zkontrolujte ukázkovou aplikaci a zkontrolujte následující funkce:
- Automatická neinteraktivní aktualizace tokenů pomocí vlastního cookie aktualizačního modulu (
CookieOidcRefresher.cs
). - 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.
- Požadavky na server Blazor Web App jsou proxidovány do projektu back-endového webového rozhraní API (
MinimalApiJwt
).MapForwarder
Program
v souboru 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
Weather
na serveru tato komponenta používá tříduServerWeatherForecaster
k 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 vykreslení komponenty na klientovi komponenta používá implementaci služby
ClientWeatherForecaster
, která využívá předkonfigurované HttpClient (v souboru projektuProgram
klienta) k volání webového rozhraní API na serverový projekt. Minimální koncový bod rozhraní API (/weather-forecast
) definovaný v souboru projektuProgram
serveru transformuje požadavek pomocí přístupového tokenu uživatele k získání dat o počasí.
- Při vykreslování komponenty
- Automatická neinteraktivní aktualizace tokenů pomocí vlastního cookie aktualizačního modulu (
CookieOidcRefresher.cs
). -
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. - Požadavky na server Blazor Web App jsou proxidovány do projektu back-endového webového rozhraní API (
MinimalApiJwt
).MapForwarder
Program
v souboru 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
Weather
na serveru tato komponenta používá tříduServerWeatherForecaster
k 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 vykreslení komponenty na straně klienta používá komponenta implementaci služby
ClientWeatherForecaster
, která využívá předkonfigurované HttpClient (v klientském projektu v souboruProgram
) k provedení volání webového rozhraní API na serverový projekt. Minimální koncový bod rozhraní API (/weather-forecast
) definovaný v souboru projektuProgram
serveru transformuje požadavek pomocí přístupového tokenu uživatele k získání dat o počasí.
- Při vykreslování komponenty
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.
Projekt na straně Blazor Web App klienta (BlazorWebAppOidc.Client
)
Projekt BlazorWebAppOidc.Client
je klientský projekt 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í. Nezahrnuje tokeny pro autentizaci na serveru při dalších požadavcích; ty fungují samostatně s využitím cookie, které jsou zahrnuty v požadavcích na HttpClient server.
Projekt back-endového webového rozhraní API (MinimalApiJwt
)
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.
Konfigurace
Nakonfigurujte projekt ve volání JwtBearerOptionsAddJwtBearer v souboru projektu Program
:
Audience: Nastaví cílovou skupinu pro jakýkoli přijatý token OIDC.
jwtOptions.Audience = "{APP ID URI}";
Poznámka:
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.Příklad:
Identifikátor URI ID aplikace (
{APP ID URI}
):https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
- Název adresáře (
{DIRECTORY NAME}
):contoso
- ID
{CLIENT ID}
aplikace (klienta):00001111-aaaa-2222-bbbb-3333cccc4444
jwtOptions.Audience = "https://contoso.onmicrosoft.com/00001111-aaaa-2222-bbbb-3333cccc4444";
Předchozí příklad se týká aplikace zaregistrované u klienta s typem klienta AAD B2C. Pokud je aplikace zaregistrovaná v tenantovi ME-ID, identifikátor URI ID aplikace se liší, a proto se cílová skupina liší.
Příklad:
Identifikátor URI ID aplikace (
{APP ID URI}
):api://{CLIENT ID}
s ID aplikace (klient) ({CLIENT ID}
):00001111-aaaa-2222-bbbb-3333cccc4444
jwtOptions.Audience = "api://00001111-aaaa-2222-bbbb-3333cccc4444";
- Název adresáře (
Authority: Nastaví oprávnění pro provádění volání OIDC. Porovná hodnotu s autoritou nakonfigurovanou pro obslužnou rutinu OIDC v
BlazorWebAppOidc/Program.cs
:jwtOptions.Authority = "{AUTHORITY}";
Příklad:
Autorita ():
{AUTHORITY}
(https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/
používá IDaaaabbbb-0000-cccc-1111-dddd2222eeee
tenanta)jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/";
Předchozí příklad se týká aplikace zaregistrované u klienta s typem klienta AAD B2C. Pokud je aplikace zaregistrovaná v tenantovi ME-ID, měla by se autorita shodovat s issuerem (
iss
) JWT vráceným poskytovatelem identity.jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/";
Minimální rozhraní API pro data o počasí
Zabezpečený koncový bod pro předpověď počasí v souboru Program
projektu:
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.
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 role claims to client
(dotnet/aspnetcore
#58826).
Poznámka:
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á nonce
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 se 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
groupMembershipClaims
atribut. - 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
roles
nárocích, jeden nárok na každou roli. - Skupiny zabezpečení se zobrazují v
groups
ná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
wids
nárocích, jeden nárok na roli. Deklaracewids
s hodnotoub79fbf4d-3ef9-4689-8143-76b194e85509
je 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).
Odstraňování potíží
Protokolování
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í, podívejte se do části Protokolování ověřování na straně klienta v článku o protokolování v ASP.NET Core Blazor, přičemž selektor verze článku musí být nastaven na ASP.NET Core 7.0 nebo novější.
Běžné chyby
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.
-
allowPublicClient
Nastavte atribut nanull
nebotrue
.
- 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 Core 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 --clear
z příkazového prostředí. - Odstraňte složky
bin
aobj
projektu. - Obnovte a znovu sestavte projekt.
- Před opětovným nasazením 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. Informace o balíčku najdete v galerii NuGet.
Spuštění serverové aplikace
Při testování a řešení potíží Blazor Web Appse ujistěte, že aplikaci spouštíte 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;
}
}
Další materiály
-
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. -
AuthenticationStateProvider
služ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 Apppomocí interaktivního automatického vykreslování