Sdílet prostřednictvím


Zabezpečte ASP.NET Core Blazor Web App pomocí Microsoft Entra ID

Tento článek popisuje, jak zabezpečit Blazor Web App pomocí platformy Microsoft Identity s využitím webových balíčků Microsoftu Identity pro ID Microsoft Entra na příkladu ukázkové aplikace.

Tato verze článku popisuje implementaci Entra bez přijetí vzoru Backend pro Frontend (BFF). 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 App režim automatického vykreslování s globální interaktivitou (InteractiveAuto).
  • Projekt serveru volá AddAuthenticationStateSerialization pro přidání zprostředkovatele stavu ověřování na straně serveru, který používá PersistentComponentState ke směrování stavu ověřování do klienta. Klient volá funkci AddAuthenticationStateDeserialization, aby deserializoval a použil stav ověřování předaný serverem. Stav ověřování zůstává neměnný po celou dobu životnosti aplikace WebAssembly.
  • Aplikace používá Microsoft Entra ID, založené na balíčcích Microsoft Identity Web.
  • Automatická neinteraktivní aktualizace tokenů je spravovaná architekturou.
  • Aplikace používá abstrakce na straně serveru a služby na straně klienta k zobrazení vygenerovaných dat o počasí:
    • Při vykreslování Weather komponenty na serveru k zobrazení dat o počasí používá komponenta ServerWeatherForecaster. Webové balíčky microsoftu Identity poskytují rozhraní API pro vytvoření pojmenované podřízené webové služby pro volání webového rozhraní API. IDownstreamApi se vloží do objektu ServerWeatherForecaster, který se používá k volání CallApiForUserAsync pro získání dat o počasí z externího webového rozhraní API (MinimalApiJwt projektu).
    • Když je komponenta Weather vykreslena na straně klienta, využívá implementaci služby ClientWeatherForecaster, která používá předkonfigurované HttpClient (v souboru projektu klienta Program) k provedení volání webového API na serverový projekt Minimal API (/weather-forecast) pro získání dat o počasí. Koncový bod minimálního rozhraní API získá data o počasí z ServerWeatherForecaster třídy a vrátí je klientovi pro vykreslení komponentou.

Ukázkové řešení

Ukázkové řešení se skládá z následujících projektů:

  • BlazorWebAppEntra: Projekt Blazor Web Appna straně serveru , který obsahuje příklad minimálního koncového bodu rozhraní API pro data o počasí.
  • BlazorWebAppEntra.Client: Projekt na straně klienta Blazor Web App.
  • MinimalApiJwt: Backendové webové rozhraní API, které obsahuje příklad Minimal API koncového bodu 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 BlazorWebAppEntra pro .NET 9 nebo novější.

Spusťte řešení z Aspire/Aspire.AppHost projektu.

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 BlazorWebAppEntra 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 (BlazorWebAppEntra) s konfigurací webové platformy se dvěma položkami v identifikátoru URI přesměrování a https://localhost/signin-oidchttps://localhost/signout-callback-oidc (porty se na těchto identifikátorech URI nevyžadují). Nastavte adresu URL odhlášení z front-kanálu na https://localhost/signout-callback-oidc (port se nevyžaduje). ID tenanta aplikace, doména tenanta a ID klienta, spolu se základní adresou webového rozhraní API, identifikátorem URI aplikace a názvem rozsahu funkcí počasí, se používají ke konfiguraci aplikace v souboru appsettings.json. 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.

Serverový projekt Blazor Web App (BlazorWebAppEntra)

Projekt BlazorWebAppEntra je serverový projekt Blazor Web App.

Klientský projekt Blazor Web App (BlazorWebAppEntra.Client)

Projekt BlazorWebAppEntra.Client je klientským projektem Blazor Web App.

Pokud se uživatel musí při vykreslování na straně klienta přihlásit nebo odhlásit, zahájí se opětovné načtení celé stránky.

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í.

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.

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.

Konfigurace projektu back-endového webového rozhraní API (MinimalApiJwt)

Nakonfigurujte projekt v JwtBearerOptionsAddJwtBearer rámci volání v MinimalApiJwt souboru projektu Program .

Pro registraci Weather.Get aplikace webového rozhraní API se obor konfiguruje v portálu Entra nebo Azure v části Zveřejnění rozhraní API.

Authority nastaví autoritu pro provádění volání OIDC.

jwtOptions.Authority = "{AUTHORITY}";

Následující příklady používají ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee a název contosoadresáře .

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

Pokud je aplikace zaregistrovaná v tenantovi Microsoft Entra External ID:

jwtOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Pokud je aplikace zaregistrovaná v tenantovi AAD B2C:

jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Note

Azure Active Directory B2C už není k dispozici jako služba pro nové zákazníky od 1. května 2025. Tenanti AAD B2C jsou podporováni pro zákazníky s účty vytvořenými před 1. květnem 2025 až do roku 2030. Další informace najdete v tématu Azure AD B2C: Nejčastější dotazy.

Audience nastaví cílovou skupinu pro všechny přijaté přístupové tokeny JWT.

jwtOptions.Audience = "{AUDIENCE}";

Při přidávání oboru pod Zveřejnění rozhraní API v portálu Entra nebo Azure Portal přiřaďte hodnotu pouze k části cesty Weather.Get. Do hodnoty nezahrnujte název rozsahu "Weather.Get".

Následující příklady používají ID 11112222-bbbb-3333-cccc-4444dddd5555aplikace (klienta) . Třetí příklad používá doménu tenanta contoso.onmicrosoft.com.

příklad tenanta ME-ID:

jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";

Tenant externího ID Microsoft Entra:

jwtOptions.Audience = "11112222-bbbb-3333-cccc-4444dddd5555";

