Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Den här artikeln beskriver hur du skyddar en Blazor Web App med Microsofts identitetsplattform med Microsoft-webbpaket Identity för Microsoft Entra-ID med hjälp av en exempelapp.
Den här versionen av artikeln beskriver implementeringen av Entra utan att använda mönstret Serverdel för klientdel (BFF). BFF-mönstret är användbart för att göra autentiserade begäranden till externa tjänster. Ändra artikelversionsväljaren till BFF-mönster om appens specifikation kräver att BFF-mönstret används.
Följande specifikation omfattas:
- 
              Blazor Web App använder automatiskt återgivningsläge med global interaktivitet (InteractiveAuto).
- Serverprojektet anropar AddAuthenticationStateSerialization för att lägga till en leverantör av autentiseringstillstånd på serversidan som använder sig av PersistentComponentState för att strömma autentiseringstillståndet till klienten. Klienten anropar AddAuthenticationStateDeserialization för att deserialisera och använda autentiseringstillståndet som skickas av servern. Autentiseringstillståndet förblir konstant under hela livslängden för WebAssembly-applikationen.
- Appen använder Microsoft Entra-ID, baserat på Microsoft Identity Web-paket.
- Automatisk uppdatering av icke-interaktiva token hanteras av ramverket.
- Appen använder abstraktioner på serversidan och klientsidan för att visa genererade väderdata: - När komponenten Weatheråterges på servern för att visa väderdata använder denServerWeatherForecaster. Microsoft-webbpaket Identity tillhandahåller API för att skapa en namngiven underordnad webbtjänst för att göra webb-API-anrop. <xref:Microsoft.Identity.Abstractions.IDownstreamApi> matas in iServerWeatherForecaster, som används för att anropa <xref:Microsoft.Identity.Abstractions.IDownstreamApi.CallApiForUserAsync%2A> för att hämta väderdata från ett externt webb-API (MinimalApiJwtprojekt).
- När komponenten Weatherrenderas på klienten använder komponenten implementeringen avClientWeatherForecaster-tjänsten, som använder en förkonfigurerad HttpClient (i klientprojektetsProgram-fil) för att göra ett anrop till serverprojektets minimala API (/weather-forecast) för att hämta väderdata. Den minimala API-slutpunkten hämtar väderdata från klassenServerWeatherForecasteroch returnerar dem till klienten för återgivning av komponenten.
 
- När komponenten 
Exempellösning
Exempellösningen består av följande projekt:
- 
              BlazorWebAppEntra: Projekt på serversidan för Blazor Web App, som innehåller ett exempel på en Minimal API--endpoint för väderinformation.
- 
              BlazorWebAppEntra.Client: Klientsideprojektet för Blazor Web App.
- 
              MinimalApiJwt: Backend-webb-API som innehåller ett Minimal API-exempel på en slutpunkt för väderdata.
Få åtkomst till exemplet i den senaste versionsmappen i Blazor-exemplarsamlingen med följande länk. Exemplet finns i mappen BlazorWebAppEntra för .NET 9 eller senare.
Starta lösningen från Aspire/Aspire.AppHost projektet.
Visa eller ladda ned exempelkod (hur du laddar ned)
Appregistreringar för Microsoft Entra-ID
Vi rekommenderar att du använder separata registreringar för appar och webb-API:er, även när apparna och webb-API:erna finns i samma lösning. Följande vägledning gäller för appen och BlazorWebAppEntra webb-API:et för MinimalApiJwt exempellösningen, men samma vägledning gäller vanligtvis för alla Entra-baserade registreringar för appar och webb-API:er.
Registrera webb-API:et (MinimalApiJwt) först så att du sedan kan bevilja åtkomst till webb-API:et när du registrerar appen. Webb-API:ets hyresgäst-ID och klient-ID används för att konfigurera webb-API:et i filen Program. När du har registrerat webb-API:et exponerar du webb-API:et i Appregistreringar>Exponera ett API med omfångsnamnet Weather.Get. Registrera app-ID-URI:n för användning i appens konfiguration.
Registrera sedan appen (BlazorWebAppEntra) med en webbplattformskonfiguration och en omdirigerings-URI av https://localhost/signin-oidc (en port krävs inte). Appens klient-ID, klientdomän och klient-ID, tillsammans med webb-API:ets basadress, app-ID-URI och väderomfattningsnamn, används för att konfigurera appen i filen appsettings.json . Ge API-behörighet att komma åt webb-API:et iAPI-behörigheter för >. Om appens säkerhetsspecifikation anropar den kan du bevilja administratörsmedgivande för organisationen att få åtkomst till webb-API:et. Auktoriserade användare och grupper tilldelas till appens registrering i Appregistreringar>Företagsprogram.
Markera inte någon av kryssrutorna för att auktoriseringsslutpunkten ska returnera åtkomsttoken eller ID-token i appregistreringskonfigurationen för implicit beviljande och hybridflöden i Entra- eller Azure-portalen. OpenID Connect-hanteraren begär automatiskt lämpliga token med hjälp av koden som returneras från auktoriseringsslutpunkten.
Skapa en klienthemlighet i appens registrering i Entra- eller Azure-portalen (Hantera>certifikat och hemligheter>Ny klienthemlighet). Håll kvar på klienthemlighetsvärdet för användning i nästa avsnitt.
Ytterligare entra-konfigurationsvägledning för specifika inställningar finns senare i den här artikeln.
              Blazor Web App projekt på serversidan (BlazorWebAppEntra)
              BlazorWebAppEntra-projektet är projektet på serversidan för Blazor Web App.
Projekt på klientsidan Blazor Web App (BlazorWebAppEntra.Client)
Detta BlazorWebAppEntra.Client-projekt är klientsideprojektet för Blazor Web App.
Om användaren behöver logga in eller ut vid rendering på klientsidan initieras en fullständig sidinläsning.
Backend-webb-API-projekt (MinimalApiJwt)
              MinimalApiJwt-projektet är ett bakände-webb-API för flera frontend-projekt. Projektet konfigurerar en Minimal API- slutpunkt för väderdata.
