Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
In dit artikel wordt beschreven hoe u een Blazor Web App met Microsoft Identity Platform kunt beveiligen met Microsoft Identity Web-pakketten voor Microsoft Entra ID met behulp van een voorbeeld-app.
In deze versie van het artikel wordt beschreven hoe u Entra implementeert zonder het BFF-patroon (Backend for Frontend) te gebruiken. Het BFF-patroon is handig voor het indienen van geverifieerde aanvragen bij externe services. Wijzig de versiekiezer van het artikel in het BFF-patroon als de specificatie van de app vraagt om het BFF-patroon te gebruiken.
De volgende specificatie wordt behandeld:
- De Blazor Web App gebruikt de automatische render-modus met globale interactiviteit (
InteractiveAuto). - Het serverproject roept AddAuthenticationStateSerialization aan om een verificatiestatusprovider aan de serverzijde toe te voegen die gebruikmaakt van PersistentComponentState om de verificatiestatus naar de client te laten stromen. De client roept AddAuthenticationStateDeserialization aan om te deserialiseren en de verificatiestatus te gebruiken die door de server wordt doorgegeven. De verificatiestatus is vast voor de levensduur van de WebAssembly-toepassing.
- De app maakt gebruik van Microsoft Entra ID, op basis van Microsoft Identity Webpakketten.
- Automatische niet-interactieve tokenvernieuwing wordt beheerd door het framework.
- De app maakt gebruik van serviceabstracties aan de serverzijde en aan de clientzijde om gegenereerde weersgegevens weer te geven:
- Bij het weergeven van de
Weathercomponent op de server om weersgegevens te tonen, gebruikt de component deServerWeatherForecaster. Microsoft Identity Web-pakketten bieden API voor het maken van een benoemde downstream-webservice voor het maken van web-API-aanroepen. <xref:Microsoft.Identity.Abstractions.IDownstreamApi> wordt geïnjecteerd in deServerWeatherForecaster, die wordt gebruikt om weersgegevens van een externe web-API (<xref:Microsoft.Identity.Abstractions.IDownstreamApi.CallApiForUserAsync%2A> project) te verkrijgen met behulp vanMinimalApiJwt. - Wanneer het
Weather-onderdeel wordt weergegeven op de client, gebruikt het deClientWeatherForecaster-service, die een vooraf geconfigureerde HttpClient (in hetProgram-bestand van het clientproject) benut om een web-API-aanroep te doen naar de minimale API (/weather-forecast) van het serverproject voor weergegevens. Het minimale API-eindpunt haalt de weergegevens op uit deServerWeatherForecaster-klasse en retourneert het naar de client voor rendering door het onderdeel.
- Bij het weergeven van de
Voorbeeldoplossing
De voorbeeldoplossing bestaat uit de volgende projecten:
-
BlazorWebAppEntra: Project aan de serverzijde van het Blazor Web App, met een voorbeeld van een minimaal API-eindpunt voor weergegevens. -
BlazorWebAppEntra.Client: Project aan de clientzijde van de Blazor Web App. -
MinimalApiJwt: Back-endweb-API, met een voorbeeld van een minimaal API-eindpunt voor weergegevens.
Open het voorbeeld via de meest recente versiemap in de opslagplaats met voorbeelden van Blazor met de volgende koppeling. Het voorbeeld bevindt zich in de map BlazorWebAppEntra voor .NET 9 of hoger.
Start de oplossing vanuit het Aspire/Aspire.AppHost project.
Voorbeeldcode weergeven of downloaden (downloaden)
App-registraties voor Microsoft Entra ID
We raden u aan afzonderlijke registraties te gebruiken voor apps en web-API's, zelfs wanneer de apps en web-API's zich in dezelfde oplossing bevinden. De volgende richtlijnen zijn bedoeld voor de BlazorWebAppEntra app en MinimalApiJwt web-API van de voorbeeldoplossing, maar dezelfde richtlijnen zijn doorgaans van toepassing op alle op Entra gebaseerde registraties voor apps en web-API's.
Registreer eerst de web-API (MinimalApiJwt) zodat u vervolgens toegang tot de web-API kunt verlenen bij het registreren van de app. De tenant-id en client-id van de web-API worden gebruikt om de web-API in het Program bestand te configureren. Nadat u de web-API hebt geregistreerd, maakt u de web-API beschikbaar in app-registraties>. Maak een API beschikbaar met een bereiknaam van Weather.Get. Noteer de app-id-URI voor gebruik in de configuratie van de app.
Registreer vervolgens de app (BlazorWebAppEntra) met een webplatformconfiguratie en een omleidings-URI van https://localhost/signin-oidc (een poort is niet vereist). De tenant-id, het tenantdomein en de client-id van de app, samen met het basisadres van de web-API, de app-id-URI en de naam van het weerbereik, worden gebruikt om de app in het appsettings.json bestand te configureren. Geef API-machtigingen om toegang te krijgen tot de web-API in App-registraties>API-machtigingen. Als de beveiligingsspecificatie van de app hiervoor aanroept, kunt u beheerderstoestemming verlenen voor de organisatie om toegang te krijgen tot de web-API. Geautoriseerde gebruikers en groepen worden aan de registraties van de app toegewezen in app-registraties en >.
Selecteer in de app-registratieconfiguratie voor impliciete toekenning en hybride stromen in de Entra- of Azure-portal geen van beide selectievakjes voor het autorisatie-eindpunt om toegangstokens of id-tokens te retourneren. De OpenID Connect-handler vraagt automatisch de juiste tokens aan met behulp van de code die wordt geretourneerd vanuit het autorisatie-eindpunt.
Maak een clientgeheim in de registratie van de app in de Entra- of Azure-portal (Certificaten en geheimen>nieuw>clientgeheim beheren). Houd de Waarde van de clientsleutel vast voor gebruik in het volgende gedeelte.
Aanvullende Richtlijnen voor entra-configuratie voor specifieke instellingen vindt u verderop in dit artikel.
Blazor Web App project aan de serverzijde (BlazorWebAppEntra)
Het BlazorWebAppEntra project is het project aan de serverzijde van de Blazor Web App.
Blazor Web App project aan de klantzijde (BlazorWebAppEntra.Client)
Het BlazorWebAppEntra.Client-project is het client-side project van Blazor Web App.
Als de gebruiker zich moet aanmelden of afmelden tijdens rendering aan de clientzijde, wordt een volledige pagina opnieuw geladen.
Back-end-web-API-project (MinimalApiJwt)
Het MinimalApiJwt project is een back-endweb-API voor meerdere front-endprojecten. Het project configureert een minimaal API-eindpunt voor weergegevens.
Het MinimalApiJwt.http-bestand kan worden gebruikt voor het testen van de aanvraag voor weergegevens. Houd er rekening mee dat het MinimalApiJwt project moet worden uitgevoerd om het eindpunt te testen en dat het eindpunt in het bestand is vastgelegd. Zie HTTP-bestanden gebruiken in Visual Studio 2022 voor meer informatie.
Het project bevat pakketten en configuratie voor het produceren van OpenAPI-documenten en de Swagger-gebruikersinterface in de ontwikkelomgeving. Zie De gegenereerde OpenAPI-documenten gebruiken voor meer informatie.
Een beveiligd eindpunt voor weersvoorspellingsgegevens bevindt zich in het bestand van Program het project:
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();
Voor de RequireAuthorization-extensiemethode is autorisatie vereist voor de routedefinitie. Voor alle controllers die u aan het project toevoegt, voegt u het [Authorize] kenmerk toe aan de controller of actie.
Het web-API-project voor de back-end configureren (MinimalApiJwt)
Configureer het project in de JwtBearerOptions aanroep van het AddJwtBearer project in het MinimalApiJwt bestand.
Voor de registratie van de web-API-app wordt het Weather.Get bereik geconfigureerd in Entra of Azure Portal in Een API beschikbaar maken.
Authority stelt de Autoriteit in voor het maken van OIDC-aanroepen.
jwtOptions.Authority = "{AUTHORITY}";
In de volgende voorbeelden wordt een tenant-id van aaaabbbb-0000-cccc-1111-dddd2222eeeegebruikt.
Als de app is geregistreerd in een ME-ID-tenant, moet de instantie overeenkomen met de issuer (iss) van de JWT die wordt geretourneerd door de identiteitsprovider.
jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/";
Als de app is geregistreerd in een AAD B2C-tenant:
jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/";
Audience stelt de doelgroep in voor elk ontvangen JWT-toegangstoken.
jwtOptions.Audience = "{AUDIENCE}";
Koppel de waarde aan alleen het pad van de URI van de toepassings-id die is geconfigureerd bij het toevoegen van het Weather.Get bereik onder Een API beschikbaar maken in de Entra- of Azure-portal. Neem de naam van het bereik niet op, 'Weather.Get', in de waarde.
In de volgende voorbeelden wordt een Client-id van 11112222-bbbb-3333-cccc-4444dddd5555 gebruikt. In het tweede voorbeeld wordt een tenantdomein van contoso.onmicrosoft.com gebruikt.
voorbeeld van ME-ID tenant:
jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";
Voorbeeld van een AAD B2C-tenant:
jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";
Het serverproject configureren (BlazorWebAppEntra)
<xref:Microsoft.Identity.Web.AppBuilderExtension.AddMicrosoftIdentityWebApp%2A> van Microsoft Identity Web (Microsoft.Identity.Web NuGet-pakket, API-documentatie) is geconfigureerd in het BlazorWebAppEntra projectbestand Program .
Haal de toepassings-id (client), tenantdomein (uitgever) en map-id (tenant) op uit de registratie van de app in de Entra-portal of Azure-portal. De app-id-URI wordt verkregen voor het Weather.Get bereik van de registratie van de web-API. Neem de scope-naam niet op wanneer u de app-id-URI uit de portal haalt.
Geef in het BlazorWebAppEntra bestand van het Program project de waarden op voor de volgende tijdelijke aanduidingen in de Microsoft Identity-webconfiguratie:
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();
Plaatsaanduidingen in de vorige configuratie.
-
{CLIENT ID (BLAZOR APP)}: de toepassings-id (client). -
{DIRECTORY NAME}: de mapnaam van het tenantdomein (uitgever). -
{TENANT ID}: De directory (tenant) ID. -
{BASE ADDRESS}: het basisadres van de web-API. -
{APP ID URI}: De app-id-URI voor web-API-scopes. Een van de volgende indelingen wordt gebruikt, waarbij de{CLIENT ID (WEB API)}tijdelijke aanduiding de client-id is van de Entra-registratie van de web-API en de{DIRECTORY NAME}tijdelijke aanduiding de mapnaam is van het tenantdomein (uitgevers) (bijvoorbeeld:contoso).- ME-ID tenantindeling:
api://{CLIENT ID (WEB API)} - B2C huurdersindeling:
https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}
- ME-ID tenantindeling:
Voorbeeld:
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();
Deze versie van het artikel bevat informatie over het implementeren van Entra met het BFF-patroon (Backend for Frontend). Wijzig de versiekiezer van het artikel in het niet-BFF-patroon als de specificatie van de app niet aanroept om het BFF-patroon te gebruiken.
De volgende specificatie wordt behandeld:
- De Blazor Web App gebruikt de automatische render-modus met globale interactiviteit (
InteractiveAuto). - Het serverproject roept AddAuthenticationStateSerialization aan om een verificatiestatusprovider aan de serverzijde toe te voegen die gebruikmaakt van PersistentComponentState om de verificatiestatus naar de client te laten stromen. De client roept AddAuthenticationStateDeserialization aan om te deserialiseren en de verificatiestatus te gebruiken die door de server wordt doorgegeven. De verificatiestatus is vast voor de levensduur van de WebAssembly-toepassing.
- De app maakt gebruik van Microsoft Entra ID, op basis van Microsoft Identity Webpakketten.
- Automatische niet-interactieve tokenvernieuwing wordt beheerd door het framework.
- Het BFF-patroon (Backend for Frontend) wordt gebruikt .NET Aspire voor servicedetectie en YARP voor het proxyen van aanvragen naar een weersvoorspellingseindpunt in de back-end-app.
- Een back-end web-API maakt gebruik van JWT-bearer-verificatie om JWT-tokens te valideren die zijn opgeslagen door de Blazor Web App bij de aanmelding cookie.
- Aspire verbetert de ervaring bij het bouwen van cloud-native .NET-apps. Het biedt een consistente, uitgesproken set tools en patronen voor het bouwen en uitvoeren van gedistribueerde apps.
- YARP (Yet Another Reverse Proxy) is een bibliotheek die wordt gebruikt om een omgekeerde proxyserver te maken.
- De app maakt gebruik van serviceabstracties aan de serverzijde en aan de clientzijde om gegenereerde weersgegevens weer te geven.
- Bij het weergeven van de
Weathercomponent op de server om weersgegevens te tonen, gebruikt de component deServerWeatherForecaster. Microsoft Identity Web-pakketten bieden API voor het maken van een benoemde downstream-webservice voor het maken van web-API-aanroepen. <xref:Microsoft.Identity.Abstractions.IDownstreamApi> wordt geïnjecteerd in deServerWeatherForecaster, die wordt gebruikt om weersgegevens van een externe web-API (<xref:Microsoft.Identity.Abstractions.IDownstreamApi.CallApiForUserAsync%2A> project) te verkrijgen met behulp vanMinimalApiJwt. - Wanneer het
Weather-onderdeel wordt weergegeven op de client, gebruikt het deClientWeatherForecaster-service, die een vooraf geconfigureerde HttpClient (in hetProgram-bestand van het clientproject) benut om een web-API-aanroep te doen naar de minimale API (/weather-forecast) van het serverproject voor weergegevens. Het minimale API-eindpunt verkrijgt een toegangstoken voor de gebruiker door aan te roepen <xref:Microsoft.Identity.Web.ITokenAcquisition.GetAccessTokenForUserAsync%2A>. Naast de juiste autorisatietoewijzingen wordt er een reverse proxy-aanroep gedaan naar de externe web-API (MinimalApiJwtproject) om weergegevens te verkrijgen en terug te geven aan de client voor rendering door de component.
- Bij het weergeven van de
Voor meer informatie over .NET Aspire kunt u Algemene beschikbaarheid van .NET Aspire: Vereenvoudiging van .NET Cloud-Native Ontwikkeling (mei 2024) raadplegen.
Vereiste voorwaarden
.NET Aspire Visual Studio versie 17.10 of hoger is vereist.
Zie ook de sectie Vereisten van quickstart: Uw eerste .NET Aspire app bouwen.
Voorbeeldoplossing
De voorbeeldoplossing bestaat uit de volgende projecten:
-
.NET Aspire:
-
Aspire.AppHost: wordt gebruikt voor het beheren van de orkestratieaspecten op hoog niveau van de app. -
Aspire.ServiceDefaults: bevat standaard-.NET Aspire app-configuraties die naar behoefte kunnen worden uitgebreid en aangepast.
-
-
MinimalApiJwt: Back-endweb-API, met een voorbeeld van een minimaal API-eindpunt voor weergegevens. -
BlazorWebAppEntra: serverside project van het Blazor Web App. -
BlazorWebAppEntra.Client: Project aan de clientzijde van de Blazor Web App.
Open het voorbeeld via de meest recente versiemap in de opslagplaats met voorbeelden van Blazor met de volgende koppeling. Het voorbeeld bevindt zich in de map BlazorWebAppEntraBff voor .NET 9 of hoger.
Voorbeeldcode weergeven of downloaden (downloaden)
App-registraties voor Microsoft Entra ID
We raden u aan afzonderlijke registraties te gebruiken voor apps en web-API's, zelfs wanneer de apps en web-API's zich in dezelfde oplossing bevinden. De volgende richtlijnen zijn bedoeld voor de BlazorWebAppEntra app en MinimalApiJwt web-API van de voorbeeldoplossing, maar dezelfde richtlijnen zijn doorgaans van toepassing op alle op Entra gebaseerde registraties voor apps en web-API's.
Registreer eerst de web-API (MinimalApiJwt) zodat u vervolgens toegang tot de web-API kunt verlenen bij het registreren van de app. De tenant-id en client-id van de web-API worden gebruikt om de web-API in het Program bestand te configureren. Nadat u de web-API hebt geregistreerd, maakt u de web-API beschikbaar in app-registraties>. Maak een API beschikbaar met een bereiknaam van Weather.Get. Noteer de app-id-URI voor gebruik in de configuratie van de app.
Registreer vervolgens de app (BlazorWebAppEntra) met een webplatformconfiguratie en een omleidings-URI van https://localhost/signin-oidc (een poort is niet vereist). De tenant-id, het tenantdomein en de client-id van de app, samen met het basisadres van de web-API, de app-id-URI en de naam van het weerbereik, worden gebruikt om de app in het appsettings.json bestand te configureren. Geef API-machtigingen om toegang te krijgen tot de web-API in App-registraties>API-machtigingen. Als de beveiligingsspecificatie van de app hiervoor aanroept, kunt u beheerderstoestemming verlenen voor de organisatie om toegang te krijgen tot de web-API. Geautoriseerde gebruikers en groepen worden aan de registraties van de app toegewezen in app-registraties en >.
Selecteer in de app-registratieconfiguratie voor impliciete toekenning en hybride stromen in de Entra- of Azure-portal geen van beide selectievakjes voor het autorisatie-eindpunt om toegangstokens of id-tokens te retourneren. De OpenID Connect-handler vraagt automatisch de juiste tokens aan met behulp van de code die wordt geretourneerd vanuit het autorisatie-eindpunt.
Maak een clientgeheim in de registratie van de app in de Entra- of Azure-portal (Certificaten en geheimen>nieuw>clientgeheim beheren). Houd de Waarde van de clientsleutel vast voor gebruik in het volgende gedeelte.
Aanvullende Richtlijnen voor entra-configuratie voor specifieke instellingen vindt u verderop in dit artikel.
.NET Aspire projecten
Zie de .NET Aspirevoor meer informatie over het gebruik van .AppHost en details over de .ServiceDefaults en .NET Aspire projecten van de voorbeeld-app.
Controleer of u aan de vereisten voor .NET Aspirehebt voldaan. Zie de sectie Vereisten van quickstart voor meer informatie: Uw eerste .NET Aspire app bouwen.
De voorbeeld-app configureert alleen een onveilig HTTP-startprofiel (http) voor gebruik tijdens het testen van de ontwikkeling. Zie Onbeveiligd transport toestaan in .NET Aspire (.NET Aspire documentatie) voor meer informatie, waaronder een voorbeeld van onveilige en beveiligde startinstellingenprofielen.
Blazor Web App project aan de serverzijde (BlazorWebAppEntra)
Het BlazorWebAppEntra project is het project aan de serverzijde van de Blazor Web App.
Blazor Web App project aan de klantzijde (BlazorWebAppEntra.Client)
Het BlazorWebAppEntra.Client-project is het client-side project van Blazor Web App.
Als de gebruiker zich moet aanmelden of afmelden tijdens rendering aan de clientzijde, wordt een volledige pagina opnieuw geladen.
Back-end-web-API-project (MinimalApiJwt)
Het MinimalApiJwt project is een back-endweb-API voor meerdere front-endprojecten. Het project configureert een minimaal API-eindpunt voor weergegevens. Aanvragen van het Blazor Web App project aan de serverzijde (BlazorWebAppEntra) worden naar het MinimalApiJwt project geproxied.
Het MinimalApiJwt.http-bestand kan worden gebruikt voor het testen van de aanvraag voor weergegevens. Houd er rekening mee dat het MinimalApiJwt project moet worden uitgevoerd om het eindpunt te testen en dat het eindpunt in het bestand is vastgelegd. Zie HTTP-bestanden gebruiken in Visual Studio 2022 voor meer informatie.
Het project bevat pakketten en configuratie voor het produceren van OpenAPI-documenten en de Swagger-gebruikersinterface in de ontwikkelomgeving. Zie De gegenereerde OpenAPI-documenten gebruiken voor meer informatie.
Een beveiligd eindpunt voor weersvoorspellingsgegevens bevindt zich in het bestand van Program het project:
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();
Voor de RequireAuthorization-extensiemethode is autorisatie vereist voor de routedefinitie. Voor alle controllers die u aan het project toevoegt, voegt u het [Authorize] kenmerk toe aan de controller of actie.
Het web-API-project voor de back-end configureren (MinimalApiJwt)
Configureer het MinimalApiJwt project in de JwtBearerOptions van de AddJwtBearer-aanroep in het Program-bestand van het project.
Voor de registratie van de web-API-app wordt het Weather.Get bereik geconfigureerd in Entra of Azure Portal in Een API beschikbaar maken.
Authority stelt de Autoriteit in voor het maken van OIDC-aanroepen.
jwtOptions.Authority = "{AUTHORITY}";
In de volgende voorbeelden wordt een tenant-id van aaaabbbb-0000-cccc-1111-dddd2222eeeegebruikt.
Als de app is geregistreerd in een ME-ID-tenant, moet de instantie overeenkomen met de issuer (iss) van de JWT die wordt geretourneerd door de identiteitsprovider.
jwtOptions.Authority = "https://sts.windows.net/aaaabbbb-0000-cccc-1111-dddd2222eeee/";
Als de app is geregistreerd in een AAD B2C-tenant:
jwtOptions.Authority = "https://login.microsoftonline.com/aaaabbbb-0000-cccc-1111-dddd2222eeee/v2.0/";
Audience stelt de doelgroep in voor elk ontvangen JWT-toegangstoken.
jwtOptions.Audience = "{AUDIENCE}";
Koppel de waarde aan alleen het pad van de URI van de toepassings-id die is geconfigureerd bij het toevoegen van het Weather.Get bereik onder Een API beschikbaar maken in de Entra- of Azure-portal. Neem de naam van het bereik niet op, 'Weather.Get', in de waarde.
In de volgende voorbeelden wordt een Client-id van 11112222-bbbb-3333-cccc-4444dddd5555 gebruikt. In het tweede voorbeeld wordt een tenantdomein van contoso.onmicrosoft.com gebruikt.
voorbeeld van ME-ID tenant:
jwtOptions.Audience = "api://11112222-bbbb-3333-cccc-4444dddd5555";
Voorbeeld van een AAD B2C-tenant:
jwtOptions.Audience = "https://contoso.onmicrosoft.com/11112222-bbbb-3333-cccc-4444dddd5555";
Het serverproject configureren (BlazorWebAppEntra)
<xref:Microsoft.Identity.Web.AppBuilderExtension.AddMicrosoftIdentityWebApp%2A> van Microsoft Identity Web (Microsoft.Identity.Web NuGet-pakket, API-documentatie) is geconfigureerd in het BlazorWebAppEntra projectbestand Program .
Haal de toepassings-id (client), tenantdomein (uitgever) en map-id (tenant) op uit de registratie van de app in de Entra-portal of Azure-portal. De app-id-URI wordt verkregen voor het Weather.Get bereik van de registratie van de web-API. Neem de scope-naam niet op wanneer u de app-id-URI uit de portal haalt.
Geef in het BlazorWebAppEntra bestand van het Program project de waarden op voor de volgende tijdelijke aanduidingen in de Microsoft Identity-webconfiguratie:
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();
Plaatsaanduidingen in de vorige configuratie.
-
{CLIENT ID (BLAZOR APP)}: de toepassings-id (client). -
{DIRECTORY NAME}: de mapnaam van het tenantdomein (uitgever). -
{TENANT ID}: De directory (tenant) ID. -
{BASE ADDRESS}: het basisadres van de web-API. -
{APP ID URI}: De app-id-URI voor web-API-scopes. Een van de volgende indelingen wordt gebruikt, waarbij de{CLIENT ID (WEB API)}tijdelijke aanduiding de client-id is van de Entra-registratie van de web-API en de{DIRECTORY NAME}tijdelijke aanduiding de mapnaam is van het tenantdomein (uitgevers) (bijvoorbeeld:contoso).- ME-ID tenantindeling:
api://{CLIENT ID (WEB API)} - B2C huurdersindeling:
https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}
- ME-ID tenantindeling:
Voorbeeld:
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();
Waarschuwing
Productie-apps moeten gebruikmaken van een gedistribueerde tokencacheprovider voor productie. Anders kan de app in sommige scenario's slechte prestaties hebben. Zie de sectie Een gedistribueerde tokencacheprovider voor productie gebruiken voor meer informatie.
Het callback-pad (CallbackPath) moet overeenkomen met de omleidings-URI (callbackpad voor aanmelding) die is geconfigureerd bij het registreren van de toepassing in de Entra- of Azure-portal. Paden worden geconfigureerd in het Verificatie onderdeel van de registratie van de app. De standaardwaarde van CallbackPath is /signin-oidc voor een geregistreerde omleidings-URI van https://localhost/signin-oidc (een poort is niet vereist).
Dit SignedOutCallbackPath is het verzoekpad binnen het basispad van de app dat wordt onderschept door de OpenID Connect-handler, waar de gebruikersagent voor het eerst terugkeert na het afmelden bij Entra. De voorbeeld-app stelt geen waarde in voor het pad omdat de standaardwaarde van '/signout-callback-oidc' wordt gebruikt. Nadat de aanvraag is onderschept, verwijst de OpenID Connect-handler naar SignedOutRedirectUri of RedirectUri, indien specifiek.
Configureer het pad voor uitgelogde callback in de Entra-registratie van de app. Stel in de Entra- of Azure-portal het pad in de omleidings-URI-vermeldingen van de webplatformconfiguratie in:
https://localhost/signout-callback-oidc
Notitie
Een poort is niet vereist voor localhost adressen bij het gebruik van Entra.
Als u de afmeldingspad-URI niet toevoegt aan de registratie van de app in Entra, weigert Entra de gebruiker terug te leiden naar de app en vraagt hij of zij alleen hun browservenster te sluiten.
Notitie
Entra leidt een primaire beheerder (hoofdaccount) of externe gebruiker niet terug naar de Blazor-toepassing. In plaats daarvan registreert Entra de gebruiker uit de app en raadt ze aan om al hun browservensters te sluiten. Zie postLogoutRedirectUri werkt niet wanneer de url van de instantie een tenant-id (AzureAD/microsoft-authentication-library-for-js #5783) bevat voor meer informatie.
Waarschuwing
Sla geen app-geheimen, verbindingsreeksen, referenties, wachtwoorden, persoonlijke identificatienummers (PINCODE's), persoonlijke C#/.NET-code of persoonlijke sleutels/tokens op in code aan de clientzijde, wat altijd onveilig is. In testomgevingen en stagingomgevingen en productieomgevingen moeten aan de serverkant Blazor-code en web-API's beveiligde verificatiestromen gebruiken die voorkomen dat inloggegevens in projectcode of configuratiebestanden worden opgeslagen. Buiten het testen van lokale ontwikkeling raden we u aan het gebruik van omgevingsvariabelen voor het opslaan van gevoelige gegevens te vermijden, omdat omgevingsvariabelen niet de veiligste benadering zijn. Voor het testen van lokale ontwikkeling wordt het hulpprogramma Secret Manager aanbevolen voor het beveiligen van gevoelige gegevens. Zie Veilig gevoelige gegevens en referenties onderhouden voor meer informatie.
Het clientgeheim instellen
Deze sectie is alleen van toepassing op het serverproject van de Blazor Web App.
Gebruik een of beide van de volgende methoden om het clientgeheim aan de app te leveren:
- Secret Manager-hulpprogramma: het hulpprogramma Secret Manager slaat persoonlijke gegevens op de lokale computer op en wordt alleen gebruikt tijdens lokale ontwikkeling.
- Azure Key Vault: u kunt het clientgeheim opslaan in een sleutelkluis voor gebruik in elke omgeving, inclusief voor de ontwikkelomgeving wanneer u lokaal werkt. Sommige ontwikkelaars gebruiken liever sleutelkluizen voor faserings- en productie-implementaties en gebruiken het hulpprogramma Secret Manager voor lokale ontwikkeling.
U wordt ten zeerste aangeraden geen clientgeheimen op te slaan in projectcode- of configuratiebestanden. Gebruik beveiligde verificatiestromen, zoals een of beide benaderingen in deze sectie.
Hulpprogramma Secret Manager
Het hulpprogramma Secret Manager kan het clientgeheim van de server-app opslaan onder de configuratiesleutel AzureAd:ClientSecret.
De Blazor server-app is niet geïnitialiseerd voor het hulpprogramma Secret Manager. Gebruik een opdrachtshell, zoals de PowerShell-opdrachtshell voor ontwikkelaars in Visual Studio, om de volgende opdracht uit te voeren. Voordat u de opdracht uitvoert, wijzigt u de map met de opdracht cd in de map van het serverproject. Met de opdracht wordt een gebruikersgeheim-id (<UserSecretsId>) in het projectbestand van de server-app vastgelegd, dat intern wordt gebruikt door de tooling om geheimen voor de app bij te houden:
dotnet user-secrets init
Voer de volgende opdracht uit om het clientgeheim in te stellen. De tijdelijke aanduiding {SECRET} is het clientgeheim dat is verkregen uit de Entra-registratie van de app:
dotnet user-secrets set "AzureAd:ClientSecret" "{SECRET}"
Als u Visual Studio gebruikt, kunt u bevestigen dat het geheim is ingesteld door met de rechtermuisknop op het serverproject in Solution Explorer te klikken en gebruikersgeheimen beheren te selecteren.
Azure Key Vault
Azure Key Vault biedt een veilige benadering voor het leveren van het clientgeheim van de app aan de app.
Als u een sleutelkluis wilt maken en een clientgeheim wilt instellen, raadpleegt u Over Azure Key Vault-geheimen (Azure-documentatie) die resources kruislings koppelt om aan de slag te gaan met Azure Key Vault. Als u de code in deze sectie wilt implementeren, registreert u de sleutelkluis-URI en de geheime naam van Azure wanneer u de sleutelkluis en het geheim maakt. Voor het voorbeeld in deze sectie is de geheime naam '.BlazorWebAppEntraClientSecret'
Bij het aanmaken van de sleutelkluis in de Entra- of Azure-portal:
Configureer de sleutelkluis voor het gebruik van op rollen gebaseerd toegangsbeheer van Azure (RABC). Als u niet werkt in een virtueel Azure-netwerk, inclusief voor lokale ontwikkeling en testen, controleert u of openbare toegang in de netwerkstap is ingeschakeld (ingeschakeld). Als u openbare toegang inschakelt, wordt alleen het eindpunt van de sleutelkluis weergegeven. Geverifieerde accounts zijn nog steeds vereist voor toegang.
Maak een door Azure beheerde Identity (of voeg een rol toe aan de bestaande beheerde Identity die u wilt gebruiken) met de rol Key Vault Secrets User. Wijs het beheerde Identity toe aan de Azure App Service die als host fungeert voor de implementatie: Instellingen>Identity>Toegewezen door gebruiker>Toevoegen.
Notitie
Als u ook van plan bent om een app lokaal uit te voeren met een geautoriseerde gebruiker voor toegang tot key vault met behulp van de Azure CLI of Azure Service Authentication van Visual Studio, voegt u uw Azure-gebruikersaccount voor ontwikkelaars toe in Access Control (IAM) met de rol Key Vault Secrets User . Als u de Azure CLI wilt gebruiken via Visual Studio, voert u de
az loginopdracht uit vanuit het deelvenster Ontwikkelaars powershell en volgt u de aanwijzingen om u te verifiëren bij de tenant.
Als u de code in deze sectie wilt implementeren, registreert u de sleutelkluis-URI (bijvoorbeeld: 'https://contoso.vault.azure.net/', afsluitende slash vereist) en de geheime naam (bijvoorbeeld: 'BlazorWebAppEntraClientSecret)) van Azure wanneer u de sleutelkluis en het geheim maakt.
Belangrijk
Er wordt een geheim van de sleutelkluis gemaakt met een vervaldatum. Zorg ervoor dat u bijhoudt wanneer een sleutelkluisgeheim verloopt en maak een nieuw geheim voor de app voordat die datum is verstreken.
Voeg de volgende AzureHelper klasse toe aan het serverproject. De methode GetKeyVaultSecret haalt een geheim op uit een sleutelkluis. Pas de naamruimte (BlazorSample.Helpers) aan zodat deze overeenkomt met het projectnaamruimteschema.
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;
}
}
Notitie
In het voorgaande voorbeeld wordt gebruikgemaakt DefaultAzureCredential van het vereenvoudigen van verificatie bij het ontwikkelen van apps die in Azure worden geïmplementeerd door referenties te combineren die worden gebruikt in Azure-hostingomgevingen met referenties die worden gebruikt in lokale ontwikkeling. Wanneer u overstapt op productie, is een alternatief een betere keuze, zoals ManagedIdentityCredential. Zie Azure-gehoste .NET-apps verifiëren bij Azure-resources met behulp van een door het systeem toegewezen beheerde identiteit voor meer informatie.
Wanneer services zijn geregistreerd in het Program-bestand van het serverproject, moet u het clientgeheim ophalen en toepassen met behulp van de volgende code:
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);
}
Waar <xref:Microsoft.Identity.Web.MicrosoftIdentityOptions> worden ingesteld, roept u GetKeyVaultSecret aan om het clientgeheim van de app te ontvangen en toe te wijzen:
msIdentityOptions.ClientSecret = AzureHelper.GetKeyVaultSecret("{VAULT URI}",
credential, "{SECRET NAME}");
{MANAGED IDENTITY CLIENT ID}: de door Azure beheerde Identity client-id (GUID).
{TENANT ID}: De directory (tenant) ID. Voorbeeld: aaaabbbb-0000-cccc-1111-dddd2222eeee
{VAULT URI}: Sleutelkluis-URI. Neem de afsluitende slash in de URI op. Voorbeeld: https://contoso.vault.azure.net/
{SECRET NAME}: Geheime naam. Voorbeeld: BlazorWebAppEntraClientSecret
Configuratie wordt gebruikt om het leveren van toegewezen sleutelkluizen en geheime namen te vergemakkelijken op basis van de omgevingsconfiguratiebestanden van de app. U kunt bijvoorbeeld verschillende configuratiewaarden opgeven voor appsettings.Development.json in ontwikkeling, appsettings.Staging.json bij fasering en appsettings.Production.json voor de productie-implementatie. Zie ASP.NET Core-configuratie Blazorvoor meer informatie.
Alleen de naam- en rolclaims serialiseren
In het Program bestand worden alle claims geserialiseerd door in te stellen SerializeAllClaims op true. Als u alleen de naam- en rolclaims voor CSR wilt serialiseren, verwijdert u de optie of stelt u deze in op false.
Configuratie opgeven bij de JSON-configuratieprovider (app-instellingen)
De voorbeeldoplossingsprojecten configureren Microsoft Identity Web- en JWT Bearer-verificatie in hun Program bestanden om configuratie-instellingen detecteerbaar te maken met behulp van C#-automatisch aanvullen. Professionele apps gebruiken meestal een configuratieprovider om OIDC-opties te configureren, zoals de standaard-JSON-configuratieprovider. De JSON-configuratieprovider laadt de configuratie van app-instellingenbestandenappsettings.json/appsettings.{ENVIRONMENT}.json, waarbij de tijdelijke aanduiding de {ENVIRONMENT} runtime-omgeving van de app is. Volg de richtlijnen in deze sectie voor het gebruik van app-instellingenbestanden voor configuratie.
Voeg in het app-instellingenbestand (appsettings.json) van het BlazorWebAppEntra project de volgende JSON-configuratie toe:
{
"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" ]
}
}
Werk de tijdelijke aanduidingen in de voorgaande configuratie bij zodat deze overeenkomen met de waarden die de app in het Program bestand gebruikt:
-
{CLIENT ID (BLAZOR APP)}: de toepassings-id (client). -
{DIRECTORY NAME}: de mapnaam van het tenantdomein (uitgever). -
{TENANT ID}: De directory (tenant) ID. -
{BASE ADDRESS}: het basisadres van de web-API. -
{APP ID URI}: De app-id-URI voor web-API-scopes. Een van de volgende indelingen wordt gebruikt, waarbij de{CLIENT ID (WEB API)}tijdelijke aanduiding de client-id is van de Entra-registratie van de web-API en de{DIRECTORY NAME}tijdelijke aanduiding de mapnaam is van het tenantdomein (uitgevers) (bijvoorbeeld:contoso).- ME-ID tenantindeling:
api://{CLIENT ID (WEB API)} - B2C huurdersindeling:
https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID (WEB API)}
- ME-ID tenantindeling:
Voorbeeld:
"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" ]
}
Werk eventuele andere waarden in de voorgaande configuratie bij zodat deze overeenkomen met aangepaste/niet-standaardwaarden die in het Program bestand worden gebruikt.
De configuratie wordt automatisch opgehaald door de authenticatiebouwer.
Breng de volgende wijzigingen aan in het Program bestand:
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();
Notitie
Productie-apps moeten gebruikmaken van een gedistribueerde tokencacheprovider voor productie. Anders kan de app in sommige scenario's slechte prestaties hebben. Zie de sectie Een gedistribueerde tokencacheprovider voor productie gebruiken voor meer informatie.
Voeg in het MinimalApiJwt project de volgende configuratie van app-instellingen toe aan het appsettings.json bestand:
"Authentication": {
"Schemes": {
"Bearer": {
"Authority": "https://sts.windows.net/{TENANT ID (WEB API)}/",
"ValidAudiences": [ "{APP ID URI (WEB API)}" ]
}
}
},
Werk de tijdelijke aanduidingen in de voorgaande configuratie bij zodat deze overeenkomen met de waarden die de app in het Program bestand gebruikt:
-
{TENANT ID (WEB API)}: De tenant-id van de web-API. -
{APP ID URI (WEB API)}: de app-id-URI van de web-API.
De autoriteiten passen de volgende patronen toe in hun formats.
- ME-ID huurdertype:
https://sts.windows.net/{TENANT ID}/ - B2C-tenanttype:
https://login.microsoftonline.com/{TENANT ID}/v2.0/
Doelgroepen gebruiken de volgende patronen ({CLIENT ID} is de client-id van de web-API; {DIRECTORY NAME} is de mapnaam, bijvoorbeeld contoso):
- ME-ID huurdertype:
api://{CLIENT ID} - B2C-tenanttype:
https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
De configuratie wordt automatisch opgehaald door de JWT Bearer Authentication Builder.
Verwijder de volgende regels uit het Program bestand:
- jwtOptions.Authority = "...";
- jwtOptions.Audience = "...";
Zie de volgende bronnen voor meer informatie over de configuratie:
Een gedistribueerde tokencacheprovider voor productie gebruiken
Gedistribueerde tokencaches in het geheugen worden gemaakt bij het aanroepen <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.DistributedTokenCacheAdapterExtension.AddDistributedTokenCaches%2A> om ervoor te zorgen dat er een basis-implementatie beschikbaar is voor gedistribueerde tokencaching.
Productieweb-apps en web-API's moeten gebruikmaken van een gedistribueerde tokencache voor productie (bijvoorbeeld : Redis, Microsoft SQL Server, Microsoft Azure Cosmos DB).
Notitie
Voor lokale ontwikkeling en tests op één computer kunt u in-memory tokencaches gebruiken in plaats van gedistribueerde tokencaches:
builder.Services.AddInMemoryTokenCaches();
Later in de ontwikkelings- en testperiode gaat u over op een gedistribueerde tokencacheprovider voor productie.
AddDistributedMemoryCache voegt een standaard implementatie van IDistributedCache die cache-items in het geheugen opslaat, die wordt gebruikt door Microsoft Identity Web for token caching.
De gedistribueerde tokencache is geconfigureerd door <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions>:
- In ontwikkeling voor foutopsporingsdoeleinden kunt u de L1-cache uitschakelen door in te stellen <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.DisableL1Cache%2A> op
true. Zorg ervoor dat u deze weer insteltfalsevoor productie. - Stel de maximale grootte van uw L1-cache in om
L1CacheOptions.SizeLimitte voorkomen dat de cache het geheugen van de server overspoelt. De standaardwaarde is 500 MB. - Tijdens ontwikkeling voor foutopsporing kunt u tokenversleuteling in rust uitschakelen door <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.Encrypt%2A> in te stellen op
false, wat de standaardwaarde is. Zorg ervoor dat u deze weer instelttruevoor productie. - Instellen van verwijdering van tokens uit de cache met SlidingExpiration. De standaardwaarde is 1 uur.
- Zie en <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.OnL2CacheFailure%2A> voor meer informatie, waaronder richtlijnen voor callback voor L2-cachefouten (<xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.EnableAsyncL2Write%2A>) en asynchrone L2-cacheschrijfbewerkingen (<xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions>).
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 vereist een pakketreferentie naar het Microsoft.Extensions.Caching.Memory NuGet-pakket.
Notitie
Zie voor richtlijnen over het toevoegen van pakketten aan .NET-apps de artikelen onder Pakketten installeren en beheren in de Package consumption workflow (NuGet-documentatie). Bevestig de juiste pakketversies op NuGet.org.
Zie Gedistribueerde cache in ASP.NET Core voor het configureren van een gedistribueerde cacheprovider voor productie.
Waarschuwing
Vervang altijd de gedistribueerde tokencaches in het geheugen door een echte tokencacheprovider bij het implementeren van de app in een productieomgeving. Als u geen gedistribueerde tokencacheprovider voor productie gebruikt, kan de app aanzienlijk verslechterde prestaties ondervinden.
Zie Tokencacheserialisatie: Gedistribueerde caches voor meer informatie. De weergegeven codevoorbeelden zijn echter niet van toepassing op ASP.NET Core-apps, die gedistribueerde caches configureren via AddDistributedMemoryCache, niet <xref:Microsoft.Identity.Web.TokenCacheExtensions.AddDistributedTokenCache%2A>.
Gebruik een gedeelde sleutelring voor gegevensbeveiliging in productie, zodat exemplaren van de app op servers in een webfarm tokens kunnen ontsleutelen wanneer <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.Encrypt%2A?displayProperty=nameWithType> deze is ingesteld op true.
Notitie
Voor vroege ontwikkeling en lokale tests op één computer kunt u later een gedeelde sleutelring voor gegevensbeveiliging instellen <xref:Microsoft.Identity.Web.TokenCacheProviders.Distributed.MsalDistributedTokenCacheAdapterOptions.Encrypt%2A>false en configureren:
options.Encrypt = false;
Later in de ontwikkel- en testperiode schakelt u tokenversleuteling in en gaat u over op een gedeelde sleutelring voor gegevensbescherming.
In het volgende voorbeeld ziet u hoe u Azure Blob Storage en Azure Key Vault (PersistKeysToAzureBlobStorage/ProtectKeysWithAzureKeyVault) gebruikt voor de gedeelde sleutelring. De serviceconfiguraties zijn basisscenario's voor demonstratiedoeleinden. Voordat u productie-apps implementeert, moet u vertrouwd raken met de Azure-services en aanbevolen procedures gebruiken met behulp van de toegewezen documentatiesets van De Azure-services, die aan het einde van deze sectie zijn gekoppeld.
Bevestig de aanwezigheid van de volgende pakketten in het serverproject van het Blazor Web App:
Notitie
Zie voor richtlijnen over het toevoegen van pakketten aan .NET-apps de artikelen onder Pakketten installeren en beheren in de Package consumption workflow (NuGet-documentatie). Bevestig de juiste pakketversies op NuGet.org.
Notitie
Controleer voordat u doorgaat met de volgende stappen of de app is geregistreerd bij Microsoft Entra.
De volgende code wordt doorgaans geïmplementeerd op hetzelfde moment dat een gedistribueerde tokencacheprovider voor productie wordt geïmplementeerd. Andere opties, zowel binnen Azure als buiten Azure, zijn beschikbaar voor het beheren van gegevensbeveiligingssleutels voor meerdere app-exemplaren, maar de voorbeeld-app laat zien hoe u Azure-services gebruikt.
Configureer Azure Blob Storage om gegevensbeveiligingssleutels te onderhouden. Volg de richtlijnen in Sleutelopslagproviders in ASP.NET Core.
Configureer Azure Key Vault om de inactieve gegevensbeveiligingssleutels te versleutelen. Volg de richtlijnen in Configureren ASP.NET Core Data Protection.
Gebruik de volgende code in het Program bestand waarin services zijn geregistreerd:
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);
U kunt elke app-naam doorgeven aan SetApplicationName. Bevestig dat alle app-implementaties dezelfde waarde gebruiken.
{MANAGED IDENTITY CLIENT ID}: de door Azure beheerde Identity client-id (GUID).
{TENANT ID}: Tenant-ID.
{BLOB URI}: Volledige URI naar het sleutelbestand. De URI wordt gegenereerd door Azure Storage wanneer u het sleutelbestand maakt. Gebruik geen SAS.
{KEY IDENTIFIER}: Azure Key Vault-sleutel-id die wordt gebruikt voor sleutelversleuteling. Met een toegangsbeleid heeft de toepassing toegang tot de sleutelkluis met Get, Unwrap Keyen Wrap Key machtigingen. De versie van de sleutel wordt verkregen van de sleutel in de Entra- of Azure-portal nadat deze is gemaakt. Als u automatischerotatie van de Key Vault-sleutel inschakelt, moet u ervoor zorgen dat u een versie-loze sleutelidentificatie gebruikt in de Key Vault-configuratie van de app, waarbij er geen sleutel-GUID aan het einde van de identificatie wordt geplaatst (bijvoorbeeld: https://contoso.vault.azure.net/keys/data-protection).
Notitie
In niet-productieomgevingen gebruikt DefaultAzureCredential het voorgaande voorbeeld om verificatie te vereenvoudigen tijdens het ontwikkelen van apps die in Azure worden geïmplementeerd door referenties te combineren die worden gebruikt in Azure-hostingomgevingen met referenties die worden gebruikt in lokale ontwikkeling. Zie Azure-gehoste .NET-apps verifiëren bij Azure-resources met behulp van een door het systeem toegewezen beheerde identiteit voor meer informatie.
U kunt de app ook configureren om de waarden op te geven uit app-instellingenbestanden met behulp van de JSON-configuratieprovider. Voeg het volgende toe aan het app-instellingenbestand:
"DistributedTokenCache": {
"DisableL1Cache": false,
"L1CacheSizeLimit": 524288000,
"Encrypt": true,
"SlidingExpirationInHours": 1
},
"DataProtection": {
"BlobUri": "{BLOB URI}",
"KeyIdentifier": "{KEY IDENTIFIER}"
}
Voorbeeldsectie DataProtection :
"DataProtection": {
"BlobUri": "https://contoso.blob.core.windows.net/data-protection/keys.xml",
"KeyIdentifier": "https://contoso.vault.azure.net/keys/data-protection"
}
Notitie
De sleutel-id in het vorige voorbeeld is versieloos. Er is geen GUID-sleutelversie aan het einde van de identificator. Dit is met name belangrijk als u ervoor kiest om automatische sleutelrotatie voor de sleutel te configureren. Zie Automatische rotatie van cryptografische sleutels configureren in Azure Key Vault: sleutelrotatiebeleid voor meer informatie.
Breng de volgende wijzigingen aan in het Program bestand:
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);
Voeg de volgende code toe waarbij services zijn geconfigureerd in het Program bestand:
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);
Zie de volgende bronnen voor meer informatie over het gebruik van een gedeelde gegevensbeveiligingssleutelring en sleutelopslagproviders:
- Sleutelopslagproviders in ASP.NET Core
- ASP.NET Core Data Protection configureren
- De Azure SDK voor .NET gebruiken in ASP.NET Core-apps
- Host ASP.NET Core in een webfarm: Gegevensbeveiliging
- ASP.NET Core Data Protection configureren
- Sleutelopslagproviders in ASP.NET Core
- Documentatie voor Azure Key Vault
- Azure Storage-documentatie
- Toegang bieden tot Key Vault-sleutels, -certificaten en -geheimen met op rollen gebaseerd toegangsbeheer van Azure
YARP-doorstuurbestemmingvoorvoegsel
De YARP-forwarder van het Blazor Web App serverproject, waarbij het toegangstoken van de gebruiker aan de MinimalApiJwt web-API-aanroep is gekoppeld, specificeert een bestemmingsprefix van https://weatherapi. Deze waarde komt overeen met de projectnaam die is doorgegeven aan AddProject in het Program bestand van het Aspire.AppHost project.
Doorzender in het Blazor Web App serverproject (BlazorWebAppEntra):
app.MapForwarder("/weather-forecast", "https://weatherapi", transformBuilder =>
{
...
}).RequireAuthorization();
Overeenkomende projectnaam in het Program bestand van het Aspire App Host-project (Aspire.AppHost):
var weatherApi = builder.AddProject<Projects.MinimalApiJwt>("weatherapi");
U hoeft het doelvoorvoegsel van de YARP-doorstuurserver niet te wijzigen bij het implementeren van de Blazor Web App in productieomgeving. Het Microsoft Identity Web Downstream-API-pakket maakt gebruik van de basis-URI die via de configuratie wordt doorgegeven om de web-API aan te roepen, niet het doelvoorvoegsel van de YARP-doorstuurserver. In productie transformeert de YARP-doorstuurserver alleen de aanvraag, waarbij het toegangstoken van de gebruiker wordt toegevoegd.
Omleiden naar de startpagina bij afmelding
Met het LogInOrOut-onderdeel (Layout/LogInOrOut.razor) wordt een verborgen veld ingesteld voor de retour-URL (ReturnUrl) op de huidige URL (currentURL). Wanneer de gebruiker zich afmeldt bij de app, retourneert de id-provider de gebruiker naar de pagina van waaruit ze zijn afgemeld. Als de gebruiker zich afmeldt vanaf een beveiligde pagina, wordt deze teruggezet naar dezelfde beveiligde pagina en teruggestuurd via het verificatieproces. Deze verificatiestroom is redelijk wanneer gebruikers regelmatig accounts moeten wijzigen.
U kunt ook het volgende LogInOrOut-onderdeel gebruiken, dat geen retour-URL levert wanneer u zich afmeldt.
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>
Beveiliging van weersgegevens
Voor meer informatie over hoe deze app zijn weergegevens beveiligt, zie Beveiliging van gegevens in Blazor Web Apps met interactieve automatische rendering.
Problemen oplossen
Loggen
De server-app is een standaard-ASP.NET Core-app. Zie de richtlijnen voor ASP.NET Core-logboekregistratie om een lager logboekregistratieniveau in te schakelen in de server-app.
Als u logboekregistratie voor foutopsporing of tracering voor Blazor WebAssembly verificatie wilt inschakelen, raadpleegt u de sectie Logboekregistratie aan de clientzijde van ASP.NET Core Blazor met de artikelversiekiezer ingesteld op ASP.NET Core in .NET 7 of hoger.
Veelvoorkomende fouten
De debugger onderbreekt bij een uitzondering tijdens afmelden met de externe Microsoft Entra-ID
De volgende uitzondering stopt de Visual Studio-debugger tijdens het afmelden met Microsoft Entra External ID:
Uncaught TypeError TypeError: Failed to execute 'postMessage' on 'Window': The provided value cannot be converted to a sequence.
De uitzondering wordt gegenereerd vanuit Entra JavaScript-code, dus dit is geen probleem met ASP.NET Core. De uitzondering heeft geen invloed op de app-functionaliteit in productie, dus de uitzondering kan worden genegeerd tijdens het testen van lokale ontwikkeling.
Verkeerde configuratie van de app of Identity internetprovider (IP)
De meest voorkomende fouten worden veroorzaakt door onjuiste configuratie. Hier volgen enkele voorbeelden:
- Afhankelijk van de vereisten van het scenario voorkomt een ontbrekende of onjuiste autoriteit, instantie, tenant-id, tenantdomein, client-id of omleidings-URI dat een app clients kan authenticeren.
- Onjuiste aanvraagbereiken voorkomen dat clients toegang hebben tot eindpunten van de serverweb-API.
- Onjuiste of ontbrekende server-API-machtigingen voorkomen dat clients toegang hebben tot web-API-eindpunten van de server.
- Het uitvoeren van de app op een andere poort dan is geconfigureerd in de omleidings-URI van de IP's app-registratie. Houd er rekening mee dat een poort niet vereist is voor Microsoft Entra ID en een app die wordt uitgevoerd op een
localhostontwikkelingstestadres, maar de poortconfiguratie van de app en de poort waarop de app wordt uitgevoerd, moet overeenkomen met niet-localhostadressen.
Het configuratieoverzicht in dit artikel toont voorbeelden van de juiste configuratie. Controleer zorgvuldig de configuratie op verkeerde instellingen voor apps en IP-adressen.
Als de configuratie correct wordt weergegeven:
Toepassingslogboeken analyseren.
Controleer het netwerkverkeer tussen de client-app en de IP- of server-app met de ontwikkelhulpprogramma's van de browser. Vaak wordt een exacte foutmelding of een bericht met een aanwijzing voor wat het probleem veroorzaakt door de IP- of server-app geretourneerd nadat u een aanvraag hebt ingediend. Richtlijnen voor ontwikkelhulpprogramma's vindt u in de volgende artikelen:
- Google Chrome (Google-documentatie)
- Microsoft Edge
- Mozilla Firefox (Mozilla-documentatie)
Het documentatieteam reageert op documentfeedback en fouten in artikelen (open een probleem in de sectie Feedback op deze pagina ) maar kan geen productondersteuning bieden. Er zijn verschillende openbare ondersteuningsforums beschikbaar om u te helpen bij het oplossen van problemen met een app. U wordt aangeraden het volgende te doen:
De voorgaande forums zijn niet eigendom van of worden beheerd door Microsoft.
Voor niet-beveiliging, niet-gevoelige en niet-vertrouwelijke reproduceerbare foutmeldingen in het framework, kun je een probleem openen bij de ASP.NET Core-producteenheid. Open geen melding bij de producteenheid voordat u de oorzaak van een probleem grondig hebt onderzocht en het probleem zelf evenals met behulp van de community op een openbaar ondersteuningsforum niet kunt oplossen. De producteenheid kan geen problemen met afzonderlijke apps oplossen die zijn verbroken vanwege eenvoudige onjuiste configuratie of gebruiksscenario's met betrekking tot services van derden. Als een rapport gevoelig of vertrouwelijk van aard is of een mogelijke beveiligingsfout in het product beschrijft die cyberaanvallers kunnen misbruiken, raadpleeg dan Beveiligingsproblemen en bugs rapporteren (
dotnet/aspnetcoreGitHub-opslagplaats).Niet-geautoriseerde cliënt voor ME-ID
info: Autorisatie van Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] is mislukt. Aan deze vereisten is niet voldaan: DenyAnonymousAuthorizationRequirement: Vereist een geverifieerde gebruiker.
Aanmeldingsoproepfout van ME-ID:
- Fout:
unauthorized_client - Beschrijving:
AADB2C90058: The provided application is not configured to allow public clients.
De fout oplossen:
- Open in Azure Portal het manifest van de app.
- Stel het
allowPublicClientkenmerk in opnulloftrue.
- Fout:
Cookies en sitegegevens
Cookies en sitegegevens kunnen worden bewaard in app-updates en kunnen het testen en oplossen van problemen verstoren. Wis het volgende tijdens het aanbrengen van wijzigingen in de app-code, gebruikersaccountwijzigingen bij de provider, of wijzigingen in de configuratie van provider-apps:
- Aanmeldingscookies van gebruikers
- App-cookies
- Sitegegevens in cache en opgeslagen
Een benadering om te voorkomen dat achterblijvende cookies en sitegegevens het testen en oplossen van problemen verstoren, is het volgende:
- Een browser configureren
- Gebruik een browser om te testen dat u kunt configureren om alle cookie en sitegegevens te verwijderen telkens wanneer de browser wordt gesloten.
- Zorg ervoor dat de browser handmatig of door de IDE is gesloten voor een wijziging in de configuratie van de app, testgebruiker of provider.
- Gebruik een aangepaste opdracht om een browser te openen in de InPrivate- of Incognitomodus in Visual Studio:
- Open Bladeren met dialoogvenster vanuit de Uitvoeren knop van Visual Studio.
- Selecteer de knop Toevoegen .
- Geef het pad naar uw browser op in het veld Programma . De volgende uitvoerbare paden zijn typische installatielocaties voor Windows 10. Als uw browser is geïnstalleerd op een andere locatie of als u Windows 10 niet gebruikt, geeft u het pad op naar het uitvoerbare bestand van de browser.
- 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:
- Geef in het veld Argumenten de opdrachtregeloptie op die de browser gebruikt om te openen in de InPrivate- of Incognito-modus. Voor sommige browsers is de URL van de app vereist.
- Microsoft Edge: gebruik
-inprivate. - Google Chrome: gebruik
--incognito --new-window {URL}, waarbij de{URL}tijdelijke aanduiding de URL is die moet worden geopend (bijvoorbeeldhttps://localhost:5001). - Mozilla Firefox: Gebruik
-private -url {URL}, waarbij de tijdelijke aanduiding voor de{URL}de URL is die moet worden geopend (bijvoorbeeldhttps://localhost:5001).
- Microsoft Edge: gebruik
- Geef een naam op in het veld Vriendelijke naam. Bijvoorbeeld
Firefox Auth Testing. - Selecteer de knop OK .
- Om te voorkomen dat u het browserprofiel moet selecteren voor elke iteratie van het testen met een app, stelt u het profiel in als de standaardinstelling met de knop Instellen als standaard .
- Zorg ervoor dat de browser wordt gesloten door de IDE voor elke wijziging in de app, testgebruiker of providerconfiguratie.
App-upgrades
Een werkende app kan onmiddellijk mislukken na het upgraden van de .NET Core SDK op de ontwikkelcomputer of het wijzigen van pakketversies in de app. In sommige gevallen kunnen incoherent pakketten een app breken bij het uitvoeren van belangrijke upgrades. De meeste van deze problemen kunnen worden opgelost door de volgende instructies te volgen:
- Wis de NuGet-pakketcaches van het lokale systeem door
dotnet nuget locals all --clearuit te voeren vanuit een opdrachtshell. - Verwijder de
binenobjmappen van het project. - Herstel het project en bouw het opnieuw.
- Verwijder alle bestanden in de implementatiemap op de server voordat u de app opnieuw implementeert.
Notitie
Het gebruik van pakketversies die niet compatibel zijn met het doelframework van de app, wordt niet ondersteund. Gebruik de NuGet Gallery voor informatie over een pakket.
De oplossing starten vanuit het juiste project
Blazor Web App s:
- Voor een van de BFF-patroonvoorbeelden (Backend-for-Frontend) start u de oplossing vanuit het
Aspire/Aspire.AppHostproject. - Voor een van de niet-BFF-patroonvoorbeelden start u de oplossing vanuit het serverproject.
Blazor Server:
Start de oplossing vanuit het serverproject.
De gebruiker inspecteren
Het volgende UserClaims onderdeel kan rechtstreeks in apps worden gebruikt of dienen als basis voor verdere aanpassing.
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;
}
}
Aanvullende informatiebronnen
- Een web-API aanroepen vanuit een ASP.NET Core-app Blazor : Microsoft Identity Platform voor web-API-aanroepen
- Documentatie voor Microsoft Identity Platform
- Documentatie voor web-API | Microsoft Identity Platform
- Een web-API die web-API's aanroept: Een API aanroepen: Optie 2: Een downstream-web-API aanroepen met de helperklasse
-
AzureAD/microsoft-identity-webGitHub-opslagplaats: Nuttige richtlijnen voor het implementeren van Microsoft Identity Web voor Microsoft Entra ID en Azure Active Directory B2C voor ASP.NET Core-apps, inclusief koppelingen naar voorbeeld-apps en gerelateerde Azure-documentatie. Op dit moment worden Blazor Web Appniet expliciet behandeld in de Azure-documentatie, maar de installatie en configuratie van een Blazor Web App voor ME-ID en Azure-hosting is hetzelfde als voor elke ASP.NET Core-web-app. -
AuthenticationStateProviderdienst - Verificatiestatus in Blazor Web Apps beheren
- Serviceabstracties in Blazor Web Apps