Příklad tenantu AAD B2C:

jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";

Konfigurace projektu serveru (BlazorWebAppEntra)

AddMicrosoftIdentityWebAppz webu společnosti Microsoft Identity (Microsoft.Identity.Webbalíček NuGet, dokumentace k rozhraní API) je nakonfigurován v BlazorWebAppEntra souboru projektuProgram.

Získejte ID aplikace (klienta), doménu tenanta (vydavatele) a ID adresáře (tenanta) z registrace aplikace na webu Entra nebo Azure Portal. Identifikátor URI ID aplikace se získá pro Weather.Get obor z registrace webového rozhraní API. Při získávání URI ID aplikace z portálu nezahrnujte název oboru.

Konfigurace ověřování závisí na typu tenanta:

konfigurace tenanta ME-ID

Tato část se týká aplikace zaregistrované v tenantovi Microsoft Entra ID nebo Azure AAD B2C.

BlazorWebAppEntra V souboru projektu Program zadejte hodnoty pro následující zástupné symboly v konfiguraci webu společnosti MicrosoftIdentity:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.Domain = "{DIRECTORY NAME}.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "{TENANT ID}";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Zástupné symboly v předchozí konfiguraci:

  • {CLIENT ID (BLAZOR APP)}: ID aplikace (klienta).
  • {DIRECTORY NAME}: Název adresáře domény tenanta (vydavatele).
  • {TENANT ID}: ID adresáře (tenanta).
  • {BASE ADDRESS}: Základní adresa webového rozhraní API.
  • {APP ID URI}: Identifikátor URI ID aplikace pro obory webového rozhraní API. Používá se některý z následujících formátů, kde {CLIENT ID (WEB API)} zástupným symbolem je ID klienta registrace Entra webového rozhraní API a {DIRECTORY NAME} zástupným symbolem je název adresáře domény tenanta (vydavatelé) (například: contoso).
    • formát tenanta ME-ID: api://{CLIENT ID (WEB API)}
    • Formát zákaznického účtu B2C: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.Domain = "contoso.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "aaaabbbb-0000-cccc-1111-dddd2222eeee";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Konfigurace externího ID microsoftu Entra

Tato část se týká aplikace zaregistrované v tenantovi Microsoft Entra External ID.

BlazorWebAppEntra V souboru projektu Program zadejte hodnoty pro následující zástupné symboly v konfiguraci webu společnosti MicrosoftIdentity:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://{DIRECTORY NAME}.ciamlogin.com/{TENANT ID}/v2.0";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Zástupné symboly v předchozí konfiguraci:

  • {DIRECTORY NAME}: Název adresáře domény tenanta (vydavatele).
  • {CLIENT ID (BLAZOR APP)}: ID aplikace (klienta).
  • {BASE ADDRESS}: Základní adresa webového rozhraní API.
  • {APP ID URI}: Identifikátor URI ID aplikace pro obory webového rozhraní API. Používá se některý z následujících formátů, kde {CLIENT ID (WEB API)} zástupný symbol je ID klienta registrace Entra webového rozhraní API a {DIRECTORY NAME} zástupný symbol je název adresáře domény tenanta (vydavatele) (příklad: contoso).
    • formát tenanta ME-ID nebo Microsoft Entra External ID: api://{CLIENT ID (WEB API)}
    • Formát zákaznického účtu B2C: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Cesta zpětného volání (CallbackPath) se musí shodovat s identifikátorem URI přesměrování (cesta zpětného volání přihlášení) nakonfigurovanou při registraci aplikace v portálu Entra nebo Azure. Cesty se konfigurují v sekci Ověřování registrace aplikace. Výchozí hodnota CallbackPath je /signin-oidc pro přesměrování registrované pomocí URI https://localhost/signin-oidc (port se nevyžaduje).

Jedná se SignedOutCallbackPath o cestu požadavku v rámci základní cesty aplikace zachycené handlerem OpenID Connect, kam se uživatelský agent nejprve vrátí po odhlášení z platformy Entra. 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 OpenID Connect v případě zadání přesměruje na SignedOutRedirectUri nebo RedirectUri.

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 měl server-side Blazor kód a webová API používat zabezpečené autentizační toky, které se vyhýbají ukládá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ů.

Tato verze článku pokrývá implementaci Entra použitím vzoru Backend pro Frontend (BFF) . Změňte selektor verze článku na vzor bez BFF, pokud specifikace aplikace nepožaduje přijetí vzoru BFF.