Den MinimalApiJwt.http filen kan användas för att testa väderdatabegäran. Observera att MinimalApiJwt projektet måste köras för att testa slutpunkten och att slutpunkten är hårdkodad i filen. Mer information finns i Använda .http-filer i Visual Studio 2022.
Projektet innehåller paket och konfiguration för att skapa OpenAPI-dokument och Swagger-användargränssnittet i utvecklingsmiljön. Mer information finns i Använda de genererade OpenAPI-dokumenten.
En dataslutpunkt för säker väderprognos finns i projektets Program fil:
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();
Utökningsmetoden RequireAuthorization kräver auktorisering för routedefinitionen. För alla kontrollanter som du lägger till i projektet lägger du till attributet [Authorize] till kontrollanten eller åtgärden.
Konfigurera webb-API-projektet för backend (MinimalApiJwt)
Konfigurera projektet i JwtBearerOptions-anropet i AddJwtBearer-filen för MinimalApiJwt-projektet.
För webb-API-appens registrering konfigureras omfånget Weather.Get i Entra- eller Azure-portalen i Exponera ett API.
Authority anger auktoriteten för OIDC-anrop.
jwtOptions.Authority = "{AUTHORITY}";
I följande exempel används ett hyresgäst-ID av aaaabbbb-0000-cccc-1111-dddd2222eeee.
Om appen är registrerad i en ME-ID klientorganisation ska myndigheten matcha utfärdaren (iss) för JWT som returneras av identitetsprovidern.
jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/";
Om appen är registrerad i en AAD B2C-klientorganisation:
jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/";
Audience anger målgruppen för alla mottagna JWT-åtkomsttoken.
jwtOptions.Audience = "{AUDIENCE}";
Matcha värdet till bara sökvägen för program-ID-URI:n konfigurerad när du lägger till Weather.Get-omfånget under Exponera ett API i Entra- eller Azure-portalen. Ta inte med omfångsnamnet "Weather.Get" i värdet.
Följande exempel använder ett applikations-ID, klient-ID för 11112222-bbbb-3333-cccc-4444dddd5555. I det andra exemplet används en klientdomän för contoso.onmicrosoft.com.
ME-ID klientorganisationsexempel:
jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";
Exempel på AAD B2C-klientorganisation:
jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";
Konfigurera serverprojektet (BlazorWebAppEntra)
              <xref:Microsoft.Identity.Web.AppBuilderExtension.AddMicrosoftIdentityWebApp%2A> från Microsoft Identity Web (Microsoft.Identity.Web NuGet-paket, API-dokumentation) konfigureras i BlazorWebAppEntra projektets Program fil.
Hämta program-ID:t (klient-), klientdomänen (utgivaren) och katalog-ID:t (klient) från appens registrering i Entra- eller Azure-portalen. App-ID-URI:n hämtas för omfånget Weather.Get från webb-API:ets registrering. Inkludera inte omfångsnamnet när du tar app-ID-URI:n från portalen.
              BlazorWebAppEntra I projektets Program fil anger du värdena för följande platshållare i Microsoft Identity Web Configuration:
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();
Platshållare i föregående konfiguration:
- 
              {CLIENT ID (BLAZOR APP)}: Applikations-ID (klient).
- 
              {DIRECTORY NAME}: Katalognamnet för klientdomänen (för utgivaren).
- 
              {TENANT ID}: Katalog-ID (hyresgäst).
- 
              {BASE ADDRESS}: Webb-API:ets basadress.
- 
              {APP ID URI}: App-ID-URI:n för webb-API-omfång. Något av följande format används, där{CLIENT ID (WEB API)}platshållaren är klient-ID:t för webb-API:ets Entra-registrering, och{DIRECTORY NAME}platshållaren är katalognamnet för klientdomänen (utgivare) (exempel:contoso).- ME-ID klientorganisationsformat: api://{CLIENT ID (WEB API)}
- B2C-klientformat: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}
 
- ME-ID klientorganisationsformat: 
Exempel:
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();
Den här versionen av artikeln beskriver implementeringen av Entra med mönstret Serverdel för klientdel (BFF). Ändra artikelversionsväljaren till icke-BFF-mönster om appens specifikation inte kräver att BFF-mönstret används.
Följande specifikation omfattas:
- 
              Blazor Web App använder automatiskt återgivningsläge med global interaktivitet (InteractiveAuto).
- Serverprojektet anropar AddAuthenticationStateSerialization för att lägga till en leverantör av autentiseringstillstånd på serversidan som använder sig av PersistentComponentState för att strömma autentiseringstillståndet till klienten. Klienten anropar AddAuthenticationStateDeserialization för att deserialisera och använda autentiseringstillståndet som skickas av servern. Autentiseringstillståndet förblir konstant under hela livslängden för WebAssembly-applikationen.
- Appen använder Microsoft Entra-ID, baserat på Microsoft Identity Web-paket.
- Automatisk uppdatering av icke-interaktiva token hanteras av ramverket.
- BFF-mönstret (Backend for Frontend) används med hjälp av .NET Aspire för tjänstidentifiering och YARP- för proxyförfrågningar till väderprognos-slutpunkten i backend-appen.
- Ett backend-webb-API använder JWT-bärarautentisering för att verifiera JWT-tokens som sparats av Blazor Web App i inloggning cookie.
- Aspire förbättrar upplevelsen av att skapa .NET-molnbaserade appar. Det ger en konsekvent, åsiktsuppsättning med verktyg och mönster för att skapa och köra distribuerade appar.
- YARP (Yet Another Reverse Proxy) är ett bibliotek som används för att skapa en omvänd proxyserver.
 
- Appen använder abstraktioner på serversidan och klientsidan för att visa genererade väderdata.
- När komponenten Weatheråterges på servern för att visa väderdata använder denServerWeatherForecaster. Microsoft-webbpaket Identity tillhandahåller API för att skapa en namngiven underordnad webbtjänst för att göra webb-API-anrop. <xref:Microsoft.Identity.Abstractions.IDownstreamApi> matas in iServerWeatherForecaster, som används för att anropa <xref:Microsoft.Identity.Abstractions.IDownstreamApi.CallApiForUserAsync%2A> för att hämta väderdata från ett externt webb-API (MinimalApiJwtprojekt).
- När komponenten Weatherrenderas på klienten använder komponenten implementeringen avClientWeatherForecaster-tjänsten, som använder en förkonfigurerad HttpClient (i klientprojektetsProgram-fil) för att göra ett anrop till serverprojektets minimala API (/weather-forecast) för att hämta väderdata. Den minimala API-slutpunkten hämtar en åtkomsttoken för användaren genom att anropa <xref:Microsoft.Identity.Web.ITokenAcquisition.GetAccessTokenForUserAsync%2A>. Tillsammans med rätt omfång görs ett omvänd proxyanrop till det externa webb-API:et (MinimalApiJwtprojektet) för att hämta och returnera väderdata till klienten för återgivning av komponenten.
 
- När komponenten 
Mer information om .NET Aspirefinns i Allmän tillgänglighet för .NET Aspire: Förenkling av .NET Cloud-Native Utveckling (maj, 2024).
Förutsättningar
.NET Aspire kräver Visual Studio version 17.10 eller senare.
Se även avsnittet Krav i Snabbstart: Skapa din första .NET Aspire app.
Exempellösning
Exempellösningen består av följande projekt:
- 
              .NET Aspire: - 
              Aspire.AppHost: Används för att hantera högnivåorkestreringsproblem för appen.
- 
              Aspire.ServiceDefaults: Innehåller standardkonfigurationer för .NET Aspire appar som kan utökas och anpassas efter behov.
 