Probírá se následující specifikace:

  • Používá Blazor Web App režim automatického vykreslování s globální interaktivitou (InteractiveAuto).
  • Projekt serveru volá AddAuthenticationStateSerialization pro přidání zprostředkovatele stavu ověřování na straně serveru, který používá PersistentComponentState ke směrování stavu ověřování do klienta. Klient volá funkci AddAuthenticationStateDeserialization, aby deserializoval a použil stav ověřování předaný serverem. Stav ověřování zůstává neměnný po celou dobu životnosti aplikace WebAssembly.
  • Aplikace používá Microsoft Entra ID, založené na balíčcích Microsoft Identity Web.
  • Automatická neinteraktivní aktualizace tokenů je spravovaná architekturou.
  • 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.
    • 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.
  • Aplikace používá abstrakce na straně serveru a služby na straně klienta k zobrazení vygenerovaných dat o počasí.
    • Při vykreslování Weather komponenty na serveru k zobrazení dat o počasí používá komponenta ServerWeatherForecaster. Webové balíčky microsoftu Identity poskytují rozhraní API pro vytvoření pojmenované podřízené webové služby pro volání webového rozhraní API. IDownstreamApi se vloží do objektu ServerWeatherForecaster, který se používá k volání CallApiForUserAsync pro získání dat o počasí z externího webového rozhraní API (MinimalApiJwt projektu).
    • Když je komponenta Weather vykreslena na straně klienta, využívá implementaci služby ClientWeatherForecaster, která používá předkonfigurované HttpClient (v souboru projektu klienta Program) k provedení volání webového API na serverový projekt Minimal API (/weather-forecast) pro získání dat o počasí. Minimální koncový bod rozhraní API získá přístupový token pro uživatele voláním GetAccessTokenForUserAsync. Spolu se správnými obory je prováděno volání reverzní proxy na externí webové API (MinimalApiJwt projekt) pro získání a vrácení dat o počasí klientovi pro vykreslení komponentou.

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é řešení 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í.
  • BlazorWebAppEntra: Projekt na straně serveru Blazor Web App.
  • BlazorWebAppEntra.Client: Projekt na straně klienta 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 BlazorWebAppEntraBff pro .NET 9 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 BlazorWebAppEntra 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 (BlazorWebAppEntra) s konfigurací webové platformy se dvěma položkami v identifikátoru URI přesměrování a https://localhost/signin-oidchttps://localhost/signout-callback-oidc (porty se na těchto identifikátorech URI nevyžadují). ID tenanta aplikace, doména tenanta a ID klienta, spolu se základní adresou webového rozhraní API, identifikátorem URI aplikace a názvem rozsahu funkcí počasí, se používají ke konfiguraci aplikace v souboru appsettings.json. 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.

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).

Serverový projekt Blazor Web App (BlazorWebAppEntra)

Projekt BlazorWebAppEntra je serverový projekt Blazor Web App.

Klientský projekt Blazor Web App (BlazorWebAppEntra.Client)

Projekt BlazorWebAppEntra.Client je klientským projektem Blazor Web App.

Pokud se uživatel musí při vykreslování na straně klienta přihlásit nebo odhlásit, zahájí se opětovné načtení celé stránky.

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 (BlazorWebAppEntra) 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.

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.

Konfigurace projektu back-endového webového rozhraní API (MinimalApiJwt)

Nakonfigurujte projekt MinimalApiJwt ve JwtBearerOptions volání AddJwtBearer v souboru projektu Program.

Pro registraci Weather.Get aplikace webového rozhraní API se obor konfiguruje v portálu Entra nebo Azure v části Zveřejnění rozhraní API.

Authority nastaví autoritu pro provádění volání OIDC.

jwtOptions.Authority = "{AUTHORITY}";

Následující příklady používají ID tenanta aaaabbbb-0000-cccc-1111-dddd2222eeee a název contosoadresáře .

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

Pokud je aplikace zaregistrovaná v tenantovi Microsoft Entra External ID:

jwtOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Pokud je aplikace zaregistrovaná v tenantovi AAD B2C:

jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";

Note

Azure Active Directory B2C už není k dispozici jako služba pro nové zákazníky od 1. května 2025. Tenanti AAD B2C jsou podporováni pro zákazníky s účty vytvořenými před 1. květnem 2025 až do roku 2030. Další informace najdete v tématu Azure AD B2C: Nejčastější dotazy.

Audience nastaví cílovou skupinu pro všechny přijaté přístupové tokeny JWT.

jwtOptions.Audience = "{AUDIENCE}";

Při přidávání oboru pod Zveřejnění rozhraní API v portálu Entra nebo Azure Portal přiřaďte hodnotu pouze k části cesty Weather.Get. Do hodnoty nezahrnujte název rozsahu "Weather.Get".

Následující příklady používají ID 11112222-bbbb-3333-cccc-4444dddd5555aplikace (klienta) . Třetí příklad používá doménu tenanta contoso.onmicrosoft.com.

příklad tenanta ME-ID:

jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";

Tenant externího ID Microsoft Entra:

jwtOptions.Audience = "11112222-bbbb-3333-cccc-4444dddd5555";

Příklad tenantu AAD B2C:

jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";

Konfigurace projektu serveru (BlazorWebAppEntra)

AddMicrosoftIdentityWebAppz webu společnosti Microsoft Identity (Microsoft.Identity.Webbalíček NuGet, dokumentace k rozhraní API) je nakonfigurován v BlazorWebAppEntra souboru projektuProgram.

Získejte ID aplikace (klienta), doménu tenanta (vydavatele) a ID adresáře (tenanta) z registrace aplikace na webu Entra nebo Azure Portal. Identifikátor URI ID aplikace se získá pro Weather.Get obor z registrace webového rozhraní API. Při získávání URI ID aplikace z portálu nezahrnujte název oboru.

Konfigurace ověřování závisí na typu tenanta:

nastavení tenanta ME-ID

Tato část se týká aplikace zaregistrované v tenantovi Microsoft Entra ID nebo Azure AAD B2C.

BlazorWebAppEntra V souboru projektu Program zadejte hodnoty pro následující zástupné symboly v konfiguraci webu společnosti MicrosoftIdentity:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.Domain = "{DIRECTORY NAME}.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "{TENANT ID}";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Do transformátoru požadavku zadejte stejný obor podřízeného rozhraní API:

List<string> scopes = ["{APP ID URI}/Weather.Get"];

Zástupné symboly v předchozí konfiguraci:

  • {CLIENT ID (BLAZOR APP)}: ID aplikace (klienta).
  • {DIRECTORY NAME}: Název adresáře domény tenanta (vydavatele).
  • {TENANT ID}: ID adresáře (tenanta).
  • {BASE ADDRESS}: Základní adresa webového rozhraní API.
  • {APP ID URI}: Identifikátor URI ID aplikace pro obory webového rozhraní API. Používá se některý z následujících formátů, kde {CLIENT ID (WEB API)} zástupným symbolem je ID klienta registrace Entra webového rozhraní API a {DIRECTORY NAME} zástupným symbolem je název adresáře domény tenanta (vydavatelé) (například: contoso).
    • formát tenanta ME-ID: api://{CLIENT ID (WEB API)}
    • Formát zákaznického účtu B2C: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.Domain = "contoso.onmicrosoft.com";
        msIdentityOptions.Instance = "https://login.microsoftonline.com/";
        msIdentityOptions.ResponseType = "code";
        msIdentityOptions.TenantId = "aaaabbbb-0000-cccc-1111-dddd2222eeee";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = 
            ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Example:

List<string> scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];

Konfigurace externího ID Microsoft Entra

Tato část se týká aplikace zaregistrované v tenantovi Microsoft Entra External ID.

BlazorWebAppEntra V souboru projektu Program zadejte hodnoty pro následující zástupné symboly v konfiguraci webu společnosti MicrosoftIdentity:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://{DIRECTORY NAME}.ciamlogin.com/{TENANT ID}/v2.0";
        msIdentityOptions.ClientId = "{CLIENT ID (BLAZOR APP)}";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "{BASE ADDRESS}";
        configOptions.Scopes = ["{APP ID URI}/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Do transformátoru požadavku zadejte stejný obor podřízeného rozhraní API:

List<string> scopes = ["{APP ID URI}/Weather.Get"];

Zástupné symboly v předchozí konfiguraci:

  • {DIRECTORY NAME}: Název adresáře domény tenanta (vydavatele).
  • {CLIENT ID (BLAZOR APP)}: ID aplikace (klienta).
  • {BASE ADDRESS}: Základní adresa webového rozhraní API.
  • {APP ID URI}: Identifikátor URI ID aplikace pro obory webového rozhraní API. Používá se některý z následujících formátů, kde {CLIENT ID (WEB API)} zástupným symbolem je ID klienta registrace Entra webového rozhraní API a {DIRECTORY NAME} zástupným symbolem je název adresáře domény tenanta (vydavatelé) (například: contoso).
    • formát tenanta ME-ID nebo Microsoft Entra External ID: api://{CLIENT ID (WEB API)}
    • Formát zákaznického účtu B2C: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
    .AddMicrosoftIdentityWebApp(msIdentityOptions =>
    {
        msIdentityOptions.CallbackPath = "/signin-oidc";
        msIdentityOptions.Authority = "https://contoso.ciamlogin.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0";
        msIdentityOptions.ClientId = "00001111-aaaa-2222-bbbb-3333cccc4444";
        msIdentityOptions.ResponseType = "code";
    })
    .EnableTokenAcquisitionToCallDownstreamApi()
    .AddDownstreamApi("DownstreamApi", configOptions =>
    {
        configOptions.BaseUrl = "https://localhost:7277";
        configOptions.Scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];
    })
    .AddDistributedTokenCaches();

Example:

List<string> scopes = ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"];

Warning

Produkční aplikace by měly používat zprostředkovatele mezipaměti distribuovaných tokenů v produkčním prostředí. Jinak může mít aplikace v některých scénářích nízký výkon. Další informace najdete v části Použití zprostředkovatele mezipaměti distribuovaných tokenů v produkčním prostředí.

Cesta zpětného volání (CallbackPath) se musí shodovat s identifikátorem URI přesměrování (cesta zpětného volání přihlášení) nakonfigurovanou při registraci aplikace v portálu Entra nebo Azure. Cesty se konfigurují v sekci Ověřování registrace aplikace. Výchozí hodnota CallbackPath je /signin-oidc pro přesměrování registrované pomocí URI https://localhost/signin-oidc (port se nevyžaduje).

Jedná se SignedOutCallbackPath o cestu požadavku v rámci základní cesty aplikace zachycené handlerem OpenID Connect, kam se uživatelský agent nejprve vrátí po odhlášení z platformy Entra. 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 OpenID Connect v případě zadání přesměruje na SignedOutRedirectUri nebo RedirectUri.

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 měl server-side Blazor kód a webová API používat zabezpečené autentizační toky, které se vyhýbají ukládá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ů.

Nastavte tajemství klienta

Tato část se vztahuje pouze na serverový projekt .Blazor Web App

K poskytnutí tajného klíče klienta do aplikace použijte jeden nebo oba následující přístupy:

  • Nástroj Secret Manager: Nástroj Secret Manager ukládá soukromá data na místním počítači a používá se pouze při místním vývoji.
  • Azure Key Vault: Tajný klíč klienta můžete uložit do trezoru klíčů pro použití v libovolném prostředí, včetně vývojového prostředí při práci místně. Někteří vývojáři raději používají trezory klíčů pro přípravné a produkční nasazení a používají nástroj Secret Manager pro místní vývoj.

Důrazně doporučujeme vyhnout se ukládání tajných kódů klienta do kódu projektu nebo konfiguračních souborů. Používejte zabezpečené ověřovací toky, jako jsou oba přístupy v této části.

Nástroj Secret Manager

Nástroj Secret Manager může uložit tajný klíč klienta serverové aplikace pod konfigurační klíč AzureAd:ClientSecret.

Serverová Blazor 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, který je interně používán nástroji ke sledování tajných kódů pro aplikaci:

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 Entra.

dotnet user-secrets set "AzureAd: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ů.

Azure Key Vault

Azure Key Vault poskytuje bezpečný přístup pro poskytnutí tajného klíče klienta aplikace pro aplikaci.