- 
              
- 
              MinimalApiJwt: Backend-webb-API som innehåller ett Minimal API-exempel på en slutpunkt för väderdata.
- 
              BlazorWebAppEntra: Serversideprojektet för Blazor Web App.
- 
              BlazorWebAppEntra.Client: Klientsideprojektet för Blazor Web App.
Få åtkomst till exemplet i den senaste versionsmappen i Blazor-exemplarsamlingen med följande länk. Exemplet finns i mappen BlazorWebAppEntraBff för .NET 9 eller senare.
Visa eller ladda ned exempelkod (hur du laddar ned)
Appregistreringar för Microsoft Entra-ID
Vi rekommenderar att du använder separata registreringar för appar och webb-API:er, även när apparna och webb-API:erna finns i samma lösning. Följande vägledning gäller för appen och BlazorWebAppEntra webb-API:et för MinimalApiJwt exempellösningen, men samma vägledning gäller vanligtvis för alla Entra-baserade registreringar för appar och webb-API:er.
Registrera webb-API:et (MinimalApiJwt) först så att du sedan kan bevilja åtkomst till webb-API:et när du registrerar appen. Webb-API:ets hyresgäst-ID och klient-ID används för att konfigurera webb-API:et i filen Program. När du har registrerat webb-API:et exponerar du webb-API:et i Appregistreringar>Exponera ett API med omfångsnamnet Weather.Get. Registrera app-ID-URI:n för användning i appens konfiguration.
Registrera sedan appen (BlazorWebAppEntra) med en webbplattformskonfiguration och en omdirigerings-URI av https://localhost/signin-oidc (en port krävs inte). Appens klient-ID, klientdomän och klient-ID, tillsammans med webb-API:ets basadress, app-ID-URI och väderomfattningsnamn, används för att konfigurera appen i filen appsettings.json . Ge API-behörighet att komma åt webb-API:et iAPI-behörigheter för >. Om appens säkerhetsspecifikation anropar den kan du bevilja administratörsmedgivande för organisationen att få åtkomst till webb-API:et. Auktoriserade användare och grupper tilldelas till appens registrering i Appregistreringar>Företagsprogram.
Markera inte någon av kryssrutorna för att auktoriseringsslutpunkten ska returnera åtkomsttoken eller ID-token i appregistreringskonfigurationen för implicit beviljande och hybridflöden i Entra- eller Azure-portalen. OpenID Connect-hanteraren begär automatiskt lämpliga token med hjälp av koden som returneras från auktoriseringsslutpunkten.
Skapa en klienthemlighet i appens registrering i Entra- eller Azure-portalen (Hantera>certifikat och hemligheter>Ny klienthemlighet). Håll kvar på klienthemlighetsvärdet för användning i nästa avsnitt.
Ytterligare entra-konfigurationsvägledning för specifika inställningar finns senare i den här artikeln.
.NET Aspire projekt
Mer information om hur du använder .NET Aspire och information om .AppHost och .ServiceDefaults projekt i exempelappen finns i .NET Aspire dokumentationen.
Bekräfta att du har uppfyllt kraven för .NET Aspire. Mer information finns i avsnittet Krav i Snabbstart: Skapa din första .NET Aspire app.
Exempelappen konfigurerar endast en osäker HTTP-startprofil (http) för användning under utvecklingstestning. Mer information, inklusive ett exempel på profiler för osäkra och säkra startinställningar, finns i Tillåt osäker transport i .NET Aspire (.NET Aspire dokumentation).
              Blazor Web App projekt på serversidan (BlazorWebAppEntra)
              BlazorWebAppEntra-projektet är projektet på serversidan för Blazor Web App.
Projekt på klientsidan Blazor Web App (BlazorWebAppEntra.Client)
Detta BlazorWebAppEntra.Client-projekt är klientsideprojektet för Blazor Web App.
Om användaren behöver logga in eller ut vid rendering på klientsidan initieras en fullständig sidinläsning.
Backend-webb-API-projekt (MinimalApiJwt)
              MinimalApiJwt-projektet är ett bakände-webb-API för flera frontend-projekt. Projektet konfigurerar en Minimal API- slutpunkt för väderdata. Begäranden från Blazor Web App projekt på serversidan (BlazorWebAppEntra) skickas till MinimalApiJwt projektet.
Den MinimalApiJwt.http filen kan användas för att testa väderdatabegäran. Observera att MinimalApiJwt projektet måste köras för att testa slutpunkten och att slutpunkten är hårdkodad i filen. Mer information finns i Använda .http-filer i Visual Studio 2022.
Projektet innehåller paket och konfiguration för att skapa OpenAPI-dokument och Swagger-användargränssnittet i utvecklingsmiljön. Mer information finns i Använda de genererade OpenAPI-dokumenten.
En dataslutpunkt för säker väderprognos finns i projektets Program fil:
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();
Utökningsmetoden RequireAuthorization kräver auktorisering för routedefinitionen. För alla kontrollanter som du lägger till i projektet lägger du till attributet [Authorize] till kontrollanten eller åtgärden.
Konfigurera webb-API-projektet för backend (MinimalApiJwt)
              MinimalApiJwt Konfigurera projektet i JwtBearerOptions anropet AddJwtBearer i projektets Program fil.
För webb-API-appens registrering konfigureras omfånget Weather.Get i Entra- eller Azure-portalen i Exponera ett API.
Authority anger auktoriteten för OIDC-anrop.
jwtOptions.Authority = "{AUTHORITY}";
I följande exempel används ett hyresgäst-ID av aaaabbbb-0000-cccc-1111-dddd2222eeee.
Om appen är registrerad i en ME-ID klientorganisation ska myndigheten matcha utfärdaren (iss) för JWT som returneras av identitetsprovidern.
jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/";
Om appen är registrerad i en AAD B2C-klientorganisation:
jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/";
Audience anger målgruppen för alla mottagna JWT-åtkomsttoken.
jwtOptions.Audience = "{AUDIENCE}";
Matcha värdet till bara sökvägen för program-ID-URI:n konfigurerad när du lägger till Weather.Get-omfånget under Exponera ett API i Entra- eller Azure-portalen. Ta inte med omfångsnamnet "Weather.Get" i värdet.
Följande exempel använder ett applikations-ID, klient-ID för 11112222-bbbb-3333-cccc-4444dddd5555. I det andra exemplet används en klientdomän för contoso.onmicrosoft.com.
ME-ID klientorganisationsexempel:
jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";
Exempel på AAD B2C-klientorganisation:
jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";
Konfigurera serverprojektet (BlazorWebAppEntra)
              <xref:Microsoft.Identity.Web.AppBuilderExtension.AddMicrosoftIdentityWebApp%2A> från Microsoft Identity Web (Microsoft.Identity.Web NuGet-paket, API-dokumentation) konfigureras i BlazorWebAppEntra projektets Program fil.
Hämta program-ID:t (klient-), klientdomänen (utgivaren) och katalog-ID:t (klient) från appens registrering i Entra- eller Azure-portalen. App-ID-URI:n hämtas för omfånget Weather.Get från webb-API:ets registrering. Inkludera inte omfångsnamnet när du tar app-ID-URI:n från portalen.
              BlazorWebAppEntra I projektets Program fil anger du värdena för följande platshållare i Microsoft Identity Web Configuration:
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();
Platshållare i föregående konfiguration:
- 
              {CLIENT ID (BLAZOR APP)}: Applikations-ID (klient).
- 
              {DIRECTORY NAME}: Katalognamnet för klientdomänen (för utgivaren).
- 
              {TENANT ID}: Katalog-ID (hyresgäst).
- 
              {BASE ADDRESS}: Webb-API:ets basadress.
- 
              {APP ID URI}: App-ID-URI:n för webb-API-omfång. Något av följande format används, där{CLIENT ID (WEB API)}platshållaren är klient-ID:t för webb-API:ets Entra-registrering, och{DIRECTORY NAME}platshållaren är katalognamnet för klientdomänen (utgivare) (exempel:contoso).- ME-ID klientorganisationsformat: api://{CLIENT ID (WEB API)}
- B2C-klientformat: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}
 
- ME-ID klientorganisationsformat: 
Exempel:
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();
Varning
Produktionsappar bör använda en leverantör för distribuerad token-cache för produktion. Annars kan appen ha dåliga prestanda i vissa scenarier. Mer information finns i avsnittet Använda en leverantör av distribuerad tokencache för produktion .
Återanropssökvägen (CallbackPath) måste matcha den omdirigerings-URI (sökväg för återanrop för inloggning) som konfigurerades vid registreringen av programmet i Entra- eller Azure-portalen. Sökvägar konfigureras i avsnittet Autentisering för appregistrering. Standardvärdet för CallbackPath är /signin-oidc för en registrerad omdirigerings-URI för https://localhost/signin-oidc (en port krävs inte).
              SignedOutCallbackPath är sökvägen för begäran inom appens bassökväg som fångas upp av OpenID Connect-hanteraren där användaragenten först returneras efter utloggning från Entra. Exempelappen anger inte något värde för sökvägen eftersom standardvärdet "/signout-callback-oidc" används. Efter att ha avlyssnat begäran omdirigerar OpenID Connect-hanteraren till SignedOutRedirectUri eller RedirectUri, om det är angivet.
Konfigurera den utloggade återställningssökvägen i appens Entra-registrering. I Entra- eller Azure-portalen anger du sökvägen i Web-plattformskonfigurationens omdirigerings-URI poster:
https://localhost/signout-callback-oidc
Obs
En port krävs inte för localhost adresser när du använder Entra.
Om du inte lägger till URI för utloggningsåterkallningssökvägen i appens registrering i Entra, kommer Entra att vägra omdirigera användaren tillbaka till appen och istället bara be dem stänga webbläsarfönstret.
Obs
Entra omdirigerar inte en primär administratörsanvändare (rotkonto) eller extern användare tillbaka till Blazor-programmet. I stället loggar Entra ut användaren från appen och rekommenderar att de stänger alla webbläsarfönster. Mer information finns i postLogoutRedirectUri fungerar inte när utfärdar-URL:en innehåller ett klient-ID (AzureAD/microsoft-authentication-library-for-js #5783).
Varning
Lagra inte apphemligheter, anslutningssträngar, autentiseringsuppgifter, lösenord, personliga identifieringsnummer (PIN),privat C#/.NET-kod eller privata nycklar/token i kod på klientsidan, vilket är alltid osäker. I test-/mellanlagrings- och produktionsmiljöer bör Blazor kod på serversidan och webb-API:er använda säkra autentiseringsflöden som undviker att underhålla autentiseringsuppgifter i projektkod eller konfigurationsfiler. Förutom testning av lokal utveckling rekommenderar vi att du undviker användning av miljövariabler för att lagra känsliga data, eftersom miljövariabler inte är den säkraste metoden. För testning av lokal utveckling rekommenderas verktyget Secret Manager för att skydda känsliga data. Mer information finns i På ett säkert sätt underhålla känsliga data och autentiseringsuppgifter.
Upprätta klienthemligheten
Det här avsnittet gäller endast serverprojektet för Blazor Web App.
Använd någon av eller båda av följande metoder för att tillhandahålla klienthemligheten till appen:
- Secret Manager-verktyget: Secret Manager-verktyget lagrar privata data på den lokala datorn och används endast under lokal utveckling.
- Azure Key Vault-: Du kan lagra klienthemligheten i ett nyckelvalv för användning i alla miljöer, inklusive för utvecklingsmiljön när du arbetar lokalt. Vissa utvecklare föredrar att använda nyckelvalv för mellanlagrings- och produktionsdistributioner och använder Secret Manager-verktyget för lokal utveckling.
Vi rekommenderar starkt att du undviker att lagra klienthemligheter i projektkod eller konfigurationsfiler. Använd säkra autentiseringsflöden, till exempel någon av eller båda metoderna i det här avsnittet.
Secret Manager-verktyget
Verktyget Secret Manager kan lagra serverappens klienthemlighet under konfigurationsnyckeln AzureAd:ClientSecret.
Serverappen Blazor har inte initierats för Secret Manager-verktyget. Använd ett kommandogränssnitt, till exempel PowerShell-kommandogränssnittet Developer i Visual Studio, för att köra följande kommando. Innan du kör kommandot ändrar du katalogen med kommandot cd till serverprojektets katalog. Kommandot upprättar en identifierare för användarhemligheter (<UserSecretsId>) i serverappens projektfil, som används internt av verktyget för att spåra hemligheter för appen:
dotnet user-secrets init
Kör följande kommando för att ange klienthemligheten. Platshållaren {SECRET} är klienthemligheten som hämtas från appens Entra-registrering:
dotnet user-secrets set "AzureAd:ClientSecret" "{SECRET}"
Om du använder Visual Studio kan du bekräfta att hemligheten har angetts genom att högerklicka på serverprojektet i Solution Explorer och välja Hantera användarhemligheter.
Azure 密钥保管库
Azure Key Vault- är en säker metod för att tillhandahålla appens klienthemlighet till appen.
Information om hur du skapar ett nyckelvalv och anger en klienthemlighet finns i Om Azure Key Vault-hemligheter (Azure-dokumentation), som korslänkar resurser för att komma igång med Azure Key Vault. Om du vill implementera koden i det här avsnittet registrerar du nyckelvalvets URI och det hemliga namnet från Azure när du skapar nyckelvalvet och hemligheten. I exemplet i det här avsnittet är det hemliga namnet "BlazorWebAppEntraClientSecret".
När du upprättar nyckelvalvet i Entra- eller Azure-portalen:
- Konfigurera nyckelvalvet så att det använder rollbaserad åtkomstkontroll i Azure (RABC). Om du inte arbetar i ett virtuellt Azure-nätverk, inklusive för lokal utveckling och testning, bekräftar du att offentlig åtkomst i nätverkssteget är aktiverad (markerad). Om du aktiverar offentlig åtkomst exponeras endast nyckelvalvets slutpunkt. Autentiserade konton krävs fortfarande för åtkomst. 
- Skapa en Azure Managed Identity (eller lägg till en roll i den befintliga Managed Identity som du planerar att använda) med rollen Användare av Key Vault-hemligheter. Tilldela den hanterade Identity till den Azure App Service som är värd för distributionen: Inställningar>Identity>Användartilldelad>Lägg till. - Obs - Om du även planerar att köra en app lokalt med en behörig användare för åtkomst till nyckelvalvet med hjälp av Azure CLI eller Visual Studio Azure Service Authentication lägger du till ditt Azure-användarkonto för utvecklare i Åtkomstkontroll (IAM) med rollen Key Vault Secrets User . Om du vill använda Azure CLI via Visual Studio, kör kommandot - az loginfrån Utvecklar-PowerShell-panelen och följ anvisningarna för att autentisera med tenant.
Om du vill implementera koden i det här avsnittet registrerar du nyckelvalvets URI (exempel: "https://contoso.vault.azure.net/", avslutande snedstreck krävs) och det hemliga namnet (exempel: "BlazorWebAppEntraClientSecret") från Azure när du skapar nyckelvalvet och hemligheten.
Viktig
En nyckelvalvshemlighet skapas med ett förfallodatum. Se till att spåra när en nyckelvalvshemlighet upphör att gälla och skapa en ny hemlighet för appen innan det datumet passerar.
Lägg till följande AzureHelper-klass i serverprojektet. Metoden GetKeyVaultSecret hämtar en hemlighet från ett nyckelvalv. Justera namnområdet (BlazorSample.Helpers) så att det matchar projektets namnområdesschema.
              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;
    }
}
Obs
I föregående exempel används DefaultAzureCredential för att förenkla autentiseringen vid utveckling av appar som distribueras till Azure genom att kombinera autentiseringsuppgifter som används i Azure-värdmiljöer med autentiseringsuppgifter som används i lokal utveckling. När du flyttar till produktion är ett bättre alternativ till exempel ManagedIdentityCredential. Mer information finns i Autentisera Azure-värdbaserade .NET-appar till Azure-resurser med hjälp av en systemtilldelad hanterad identitet.
Om tjänster registreras i serverprojektets Program-fil hämtar och tillämpar du klienthemligheten med hjälp av följande kod:
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);
}
Där <xref:Microsoft.Identity.Web.MicrosoftIdentityOptions> är inställda, ring GetKeyVaultSecret för att ta emot och tilldela appens klienthemlighet:
msIdentityOptions.ClientSecret = AzureHelper.GetKeyVaultSecret("{VAULT URI}", 
    credential, "{SECRET NAME}");
              {MANAGED IDENTITY CLIENT ID}: Azure Hanterad Identity Klient-ID (GUID).
              {TENANT ID}: Katalog-ID (hyresgäst). Exempel: aaaabbbb-0000-cccc-1111-dddd2222eeee
              {VAULT URI}: Nyckelvalvs-URI. Inkludera det avslutande snedstrecket på URI:n. Exempel: https://contoso.vault.azure.net/
              {SECRET NAME}: Hemligt namn. Exempel: BlazorWebAppEntraClientSecret