Pokud chcete vytvořit trezor klíčů a nastavit tajný klíč klienta, přečtěte si informace o tajných klíčích služby Azure Key Vault (dokumentace k Azure), které křížově propojí prostředky, které vám pomůžou začít se službou Azure Key Vault. Pokud chcete implementovat kód v této části, poznamenejte si identifikátor URI trezoru klíčů a název tajného kódu z Azure při vytváření trezoru klíčů a tajného klíče. V příkladu v této části je tajný název "BlazorWebAppEntraClientSecret."

Při vytváření trezoru klíčů na webu Entra nebo Azure Portal:

  • Nakonfigurujte trezor klíčů tak, aby používal řízení přístupu na základě role v Azure (RABC). Pokud nepracujete na Azure Virtual Network, včetně místního vývoje a testování, ověřte, že je ve veřejném přístupu v kroku Sítěpovoleno (zaškrtnuto). Povolení veřejného přístupu zveřejňuje jenom koncový bod trezoru klíčů. Pro přístup se stále vyžadují ověřené účty.

  • Vytvořte spravovanou Identity službu Azure (nebo přidejte roli do existujícího spravovaného Identity , kterou plánujete použít) s rolí uživatele tajných kódů služby Key Vault . Přiřaďte spravované Identity službě Azure App Service, která hostuje nasazení: Nastavení>Identity>Uživatelem přiřazené>Přidat.

    Note

    Pokud máte také v úmyslu spustit aplikaci místně s autorizovaným uživatelem pro přístup k trezoru klíčů pomocí Azure CLI nebo ověřování služby Azure sady Visual Studio, přidejte svůj uživatelský účet Azure pro vývojáře do řízení přístupu (IAM) s rolí Uživatele tajných kódů služby Key Vault . Pokud chcete použít Azure CLI prostřednictvím Visual Studio, spusťte az login příkaz z panelu Developer PowerShellu a postupujte podle pokynů k ověření nájemce.

Pokud chcete implementovat kód v této části, při vytváření trezoru klíčů a tajného klíče, z Azure si poznamenejte identifikátor URI trezoru klíčů (například "https://contoso.vault.azure.net/", vyžadováno koncové lomítko) a název tajného klíče (například "BlazorWebAppEntraClientSecret").

Important

Vytvoří se tajný klíč trezoru klíčů s datem vypršení platnosti. Nezapomeňte sledovat, kdy vyprší platnost tajemství úložiště klíčů, a vytvořit pro aplikaci nové tajemství před uplynutím tohoto data.

Do projektu serveru přidejte následující třídu AzureHelper. Metoda GetKeyVaultSecret načte tajný kód z trezoru klíčů. Upravte obor názvů (BlazorSample.Helpers) tak, aby odpovídal schématu oboru názvů projektu.

Helpers/AzureHelper.cs:

using Azure.Core;
using Azure.Security.KeyVault.Secrets;

namespace BlazorWebAppEntra.Helpers;

public static class AzureHelper
{
    public static string GetKeyVaultSecret(string vaultUri, 
        TokenCredential credential, string secretName)
    {
        var client = new SecretClient(new Uri(vaultUri), credential);
        var secret = client.GetSecretAsync(secretName).Result;

        return secret.Value.Value;
    }
}

Note

Předchozí příklad používá DefaultAzureCredential ke zjednodušení ověřování při vývoji aplikací, které se nasazují do Azure zkombinováním přihlašovacích údajů používaných v hostitelských prostředích Azure s přihlašovacími údaji použitými v místním vývoji. Při přechodu na produkci je lepší volbou alternativa, například ManagedIdentityCredential. Další informace najdete v tématu Ověřování aplikací .NET hostovaných v Azure v prostředcích Azure pomocí spravované identity přiřazené systémem.

Pokud jsou služby zaregistrované v souboru projektu Program serveru, získejte a použijte tajný kód klienta pomocí následujícího kódu:

TokenCredential? credential;

if (builder.Environment.IsProduction())
{
    credential = new ManagedIdentityCredential("{MANAGED IDENTITY CLIENT ID}");
}
else
{
    // Local development and testing only
    DefaultAzureCredentialOptions options = new()
    {
        // Specify the tenant ID to use the dev credentials when running the app locally
        // in Visual Studio.
        VisualStudioTenantId = "{TENANT ID}",
        SharedTokenCacheTenantId = "{TENANT ID}"
    };

    credential = new DefaultAzureCredential(options);
}

Kde jsou MicrosoftIdentityOptions nastaveny, volejte GetKeyVaultSecret k příjmu a přiřazení tajného klíče klienta aplikace.

msIdentityOptions.ClientSecret = AzureHelper.GetKeyVaultSecret("{VAULT URI}", 
    credential, "{SECRET NAME}");

{MANAGED IDENTITY CLIENT ID}: ID spravovaného Identity klienta Azure (GUID).

{TENANT ID}: ID adresáře (tenanta). Příklad: aaaabbbb-0000-cccc-1111-dddd2222eeee

{VAULT URI}: Identifikátor URI služby Key Vault. Zahrňte koncové lomítko v identifikátoru URI. Příklad: https://contoso.vault.azure.net/

{SECRET NAME}: Tajné jméno. Příklad: BlazorWebAppEntraClientSecret

Konfigurace se používá k usnadnění poskytování vyhrazených trezorů klíčů a názvů tajných kódů na základě konfiguračních souborů prostředí aplikace. Můžete například zadat různé hodnoty konfigurace pro appsettings.Development.json vývoj, appsettings.Staging.json při přípravě a appsettings.Production.json pro produkční nasazení. Další informace najdete v tématu konfigurace Blazor ASP.NET Core.

Serializovat pouze deklarace názvů a rolí

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 Microsoft Identity Web 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) BlazorWebAppEntra projektu přidejte následující konfiguraci JSON:

{
  "AzureAd": {
    "CallbackPath": "/signin-oidc",
    "ClientId": "{CLIENT ID (BLAZOR APP)}",
    "Domain": "{DIRECTORY NAME}.onmicrosoft.com",
    "Instance": "https://login.microsoftonline.com/",
    "ResponseType": "code",
    "TenantId": "{TENANT ID}"
  },
  "DownstreamApi": {
    "BaseUrl": "{BASE ADDRESS}",
    "Scopes": ["{APP ID URI}/Weather.Get"]
  }
}

Aktualizujte zástupné symboly v předchozí konfiguraci tak, aby odpovídaly hodnotám, které aplikace používá v Program souboru:

  • {CLIENT ID (BLAZOR APP)}: ID aplikace (klienta).
  • {DIRECTORY NAME}: Název adresáře domény tenanta (vydavatele).
  • {TENANT ID}: ID adresáře (tenanta).
  • {BASE ADDRESS}: Základní adresa webového rozhraní API.
  • {APP ID URI}: Identifikátor URI ID aplikace pro obory webového rozhraní API. Používá se některý z následujících formátů, kde {CLIENT ID (WEB API)} zástupným symbolem je ID klienta registrace Entra webového rozhraní API a {DIRECTORY NAME} zástupným symbolem je název adresáře domény tenanta (vydavatelé) (například: contoso).
    • formát tenanta ME-ID: api://{CLIENT ID (WEB API)}
    • Formát zákaznického účtu B2C: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}

Example:

"AzureAd": {
  "CallbackPath": "/signin-oidc",
  "ClientId": "00001111-aaaa-2222-bbbb-3333cccc4444",
  "Domain": "contoso.onmicrosoft.com",
  "Instance": "https://login.microsoftonline.com/",
  "ResponseType": "code",
  "TenantId": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
},
"DownstreamApi": {
  "BaseUrl": "https://localhost:7277",
  "Scopes": ["api://11112222-bbbb-3333-cccc-4444dddd5555/Weather.Get"]
}

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í.

Proveďte v Program souboru následující změny:

builder.Services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
-   .AddMicrosoftIdentityWebApp(msIdentityOptions =>
-   {
-       msIdentityOptions.CallbackPath = "...";
-       msIdentityOptions.ClientId = "...";
-       msIdentityOptions.Domain = "...";
-       msIdentityOptions.Instance = "...";
-       msIdentityOptions.ResponseType = "...";
-       msIdentityOptions.TenantId = "...";
-   })
+   .AddMicrosoftIdentityWebApp(builder.Configuration.GetSection("AzureAd"))
    .EnableTokenAcquisitionToCallDownstreamApi()
-   .AddDownstreamApi("DownstreamApi", configOptions =>
-   {
-       configOptions.BaseUrl = "...";
-       configOptions.Scopes = ["..."];
-   })
+   .AddDownstreamApi("DownstreamApi", builder.Configuration.GetSection("DownstreamApi"))
    .AddDistributedTokenCaches();
- List<string> scopes = ["{APP ID URI}/Weather.Get"];
- var accessToken = await tokenAcquisition.GetAccessTokenForUserAsync(scopes);
+ var configuration = transformContext.HttpContext.RequestServices.GetRequiredService<IConfiguration>();
+ var scopes = configuration.GetSection("DownstreamApi:Scopes").Get<IEnumerable<string>>();
+ var accessToken = await tokenAcquisition.GetAccessTokenForUserAsync(scopes ??
+     throw new InvalidOperationException("No downstream API scopes!"));

Note

Produkční aplikace by měly používat zprostředkovatele mezipaměti distribuovaných tokenů v produkčním prostředí. Jinak může mít aplikace v některých scénářích nízký výkon. Další informace najdete v části Použití zprostředkovatele mezipaměti distribuovaných tokenů v produkčním prostředí.

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í:

Použití zprostředkovatele mezipaměti distribuovaných tokenů v produkčním prostředí

Při volání AddDistributedTokenCaches se vytvoří mezipaměti distribuovaných tokenů v paměti, aby byla k dispozici základní implementace pro ukládání do mezipaměti distribuovaných tokenů.

Produkční webové aplikace a webová rozhraní API by měly používat mezipaměť produkčních distribuovaných tokenů (například Redis, Microsoft SQL Server, Microsoft Azure Cosmos DB).

Note

Pro místní vývoj a testování na jednom počítači můžete místo mezipamětí distribuovaných tokenů použít mezipaměti tokenů v paměti:

builder.Services.AddInMemoryTokenCaches();

Později ve vývojovém a testovacím období použijte poskytovatele produkční mezipaměti pro distribuované tokeny.

AddDistributedMemoryCache přidá výchozí implementaci IDistributedCache , která ukládá položky mezipaměti do paměti, která je používána webem Společnosti Microsoft Identity pro ukládání tokenů do mezipaměti.

Mezipaměť distribuovaných tokenů je nakonfigurovaná MsalDistributedTokenCacheAdapterOptionspomocí:

builder.Services.AddDistributedMemoryCache();

builder.Services.Configure<MsalDistributedTokenCacheAdapterOptions>(
    options => 
    {
      // The following lines that are commented out reflect
      // default values. We recommend overriding the default
      // value of Encrypt to encrypt tokens at rest.

      //options.DisableL1Cache = false;
      //options.L1CacheOptions.SizeLimit = 500 * 1024 * 1024;
      options.Encrypt = true;
      //options.SlidingExpiration = TimeSpan.FromHours(1);
    });

AddDistributedMemoryCache vyžaduje odkaz na Microsoft.Extensions.Caching.Memory balíček NuGet.

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.

Pokud chcete nakonfigurovat zprostředkovatele produkční distribuované mezipaměti, přečtěte si téma Distribuované ukládání do mezipaměti v ASP.NET Core.

Warning