Konfigurationen används för att underlätta tillhandahållandet av dedikerade nyckelvalv och hemliga namn baserat på appens miljökonfigurationsfiler. Du kan till exempel ange olika konfigurationsvärden för appsettings.Development.json under utveckling, appsettings.Staging.json vid mellanlagring och appsettings.Production.json för produktionsdistributionen. Mer information finns i ASP.NET Core Blazor configuration.
Serialisera endast namn- och rollanspråken
              Program I filen serialiseras alla anspråk genom att ange SerializeAllClaims till true. Om du bara vill att namn- och rollanspråken ska serialiseras för CSR tar du bort alternativet eller anger det till false.
Ange konfiguration med JSON-konfigurationsprovidern (appinställningar)
              Exempellösningsprojekten konfigurerar Microsoft Identity Web- och JWT-ägarautentisering i sina Program filer för att göra konfigurationsinställningarna identifierbara med C#-automatisk komplettering. Professionella appar använder vanligtvis en konfigurationsprovider för att konfigurera OIDC-alternativ, till exempel JSON-standardkonfigurationsprovidern. JSON-konfigurationsprovidern läser in konfigurationen från appinställningarsfiler appsettings.json/appsettings.{ENVIRONMENT}.json, där {ENVIRONMENT} platshållaren är appens körningsmiljö. Följ anvisningarna i det här avsnittet om du vill använda appinställningar för konfiguration.
Lägg till följande JSON-konfiguration i appens inställningsfil (appsettings.json) i BlazorWebAppEntra projektet:
{
  "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" ]
  }
}
Uppdatera platshållarna i föregående konfiguration så att de matchar de värden som appen använder i Program filen:
- 
              {CLIENT ID (BLAZOR APP)}: Applikations-ID (klient).
- 
              {DIRECTORY NAME}: Katalognamnet för klientdomänen (för utgivaren).
- 
              {TENANT ID}: Katalog-ID (hyresgäst).
- 
              {BASE ADDRESS}: Webb-API:ets basadress.
- 
              {APP ID URI}: App-ID-URI:n för webb-API-omfång. Något av följande format används, där{CLIENT ID (WEB API)}platshållaren är klient-ID:t för webb-API:ets Entra-registrering, och{DIRECTORY NAME}platshållaren är katalognamnet för klientdomänen (utgivare) (exempel:contoso).- ME-ID klientorganisationsformat: api://{CLIENT ID (WEB API)}
- B2C-klientformat: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}
 
- ME-ID klientorganisationsformat: 
Exempel:
"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" ]
}
Uppdatera andra värden i föregående konfiguration så att de matchar anpassade/icke-standardvärden som används i Program filen.
Konfigurationen hämtas automatiskt av autentiseringsverktyget.
Gör följande ändringar i Program filen:
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();
Obs
Produktionsappar bör använda en leverantör för distribuerad token-cache för produktion. Annars kan appen ha dåliga prestanda i vissa scenarier. Mer information finns i avsnittet Använda en leverantör av distribuerad tokencache för produktion .
              MinimalApiJwt I projektet lägger du till följande konfiguration av appinställningar i appsettings.json filen:
"Authentication": {
  "Schemes": {
    "Bearer": {
      "Authority": "https://sts.windows.net/{TENANT ID (WEB API)}/",
      "ValidAudiences": [ "{APP ID URI (WEB API)}" ]
    }
  }
},
Uppdatera platshållarna i föregående konfiguration så att de matchar de värden som appen använder i Program filen:
- 
              {TENANT ID (WEB API)}: Hyresgästens ID för webb-API:et.
- 
              {APP ID URI (WEB API)}: App-ID-URI:n för webb-API:et.
Myndighetsformat använder följande mönster:
- ME-ID klienttyp: https://sts.windows.net/{TENANT ID}/
- B2C-klienttyp: https://login.microsoftonline.com/{TENANT ID}/v2.0/
Målgruppsformat använder följande mönster ({CLIENT ID} är klient-ID:t för webb-API:et, {DIRECTORY NAME} är katalognamnet, till exempel contoso):
- ME-ID klienttyp: api://{CLIENT ID}
- B2C-klienttyp: https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
Konfigurationen hämtas automatiskt av JWT-ägarautentiseringsverktyget.
Ta bort följande rader från Program filen:
- jwtOptions.Authority = "...";
- jwtOptions.Audience = "...";
Mer information om konfiguration finns i följande resurser:
Använd en leverantör av distribuerad tokencache för produktion
Minnesinterna distribuerade tokencacher skapas vid anrop av <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.DistributedTokenCacheAdapterExtension.AddDistributedTokenCaches%2A> för att säkerställa att det finns en basimplementering tillgänglig för cachelagring av distribuerade token.
Produktionswebbappar och webb-API:er bör använda en cache för distribuerad token för produktion (till exempel : Redis, Microsoft SQL Server, Microsoft Azure Cosmos DB).
Obs
För lokal utveckling och testning på en enda dator kan du använda minnesinterna tokencacheminnen i stället för distribuerade tokencacheminnen:
builder.Services.AddInMemoryTokenCaches();
Senare under utvecklings- och testperioden ska du anta en produktionsinriktad leverantör för distribuerad tokencache.
AddDistributedMemoryCache lägger till en standardimplementering av IDistributedCache som lagrar cacheobjekt i minnet, som används av Microsoft Identity Web för cachelagring av token.
Cacheminnet för distribuerad token konfigureras av <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions>:
- Under utveckling i felsökningssyfte kan du inaktivera L1-cachen genom att ange <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.DisableL1Cache%2A> till true. Se till att återställa den tillfalseför produktion.
- Ange den maximala storleken på L1-cachen med L1CacheOptions.SizeLimitför att förhindra att cacheminnet överskrider serverns minne. Standardvärdet är 500 MB.
- Under utveckling i felsökningssyfte kan du inaktivera tokenkryptering i vila genom att ange <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.Encrypt%2A> till false, vilket är standardvärdet. Se till att återställa den tilltrueför produktion.
- Ange borttagning av token från cachen med SlidingExpiration. Standardvärdet är 1 timme.
- Mer information, inklusive vägledning om återanrop för L2-cachefel (<xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.OnL2CacheFailure%2A>) och asynkrona L2-cacheskrivningar (<xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.EnableAsyncL2Write%2A>), finns i <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions> och Token cache serialisering: Distribuerade tokencacheminnen.
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 kräver en paketreferens till Microsoft.Extensions.Caching.Memory NuGet-paketet.
Obs
Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Information om hur du konfigurerar en distribuerad cacheprovider för produktion finns i Distribuerad cachelagring i ASP.NET Core.
Varning
Ersätt alltid de in-memory distribuerade tokens med en riktig tokencacheprovider när du levererar appen till en produktionsmiljö. Om du inte kan använda en leverantör av distribuerad tokencache för produktion kan appen få avsevärt sämre prestanda.
Mer information finns i Token cache serialisering: Distribuerade cacheminnen. De kodexempel som visas gäller dock inte för ASP.NET Core-appar som konfigurerar distribuerade cacheminnen via AddDistributedMemoryCache, inte <xref:Microsoft.Identity.Web.TokenCacheExtensions.AddDistributedTokenCache%2A>.
Använd en delad dataskyddsnyckelring i produktion så att instanser av appen över servrar i en webbserverfarm kan dekryptera tokenen när <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.Encrypt%2A?displayProperty=nameWithType> är inställd på true.
Obs
För tidig utveckling och lokal testning på en enda dator kan du ange <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.Encrypt%2A> till false och konfigurera en delad dataskyddsnyckelring senare:
options.Encrypt = false;
Senare under utvecklings- och testperioden aktiverar du tokenkryptering och antar en delad dataskyddsnyckelring.
I följande exempel visas hur du använder Azure Blob Storage och Azure Key Vault (PersistKeysToAzureBlobStorage/ProtectKeysWithAzureKeyVault) för den delade nyckelringen. Tjänstkonfigurationerna är basfallsscenarier i demonstrationssyfte. Innan du distribuerar produktionsappar kan du bekanta dig med Azure-tjänsterna och använda metodtips med hjälp av Azure-tjänsternas dedikerade dokumentationsuppsättningar, som är länkade i slutet av det här avsnittet.
Bekräfta förekomsten av följande paket i serverprojektet för Blazor Web App:
Obs
Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Obs
Innan du fortsätter med följande steg kontrollerar du att appen är registrerad hos Microsoft Entra.
Följande kod implementeras vanligtvis samtidigt som en leverantör av distribuerad tokencache för produktion implementeras. Andra alternativ, både i Azure och utanför Azure, är tillgängliga för hantering av dataskyddsnycklar över flera appinstanser, men exempelappen visar hur du använder Azure-tjänster.
Konfigurera Azure Blob Storage för att underhålla dataskyddsnycklar. Följ riktlinjerna i Nyckellagringsprovidrar i ASP.NET Core.
Konfigurera Azure Key Vault för att kryptera de vilande dataskyddsnycklarna. Följ riktlinjerna i Konfigurera ASP.NET Core Data Protection.
Använd följande kod i Program filen där tjänster är registrerade:
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);
Du kan skicka valfritt appnamn till SetApplicationName. Bekräfta bara att alla appdistributioner använder samma värde.
              {MANAGED IDENTITY CLIENT ID}: Azure Hanterad Identity Klient-ID (GUID).
              {TENANT ID}: Hyresgäst-ID.
              {BLOB URI}: Fullständig URI till nyckelfilen. URI:n genereras av Azure Storage när du skapar nyckelfilen. Använd inte en SAS.
              {KEY IDENTIFIER}: Azure Key Vault-nyckelidentifierare som används för nyckelkryptering. Med en åtkomstprincip kan programmet komma åt nyckelvalvet med Getbehörigheterna , Unwrap Keyoch Wrap Key . Versionen av nyckeln hämtas från nyckeln i Entra- eller Azure-portalen när den har skapats. Om du aktiverar autorotation av nyckelvalvsnyckeln kontrollerar du att du använder en versionslös nyckelidentifierare i appens nyckelvalvskonfiguration, där inget nyckel-GUID placeras i slutet av identifieraren (exempel: https://contoso.vault.azure.net/keys/data-protection).
Obs
I miljöer som inte är produktionsmiljöer används DefaultAzureCredential föregående exempel för att förenkla autentiseringen vid utveckling av appar som distribueras till Azure genom att kombinera autentiseringsuppgifter som används i Azure-värdmiljöer med autentiseringsuppgifter som används i lokal utveckling. Mer information finns i Autentisera Azure-värdbaserade .NET-appar till Azure-resurser med hjälp av en systemtilldelad hanterad identitet.
Du kan också konfigurera appen så att den anger värdena från appinställningsfilerna med hjälp av JSON-konfigurationsprovidern. Lägg till följande i appinställningsfilen:
"DistributedTokenCache": {
  "DisableL1Cache": false,
  "L1CacheSizeLimit": 524288000,
  "Encrypt": true,
  "SlidingExpirationInHours": 1
},
"DataProtection": {
  "BlobUri": "{BLOB URI}",
  "KeyIdentifier": "{KEY IDENTIFIER}"
}
Exempelavsnitt DataProtection :
"DataProtection": {
  "BlobUri": "https://contoso.blob.core.windows.net/data-protection/keys.xml",
  "KeyIdentifier": "https://contoso.vault.azure.net/keys/data-protection"
}
Obs
Nyckelidentifieraren i föregående exempel är versionslös. Det finns ingen GUID-nyckelversion i slutet av identifieraren. Detta är särskilt viktigt om du väljer att konfigurera automatisk nyckelrotation för nyckeln. Mer information finns i Konfigurera automatisk rotation av kryptografiska nycklar i Azure Key Vault: Princip för nyckelrotation.
Gör följande ändringar i Program filen:
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);
Lägg till följande kod där tjänster konfigureras i Program filen:
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);
Mer information om hur du använder en delad dataskyddsnyckelring och nyckellagringsproviders finns i följande resurser:
- Nyckellagringsproviders i ASP.NET Core
- Konfigurera ASP.NET Core Data Protection
- Använda Azure SDK för .NET i ASP.NET Core-appar
- Värd ASP.NET Core i en webbgrupp: Dataskydd
- Konfigurera ASP.NET Core Data Protection
- Nyckellagringsproviders i ASP.NET Core
- Dokumentation om Azure Key Vault
- Dokumentation om Azure Storage
- Ge åtkomst till Key Vault-nycklar, certifikat och hemligheter med rollbaserad åtkomstkontroll i Azure
YARP-vidarebefordrarens målprefix
Serverprojektets Blazor Web App YARP-vidarebefordrare, där användarens åtkomsttoken är kopplad till webb-API-anropet MinimalApiJwt , anger målprefixet https://weatherapi. Det här värdet matchar projektnamnet som skickas till AddProject i Program projektets Aspire.AppHost fil.
Vidarebefordrare i Blazor Web App serverprojektet (BlazorWebAppEntra):
app.MapForwarder("/weather-forecast", "https://weatherapi", transformBuilder =>
{
    ...
}).RequireAuthorization();
Matchande projektnamn i filen för Program Aspire App Host-projektet (Aspire.AppHost):
var weatherApi = builder.AddProject<Projects.MinimalApiJwt>("weatherapi");
Du behöver inte ändra målprefixet för YARP-vidarebefordraren när du distribuerar Blazor Web App till produktion. Microsoft Identity Web Downstream API-paketet använder bas-URI:n som skickas via konfigurationen för att göra webb-API-anropet från ServerWeatherForecaster, inte från målprefixet för YARP-vidarebefordraren. I produktion transformerar YARP-vidarebefordraren bara begäran och lägger till användarens åtkomsttoken.
Omdirigera till startsidan vid utloggning
Komponenten LogInOrOut (Layout/LogInOrOut.razor) anger ett dolt fält för retur-URL:en (ReturnUrl) till den aktuella URL:en (currentURL). När användaren loggar ut från appen returnerar identitetsprovidern användaren till sidan som de loggade ut från. Om användaren loggar ut från en säker sida returneras de till samma säkra sida och skickas tillbaka via autentiseringsprocessen. Det här autentiseringsflödet är rimligt när användarna behöver ändra konton regelbundet.
Du kan också använda följande LogInOrOut komponent, som inte anger någon retur-URL när du loggar ut.
              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>
Väderdatasäkerhet
Mer information om hur den här appen säkrar sina väderdata finns i Säkra data i Blazor Web Apps med interaktiv automatisk återgivning.
Felsöka
Skogsavverkning
Serverappen är en standardapp för ASP.NET Core. Se vägledningen för ASP.NET Core-loggning för att aktivera en lägre loggningsnivå i serverappen.
Information om hur du aktiverar felsökning eller spårningsloggning för Blazor WebAssembly autentisering finns i avsnittet autentiseringsloggning på klientsidani ASP.NET Core-loggning Blazor med artikelversionsväljaren inställd på ASP.NET Core i .NET 7 eller senare.
Vanliga fel
- Debuggern avbryter på ett undantag under utloggning med Microsoft Entra External ID - Följande undantag stoppar Visual Studio-felsökningsprogrammet vid utloggning med Microsoft Entra Externt ID: - Uncaught TypeError TypeError: Failed to execute 'postMessage' on 'Window': The provided value cannot be converted to a sequence.   - Undantaget genereras från Entra JavaScript-kod, så det här är inget problem med ASP.NET Core. Undantaget påverkar inte appfunktionerna i produktion, så undantaget kan ignoreras vid testning av lokal utveckling. 
- Felkonfiguration av appen eller Identity IP-leverantör - De vanligaste felen orsakas av felaktig konfiguration. Följande är några exempel: - Beroende på kraven i scenariot förhindrar en saknad eller felaktig utfärdare, instans, klient-ID, klientdomän, klient-ID eller omdirigerings-URI en app från att autentisera klienter.
- Felaktiga omfång för begäran hindrar klienter från att komma åt serverwebb-API-slutpunkter.
- Felaktiga eller saknade server-API-behörigheter hindrar klienter från att komma åt serverwebb-API-slutpunkter.
- Köra appen på en annan port än vad som har konfigurerats i omdirigerings-URI:n för IP-adressens appregistrering. Observera att en port inte krävs för Microsoft Entra-ID och en app som körs på en localhostutvecklingstestningsadress, men appens portkonfiguration och porten där appen körs måste matcha för icke-localhostadresser.
 - Konfigurationsomfattningen i den här artikeln visar exempel på korrekt konfiguration. Kontrollera noggrant konfigurationen för att leta efter fel i appar och IP-adresser. - Om konfigurationen verkar vara korrekt: - Analysera applikationsloggar. 