Při nasazování aplikace do produkčního prostředí vždy nahraďte mezipaměti distribuovaných tokenů v paměti skutečným poskytovatelem mezipaměti tokenů. Pokud nepoužijete produkční poskytovatele distribuovaného token cache, může být výkon aplikace výrazně snížen.

Další informace naleznete v tématu Serializace mezipaměti tokenů: Distribuované mezipaměti. Uvedené příklady kódu se však nevztahují na aplikace ASP.NET Core, které konfigurují distribuované mezipaměti prostřednictvím AddDistributedMemoryCache, nikoli AddDistributedTokenCache.

Použijte sdílený kruh klíčů ochrany dat v produkčním prostředí, aby instance aplikace na serverech ve webové farmě mohly dešifrovat tokeny, když je MsalDistributedTokenCacheAdapterOptions.Encrypt nastavena na true.

Note

Pro počáteční vývoj a místní testování na jednom počítači můžete nastavit Encryptfalse a nakonfigurovat sdílený okruh klíčů ochrany dat později:

options.Encrypt = false;

Později ve vývojovém a testovacím období povolte šifrování tokenů a přijměte sdílený okruh klíčů ochrany dat.

Následující příklad ukazuje, jak používat Azure Blob Storage a Azure Key Vault (PersistKeysToAzureBlobStorage/ProtectKeysWithAzureKeyVault) pro okruh sdíleného klíče. Konfigurace služeb jsou základní případové scénáře pro demonstrační účely. Před nasazením produkčních aplikací se seznamte se službami Azure a využijte osvědčené postupy s využitím vyhrazených sad dokumentace služeb Azure, které jsou propojené na konci této části.

Ověřte přítomnost následujících balíčků v serverovém Blazor Web Appprojektu:

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.

Note

Než budete pokračovat v následujících krocích, ověřte, že je aplikace zaregistrovaná v Microsoft Entra.

Následující kód se obvykle implementuje současně s implementací zprostředkovatele mezipaměti distribuovaných tokenů v produkčním prostředí . Další možnosti, jak v Rámci Azure, tak mimo Azure, jsou k dispozici pro správu klíčů ochrany dat napříč několika instancemi aplikací, ale ukázková aplikace ukazuje, jak používat služby Azure.

Nakonfigurujte službu Azure Blob Storage tak, aby uchovávala klíče ochrany dat. Postupujte podle pokynů v poskytovatelích úložiště klíčů v ASP.NET Core.

Nakonfigurujte Azure Key Vault pro šifrování neaktivních uložených klíčů ochrany dat. Postupujte podle pokynů v tématu Konfigurace ASP.NET Základní ochrana dat.

V souboru, Program ve kterém jsou zaregistrované služby, použijte následující kód:

TokenCredential? credential;

if (builder.Environment.IsProduction())
{
    credential = new ManagedIdentityCredential("{MANAGED IDENTITY CLIENT ID}");
}
else
{
    // Local development and testing only
    DefaultAzureCredentialOptions options = new()
    {
        // Specify the tenant ID to use the dev credentials when running the app locally
        // in Visual Studio.
        VisualStudioTenantId = "{TENANT ID}",
        SharedTokenCacheTenantId = "{TENANT ID}"
    };

    credential = new DefaultAzureCredential(options);
}

builder.Services.AddDataProtection()
    .SetApplicationName("BlazorWebAppEntra")
    .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI}"), credential)
    .ProtectKeysWithAzureKeyVault(new Uri("{KEY IDENTIFIER}"), credential);

Do SetApplicationName můžete předat libovolný název aplikace. Stačí ověřit, že všechna nasazení aplikací používají stejnou hodnotu.

{MANAGED IDENTITY CLIENT ID}: ID spravovaného Identity klienta Azure (GUID).

{TENANT ID}: ID nájemce.

{BLOB URI}: Úplná adresa URI k souboru klíče. Identifikátor URI se vygeneruje službou Azure Storage při vytváření souboru klíče. Nepoužívejte SAS.

{KEY IDENTIFIER}: Identifikátor klíče služby Azure Key Vault používaný k šifrování klíčů. Zásady přístupu umožňují aplikaci přistupovat k trezoru klíčů pomocí GetUnwrap KeyWrap Key a oprávnění. Verze klíče se získá v portálu Entra nebo Azure po jeho vytvoření. Pokud povolíte automatickou rotaci klíče trezoru klíčů, ujistěte se, že v konfiguraci klíčového trezoru aplikace používáte identifikátor bez verzování, kde na konci identifikátoru není uveden žádný GUID klíče (například: https://contoso.vault.azure.net/keys/data-protection).

Note

V neprodukčních prostředích se předchozí příklad používá DefaultAzureCredential ke zjednodušení ověřování při vývoji aplikací, které se nasazují do Azure zkombinováním přihlašovacích údajů používaných v hostitelských prostředích Azure s přihlašovacími údaji použitými v místním vývoji. Další informace najdete v tématu Ověřování aplikací .NET hostovaných v Azure v prostředcích Azure pomocí spravované identity přiřazené systémem.

Alternativně můžete aplikaci nakonfigurovat tak, aby zadává hodnoty ze souborů nastavení aplikace pomocí zprostředkovatele konfigurace JSON. Do souboru nastavení aplikace přidejte následující:

"DistributedTokenCache": {
  "DisableL1Cache": false,
  "L1CacheSizeLimit": 524288000,
  "Encrypt": true,
  "SlidingExpirationInHours": 1
},
"DataProtection": {
  "BlobUri": "{BLOB URI}",
  "KeyIdentifier": "{KEY IDENTIFIER}"
}

Příklad DataProtection oddílu:

"DataProtection": {
  "BlobUri": "https://contoso.blob.core.windows.net/data-protection/keys.xml",
  "KeyIdentifier": "https://contoso.vault.azure.net/keys/data-protection"
}

Note

Identifikátor klíče v předchozím příkladu je bez verzí. Na konci identifikátoru neexistuje žádná verze klíče GUID. To je zvlášť důležité, pokud se rozhodnete pro klíč nakonfigurovat automatickou obměnu klíčů. Další informace najdete v tématu Konfigurace automatické obměny kryptografického klíče ve službě Azure Key Vault: Zásady obměny klíčů.

Proveďte v Program souboru následující změny:

builder.Services.Configure<MsalDistributedTokenCacheAdapterOptions>(
    options =>
    {
+       var config = builder.Configuration.GetSection("DistributedTokenCache");

-       options.DisableL1Cache = false;
+       options.DisableL1Cache = config.GetValue<bool>("DisableL1Cache");

-       options.L1CacheOptions.SizeLimit = 500 * 1024 * 1024;
+       options.L1CacheOptions.SizeLimit = config.GetValue<long>("L1CacheSizeLimit");

-       options.Encrypt = true;
+       options.Encrypt = config.GetValue<bool>("Encrypt");

-       options.SlidingExpiration = TimeSpan.FromHours(1);
+       options.SlidingExpiration = 
+           TimeSpan.FromHours(config.GetValue<int>("SlidingExpirationInHours"));
    });

- builder.Services.AddDataProtection()
-     .SetApplicationName("BlazorWebAppEntra")
-     .PersistKeysToAzureBlobStorage(new Uri("{BLOB URI}"), credential)
-     .ProtectKeysWithAzureKeyVault(new Uri("{KEY IDENTIFIER}"), credential);

Do souboru přidejte následující kód, ve kterém jsou nakonfigurované Program služby:

var config = builder.Configuration.GetSection("DataProtection");

builder.Services.AddDataProtection()
    .SetApplicationName("BlazorWebAppEntra")
    .PersistKeysToAzureBlobStorage(
        new Uri(config.GetValue<string>("BlobUri") ??
        throw new Exception("Missing Blob URI")),
        credential)
    .ProtectKeysWithAzureKeyVault(
        new Uri(config.GetValue<string>("KeyIdentifier") ?? 
        throw new Exception("Missing Key Identifier")), 
        credential);

Další informace o používání sdíleného okruhu klíčů ochrany dat a poskytovatelů úložiště klíčů najdete v následujících zdrojích informací:

Předpona cílového přesměrování YARP

Předávání Blazor Web App YARP serveru, kde je přístupový token uživatele připojený k volání webového MinimalApiJwt rozhraní API, určuje cílovou předponu https://weatherapi. Tato hodnota odpovídá názvu projektu předanému AddProject v souboru Program projektu Aspire.AppHost.

Předávací modul v Blazor Web App serverovém projektu (BlazorWebAppEntra):

app.MapForwarder("/weather-forecast", "https://weatherapi", transformBuilder =>
{
    ...
}).RequireAuthorization();

Odpovídající název projektu v Program souboru Aspire projektu hostitele aplikace (Aspire.AppHost):

var weatherApi = builder.AddProject<Projects.MinimalApiJwt>("weatherapi");

Při nasazování do produkčního prostředí není nutné měnit cílovou předponu Blazor Web App služby předávání YARP. Balíček rozhraní MICROSOFT Identity Web Downstream API používá základní identifikátor URI předaný prostřednictvím konfigurace k volání webového rozhraní API z předpony ServerWeatherForecaster, nikoli cílové předpony služby předávání YARP. V produkčním prostředí přeposílač YARP pouze transformuje požadavek a přidá přístupový token uživatele.

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>

Zabezpečení dat o počasí

Další informace o tom, jak tato aplikace zabezpečuje data o počasí, najdete v části Zabezpečená data v Blazor Web Apps interaktivním automatickým vykreslováním.

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.

    Přerušení ladicího programu Visual Studio při výjimce JavaScriptu během odhlášení

    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 brání aplikaci ověřovat klienty, pokud chybí nebo jsou nesprávné oprávnění, instance, ID tenanta, doména tenanta, ID klienta nebo identifikátor URI přesměrování.
    • 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ěrovací URI registrace aplikace. Všimněte si, že port není nutný pro Microsoft Entra ID a aplikaci spuštěnou na vývojové testovací adrese localhost, ale konfigurace 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é konfigurace. Pečlivě zkontrolujte konfiguraci, zda nedošlo k nesprávné konfiguraci aplikace nebo 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 pro vývojářské nástroje najdete v následujících článcích:

    Tým dokumentace reaguje na zpětnou vazbu a chyby v článcích (nahlaste problém z oddílu Tato stránka), ale nemůže poskytovat podporu produktů. 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 zpráv o chybách v rámci, které nejsou bezpečnostní, citlivé ani důvěrné, nahlaste 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 svou povahou citlivá nebo důvěrná, 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í problémů se zabezpečení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:

    1. Na webu Azure Portal přejděte k manifestu aplikace.
    2. allowPublicClient Nastavte atribut na null nebo true.

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 lokality 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 integrovaným vývojovým prostředím (IDE) pro všechny změny 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 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
    • 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 je zástupný prvek {URL} adresa URL k otevření (například https://localhost:5001).
      • Mozilla Firefox: Použijte -private -url {URL}, kde je {URL} zástupný symbol pro adresu URL, kterou chcete otevřít (například https://localhost:5001).
    • Zadejte název do pole Friendly name. 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) zajistí, aby byl prohlížeč zavřený pro všechny změny 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ů:

  1. 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í.
  2. Odstraňte bin a obj složky projektu.
  3. Obnovte a znovu sestavte projekt.
  4. 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