- Granska nätverkstrafiken mellan klientappen och IP- eller serverappen med webbläsarens utvecklarverktyg. Ofta returneras ett exakt felmeddelande eller ett meddelande med en ledtråd till vad som orsakar problemet till klienten av IP- eller serverappen efter en begäran. Vägledning för utvecklarverktyg finns i följande artiklar: - Google Chrome (Google-dokumentation)
- Microsoft Edge
- Mozilla Firefox (Mozilla-dokumentation)
 
 - Dokumentationsteamet svarar på dokumentationsfeedback och buggar i artiklar. Starta ett ärende från Den här sidan feedbacksektionen, men de kan inte tillhandahålla produktsupport. Det finns flera offentliga supportforum som hjälper dig att felsöka en app. Vi rekommenderar följande: - Föregående forum ägs eller kontrolleras inte av Microsoft. - För rapporter om icke-säkerhetsrelaterade, icke-känsliga och icke-konfidentiella reproducerbara ramverksfel, skapa ett ärende med ASP.NET Core-produktenheten. Öppna inte ett ärende med produktgruppen förrän du noggrant har undersökt orsaken till ett problem och inte kan lösa det själv och med hjälp av communityt på ett offentligt support-forum. Produktenheten kan inte felsöka enskilda appar som har brutits på grund av enkel felkonfiguration eller användningsfall som rör tjänster från tredje part. Om en rapport är känslig eller konfidentiell eller beskriver en potentiell säkerhetsbrist i produkten som cyberattacker kan utnyttja kan du läsa Rapportering av säkerhetsproblem och buggar ( - dotnet/aspnetcoreGitHub-lagringsplats).
- Obehörig klient för ME-ID - info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] Auktoriseringen misslyckades. Dessa krav uppfylldes inte: DenyAnonymousAuthorizationRequirement: Kräver en autentiserad användare. - Återanropsfel vid inloggning från ME-ID: - Fel: unauthorized_client
- Beskrivning: AADB2C90058: The provided application is not configured to allow public clients.
 - Så här löser du felet: - Gå till -appens manifest i Azure-portalen.
- Ange attributet allowPublicClienttillnullellertrue.
 
- Fel: 
Cookies och webbplatsdata
Cookies och webbplatsdata kan sparas mellan appuppdateringar och störa testning och felsökning. Rensa följande när du gör ändringar i appkoden, ändringar av användarkonton med providern eller konfigurationsändringar för providerappen:
- Cookies för användarinloggning
- App-cookies
- Cachelagrade och lagrade webbplatsdata
En metod för att förhindra kvardröjande cookies och webbplatsdata från att störa testning och felsökning är att:
- Konfigurera en webbläsare - Använd en webbläsare för testning som du kan konfigurera för att ta bort alla cookie och platsdata varje gång webbläsaren stängs.
- Kontrollera att webbläsaren stängs manuellt eller av IDE för ändringar i appen, testanvändaren eller providerkonfigurationen.
 
- Använd ett anpassat kommando för att öppna en webbläsare i InPrivate- eller Incognito-läge i Visual Studio: - Öppna dialogrutan Bläddra med från Visual Studio-knappen Kör.
- Välj knappen Lägg till.
- Ange sökvägen till webbläsaren i fältet Program. Följande körbara filvägar är typiska installationsplatser för Windows 10. Om webbläsaren är installerad på en annan plats eller om du inte använder Windows 10 anger du sökvägen till webbläsarens körbara fil.
- 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: 
- I fältet Argument anger du det kommandoradsalternativ som webbläsaren använder för att öppna i InPrivate- eller Inkognitoläge. Vissa webbläsare kräver appens URL.
- Microsoft Edge: Använd -inprivate.
- Google Chrome: Använd --incognito --new-window {URL}, där platshållaren för{URL}är url:en som ska öppnas (till exempelhttps://localhost:5001).
- Mozilla Firefox: Använd -private -url {URL}, där platshållaren{URL}är url:en som ska öppnas (till exempelhttps://localhost:5001).
 
- Microsoft Edge: Använd 
- Ange ett namn i fältet Användarvänligt namn. Till exempel Firefox Auth Testing.
- Välj knappen OK.
- Om du vill undvika att behöva välja webbläsarprofilen för varje iteration av testning med en app anger du profilen som standard med knappen Ange som standard.
- Kontrollera att webbläsaren är stängd av IDE för alla ändringar i appen, testanvändaren eller providerkonfigurationen.
 
Appuppgraderingar
En fungerande app kan misslyckas omedelbart efter att ha uppgraderat .NET Core SDK på utvecklingsdatorn eller ändrat paketversioner i appen. I vissa fall kan osammanhängande paket orsaka att en app slutar fungera vid genomförande av större uppgraderingar. De flesta av dessa problem kan åtgärdas genom att följa dessa instruktioner:
- Rensa det lokala systemets NuGet-paketcacheminnen genom att köra dotnet nuget locals all --clearfrån ett kommandogränssnitt.
- Ta bort projektets mappar binochobj.
- Återställa och återskapa projektet.
- Ta bort alla filer i distributionsmappen på servern innan du distribuerar om appen.
Obs
Användning av paketversioner som inte är kompatibla med appens målramverk stöds inte. För information om ett paket, använd NuGet Gallery.
Starta lösningen från rätt projekt
Blazor Web Apps:
- För ett av BFF-mönsterexemplen (Backend-for-Frontend) startar du lösningen från Aspire/Aspire.AppHostprojektet.
- Starta lösningen från serverprojektet för ett av de icke-BFF-mönsterexemplen.
Blazor Server:
Starta lösningen från serverprojektet.
Inspektera användaren
Följande UserClaims komponent kan användas direkt i appar eller fungera som grund för ytterligare anpassning.
              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;
    }
}
Ytterligare resurser
- Anropa ett webb-API från en ASP.NET Core-app Blazor : Microsofts identitetsplattform för webb-API-anrop
- dokumentation om Microsofts identitetsplattform
- Dokumentation om webb-API | Microsofts identitetsplattform
- Ett webb-API som anropar webb-API:er: Anropa ett API: Alternativ 2: Anropa ett underordnat webb-API med hjälpklassen
- 
              
              AzureAD/microsoft-identity-webGitHub-lagringsplats: Användbar vägledning för att implementera Microsoft Identity Web for Microsoft Entra ID och Azure Active Directory B2C för ASP.NET Core-appar, inklusive länkar till exempelappar och relaterad Azure-dokumentation. För närvarande hanteras inte Blazor Web Apputtryckligen av Azure-dokumentationen, men konfigurationen av en Blazor Web App för ME-ID och värd i Azure är densamma som för vilken ASP.NET Core-webbapp som helst.
- 
              
              AuthenticationStateProvidertjänst
- Hantera autentiseringstillstånd i Blazor Web Apps
- Service-abstraktioner i Blazor Web Apps
ASP.NET Core