ASP.NET Core Blazor autentisering och auktorisering
Notera
Det här är inte den senaste versionen av den här artikeln. För den aktuella versionen, se .NET 9-versionen av den här artikeln.
Varning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i .NET och .NET Core Support Policy. För den aktuella versionen, se .NET 9-versionen av den här artikeln.
Viktig
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
För den aktuella versionen, se .NET 9-versionen av den här artikeln.
I den här artikeln beskrivs ASP.NET Cores stöd för konfiguration och hantering av säkerhet i Blazor appar.
Blazor använder befintliga ASP.NET Core-autentiseringsmekanismer för att upprätta användarens identity. Den exakta mekanismen beror på hur den Blazor appen hanteras, på serversidan eller på klientsidan.
Säkerhetsscenarier skiljer sig åt mellan auktoriseringskod som körs på serversidan och klientsidan i Blazor-applikationer. För auktoriseringskod som körs på servern kan auktoriseringskontroller framtvinga åtkomstregler för områden i appen och komponenterna. Eftersom körning av kod på klientsidan kan manipuleras kan auktoriseringskod som körs på klienten inte vara betrodd för att absolut framtvinga åtkomstregler eller styra visningen av innehåll på klientsidan.
Om tvingande av auktoriseringsregler måste garanteras ska du inte implementera auktoriseringskontroller i kod på klientsidan. Skapa en Blazor Web App som bara förlitar sig på rendering på serversidan (SSR) för auktoriseringskontroll och regelhantering.
Om tvingande av auktoriseringsregeln och säkerheten för data och kod måste garanteras ska du inte utveckla en app på klientsidan. Skapa en Blazor Server app.
Razor Pages-auktoriseringskonventioner gäller inte för routningsbara Razor komponenter. Om en icke-dirigerbar Razor komponent bäddas in på en sida i en Razor Pages-apppåverkar sidans auktoriseringskonventioner indirekt Razor komponenten tillsammans med rest av sidans innehåll.
ASP.NET Core Identity är utformat för att fungera inom ramen för HTTP-begäran och svarskommunikation, vilket vanligtvis inte är den kommunikationsmodell som används av Blazor-appklienten-servern. ASP.NET Core-appar som använder ASP.NET Core Identity för användarhantering bör använda Razor Pages i stället för Razor komponenter för Identity-relaterade användargränssnitt, till exempel användarregistrering, inloggning, utloggning och andra användarhanteringsuppgifter. Att skapa Razor komponenter som direkt hanterar Identity uppgifter är möjligt i flera scenarier men rekommenderas inte eller stöds inte av Microsoft.
ASP.NET Core-abstraktioner, till exempel SignInManager<TUser> och UserManager<TUser>, stöds inte i Razor komponenter. Mer information om hur du använder ASP.NET Core Identity med Blazorfinns i Scaffold ASP.NET Core Identity till en Blazor app på serversidan.
Notera
Kodexemplen i den här artikeln använder nullbara referenstyper (NRT) och .NET-kompilatorn null-state static analysis, som stöds i ASP.NET Core i .NET 6 eller senare. När du riktar in dig på ASP.NET Core 5.0 eller tidigare tar du bort null-typbeteckningen (?
) från exemplen i den här artikeln.
Underhålla känsliga data och autentiseringsuppgifter på ett säkert sätt
Lagra inte apphemligheter, anslutningssträngar, autentiseringsuppgifter, lösenord, personliga ID-nummer (PIN), privat .NET/C#-kod eller privata nycklar/token i kod på klientsidan, vilket är alltid osäker. Blazor kod på klientsidan bör komma åt säkra tjänster och databaser via ett säkert webb-API som du styr.
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 följande resurser:
- Säkra autentiseringsflöden (ASP.NET Core-dokumentation)
- hanterade identiteter för Microsoft Azure-tjänster (den här artikeln)
För lokal utveckling och testning på klientsidan och på serversidan använder du verktyget Secret Manager för att skydda känsliga autentiseringsuppgifter.
Hanterade identiteter för Microsoft Azure-tjänster
För Microsoft Azure-tjänster rekommenderar vi att du använder hanterade identiteter. Hanterade identiteter autentiserar säkert till Azure-tjänster utan att lagra autentiseringsuppgifter i appkod. Mer information finns i följande resurser:
- Vad är hanterade identiteter för Azure-resurser? (Microsoft Entra-dokumentation)
- Dokumentation om Azure-tjänster
Stöd för att skydda mot förfalskning
Mallen Blazor:
- Lägger till antiforgery-tjänster automatiskt när AddRazorComponents anropas i filen
Program
. - Lägger till Antiforgery Middleware genom att i UseAntiforgery-filen anropa
Program
i dess begäranbearbetningspipeline och kräver förfalskningsskydd på slutpunkten för att motverka hoten från cross-site request forgery (CSRF/XSRF). UseAntiforgery anropas efter UseHttpsRedirection. Ett anrop till UseAntiforgery måste göras efter anropen, om de finns, till UseAuthentication och UseAuthorization.
Komponenten AntiforgeryToken renderar en antiförfalskningstoken som ett dolt fält, och den här komponenten läggs automatiskt till i formulärinstanser (EditForm). För mer information, se översikten över ASP.NET Core Blazor-formulär.
Tjänsten AntiforgeryStateProvider ger åtkomst till en antiforgery-token som är associerad med den aktuella sessionen. Infoga tjänsten och anropa dess GetAntiforgeryToken() metod för att få den nuvarande AntiforgeryRequestToken. Mer information finns i Anropa ett webb-API från en ASP.NET Core Blazor-app.
Blazor lagrar begärandetoken i komponenttillstånd, vilket garanterar att antiforgery-token är tillgängliga för interaktiva komponenter, även om de inte har åtkomst till begäran.
Notera
Antiforgery- krävs endast när du skickar formulärdata till servern som kodas som application/x-www-form-urlencoded
, multipart/form-data
eller text/plain
eftersom dessa är endast giltiga formulärenctypes.
Mer information finns i följande resurser:
- Prevent Cross-Site Request Forgery (XSRF/CSRF) attacker i ASP.NET Core: Den här artikeln är den primära artikeln ASP.NET Core i ämnet, som gäller för Blazor Serverpå serversidan, serverprojektet för Blazor Web Apps och Blazor integrering med MVC/Razor Pages.
- ASP.NET Core Blazor forms overview: Avsnittet Antiforgery support i artikeln avser stöd för Blazor formulär mot förfalskning.
Autentisering på serversidan Blazor
Blazor appar på serversidan konfigureras för säkerhet på samma sätt som ASP.NET Core-appar. Mer information finns i artiklarna under ASP.NET Core-säkerhetsavsnitt.
Autentiseringskontexten upprättas endast när appen startar, vilket är när appen först ansluter till WebSocket via en SignalR anslutning med klienten. Autentisering kan baseras på en cookie eller någon annan ägartoken, men autentiseringen hanteras via SignalR hubben och helt inom -kretsen. Autentiseringskontexten underhålls under kretsens livslängd. Appar förnyar regelbundet användarens autentiseringstillstånd var 30:e minut.
Om appen måste fånga användare för anpassade tjänster, eller reagera på uppdateringar av användaren, se ASP.NET Core-serversidan och Blazor Web App ytterligare säkerhetsscenarier.
Blazor skiljer sig från en traditionell server-renderad webbapp som gör nya HTTP-begäranden med cookies i varje sidnavigering. Autentiseringen kontrolleras under navigeringshändelser. Cookies är dock inte inblandade. Cookies skickas endast när en HTTP-begäran görs till en server, vilket inte är vad som händer när användaren navigerar i en Blazor app. Under navigeringen kontrolleras användarens autentiseringstillstånd i Blazor-kretsen, som du kan uppdatera när som helst på servern med hjälp av RevalidatingAuthenticationStateProvider
abstraktion.
Viktig
Det rekommenderas inte att implementera en anpassad NavigationManager
för att uppnå autentiseringsverifiering under navigeringen. Om appen måste köra logik för anpassat autentiseringstillstånd under navigering, använd en anpassad AuthenticationStateProvider
.
Notera
Kodexemplen i den här artikeln använder nullbara referenstyper (NRT) och .NET-kompilatorn null-state static analysis, som stöds i ASP.NET Core i .NET 6 eller senare. När du riktar in dig på ASP.NET Core 5.0 eller tidigare tar du bort null-typbeteckningen (?
) från exemplen i den här artikeln.
Den inbyggda eller anpassade AuthenticationStateProvider-tjänsten hämtar autentiseringstillståndsdata från ASP.NET Cores HttpContext.User. Så här integreras autentiseringstillståndet med befintliga ASP.NET Core-autentiseringsmekanismer.
Mer information om autentisering på serversidan finns i ASP.NET Core Blazor-autentisering och auktorisering.
IHttpContextAccessor
/HttpContext
IHttpContextAccessor bör vanligtvis undvikas med interaktiv återgivning eftersom en giltig HttpContext inte alltid är tillgänglig.
IHttpContextAccessor kan användas för komponenter som återges statiskt på servern. Vi rekommenderar dock att du undviker det om det är möjligt.
HttpContext kan användas som en sammanhängande parameter endast i statiskt renderade rotkomponenter för allmänna uppgifter, till exempel att inspektera och ändra rubriker eller andra egenskaper i komponenten App
(Components/App.razor
). Värdet är alltid null
för interaktiv återgivning.
[CascadingParameter]
public HttpContext? HttpContext { get; set; }
För scenarier där HttpContext krävs i interaktiva komponenter rekommenderar vi att överföra data via ett beständigt tillstånd från servern. Mer information finns i ASP.NET Core-serversidan och Blazor Web App ytterligare säkerhetsscenarier.
Använd inte IHttpContextAccessor/HttpContext direkt eller indirekt i de Razor komponenterna i Blazor appar på serversidan. Blazor appar körs utanför ASP.NET Core-pipelinekontexten. Den HttpContext är inte garanterad att vara tillgänglig inom IHttpContextAccessoroch HttpContext är inte garanterat att ha kontexten som startade Blazor-appen.
Den rekommenderade metoden för att skicka begärans status till Blazor-appen är genom rotkomponentparametrar under appens initiala rendering. Alternativt kan appen kopiera data till en begränsad tjänst i rotkomponentens initieringslivscykelhändelse för användning i hela appen. Mer information finns i ASP.NET Core-serversidan och Blazor Web App ytterligare säkerhetsscenarier.
En viktig aspekt av Blazor säkerhet på serversidan är att användaren som är ansluten till en viss krets kan uppdateras någon gång efter att Blazor-kretsen har upprättats men IHttpContextAccessorinte uppdateras. Mer information om hur du hanterar den här situationen med anpassade tjänster finns i ASP.NET Core-serversidan och Blazor Web App ytterligare säkerhetsscenarier.
Gemensamt tillstånd
Blazor appar på serversidan lever i serverminnet och flera appsessioner hanteras i samma process. För varje appsession startar Blazor en krets med ett eget containeromfång för beroendeinmatning, vilket innebär att begränsade tjänster är unika per Blazor session.
Varning
Vi rekommenderar inte att appar på samma server delar tillstånd med hjälp av singleton-tjänster om inte extrem försiktighet vidtas, eftersom detta kan medföra säkerhetsrisker, till exempel läckage av användartillstånd över kretsar.
Du kan använda tillståndskänsliga singleton-tjänster i Blazor appar om de är särskilt utformade för det. Användning av en singleton-minnescache är till exempel acceptabel eftersom en minnescache kräver en nyckel för att få åtkomst till en viss post. Förutsatt att användarna inte har kontroll över de cachenycklar som används med cacheminnet läcker inte tillstånd som lagras i cacheminnet över kretsar.
Allmän vägledning om tillståndshantering finns i ASP.NET Core Blazor state management.
Säkerhet på serversidan för känsliga data och autentiseringsuppgifter
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 följande resurser:
- Säkra autentiseringsflöden (ASP.NET Core-dokumentation)
- Hanterade identiteter för Microsoft Azure-tjänster (Blazor dokumentation)
För lokal utveckling och testning på klientsidan och på serversidan använder du verktyget Secret Manager för att skydda känsliga autentiseringsuppgifter.
Projektmall
Skapa en ny Blazor app på serversidan genom att följa anvisningarna i Tooling for ASP.NET Core Blazor.
När du har valt appmallen på serversidan och konfigurerat projektet väljer du appens autentisering under Autentiseringstyp:
- Ingen (standard): Ingen autentisering.
- enskilda konton: Användarkonton lagras i appen med hjälp av ASP.NET Core Identity.
- Ingen (standard): Ingen autentisering.
- enskilda konton: Användarkonton lagras i appen med hjälp av ASP.NET Core Identity.
- Microsoft identity plattform: Mer information finns i ASP.NET Core Blazor-autentisering och auktorisering.
- Windows: Använd Windows-autentisering.
Blazor Identity användargränssnitt (enskilda konton)
Blazor stöder att generera ett fullständigt Blazor-baserat Identity-användargränssnitt när du väljer alternativet för autentisering för -individkonton.
Blazor Web App-mallen genererar Identity-kod för en SQL Server-databas. Kommandoradsversionen använder SQLite och innehåller en SQLite-databas för Identity.
Mallen:
- Har stöd för scenarier med interaktiv återgivning på serversidan (interaktiv SSR) och csr-scenarier (klientsidan) med autentiserade användare.
- Lägger till IdentityRazor komponenter och relaterad logik för rutinmässiga autentiseringsuppgifter, till exempel att logga in och ut användare. De Identity komponenterna stöder även avancerade Identity funktioner, till exempel kontobekräftelse och återställning av lösenord och multifaktorautentisering med hjälp av en app från tredje part. Observera att själva Identity komponenterna inte stöder interaktivitet.
- Lägger till Identity-relaterade paket och beroenden.
- Refererar till paketen Identity i
_Imports.razor
. - Skapar en anpassad användarklass Identity (
ApplicationUser
). - Skapar och registrerar en EF Core databaskontext (
ApplicationDbContext
). - Konfigurerar routning för de inbyggda Identity slutpunkterna.
- Innehåller Identity validering och affärslogik.
Om du vill granska Blazor frameworks Identity-komponenter kan du komma åt dem i mapparna Pages
och Shared
i mappen Account
i Blazor Web App-projektmallen (referenskälla).
När du väljer interaktiva webassembly- eller interaktiva autoåtergivningslägen hanterar servern alla autentiserings- och auktoriseringsbegäranden och Identity-komponenterna återges statiskt på servern i Blazor Web Apphuvudprojekt.
Ramverket tillhandahåller en anpassad AuthenticationStateProvider i både server- och klientprojekten (.Client
) som överför användarens autentiseringsstatus till webbläsaren. Serverprojektet anropar AddAuthenticationStateSerialization
, medan klientprojektet anropar AddAuthenticationStateDeserialization
. Om du autentiserar på servern i stället för klienten kan appen komma åt autentiseringstillståndet under förinläsningen och innan .NET WebAssembly-körningen initieras. De anpassade AuthenticationStateProvider-implementeringarna använder tjänsten Persistent Component State (PersistentComponentState) för att serialisera autentiseringstillståndet till HTML-kommentarer och sedan läsa tillbaka det från WebAssembly för att skapa en ny AuthenticationState instans. Mer information finns i avsnittet Hantera autentiseringstillstånd i Blazor Web Apps.
Endast för interaktiva serverlösningar är IdentityRevalidatingAuthenticationStateProvider
(referenskälla) en AuthenticationStateProvider på serversidan som omvalidar säkerhetsstämpeln för den anslutna användaren var 30:e minut som en interaktiv krets är ansluten.
När du väljer interaktiva webassembly- eller interaktiva autoåtergivningslägen hanterar servern alla autentiserings- och auktoriseringsbegäranden och Identity-komponenterna återges statiskt på servern i Blazor Web Apphuvudprojekt. Projektmallen innehåller en PersistentAuthenticationStateProvider
-klass (referenskälla) i projektet .Client
för att synkronisera användarens autentiseringstillstånd mellan servern och webbläsaren. Klassen är en anpassad implementering av AuthenticationStateProvider. Providern använder tjänsten Persistent Component State (PersistentComponentState) för att prerendera autentiseringstillståndet och spara det på sidan.
I huvudprojektet för en Blazor Web Appnamnges autentiseringstillståndsprovidern antingen IdentityRevalidatingAuthenticationStateProvider
(referenskälla) (endast serverinteraktivitetslösningar) eller PersistingRevalidatingAuthenticationStateProvider
(referenskälla) (webassembly- eller autointeraktivitetslösningar).
Blazor Identity beror på DbContext instanser som inte skapats av en fabrik, vilket är avsiktligt eftersom DbContext räcker för att projektmallens Identity komponenter ska kunna återges statiskt utan stöd för interaktivitet.
En beskrivning av hur globala interaktiva återgivningslägen tillämpas på icke-Identity komponenter samtidigt som statisk SSR tillämpas för de Identity komponenterna finns i ASP.NET Core Blazor återgivningslägen.
Mer information om hur du bevarar förinstallerat tillstånd finns i Prerender ASP.NET Core Razor-komponenter.
Notera
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik utgåva, använd listrutan Växla grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
Hantera autentiseringstillstånd i Blazor Web Apps
Det här avsnittet gäller för Blazor Web Appsom antar:
- Enskilda konton
- Klientsidesrendering (CSR, WebAssembly-baserad interaktivitet).
En autentiseringstillståndsprovider på klientsidan används endast inom Blazor och är inte integrerad med ASP.NET Core-autentiseringssystemet. Under prerendering respekterar Blazor de metadata som definierats på sidan och använder ASP.NET Core-autentiseringssystemet för att avgöra om användaren autentiseras. När en användare navigerar från en sida till en annan används en autentiseringsprovider på klientsidan. När användaren uppdaterar sidan (fullsidesuppdatering) är autentiseringstillståndsprovidern på klientsidan inte inblandad i autentiseringsbeslutet på servern. Eftersom användarens tillstånd inte bevaras av servern går alla autentiseringstillstånd som underhålls på klientsidan förlorade.
För att åtgärda detta är den bästa metoden att utföra autentisering i ASP.NET Core-autentiseringssystemet. Autentiseringstillståndsprovidern på klientsidan tar bara hand om att återspegla användarens autentiseringstillstånd. Exempel på hur du gör detta med autentiseringstillståndsleverantörer demonstreras i Blazor Web App-projektmallen och beskrivs nedan.
I serverprojektets Program
-fil anropar du AddAuthenticationStateSerialization
, som serialiserar AuthenticationState som returneras av serversidan AuthenticationStateProvider med hjälp av tjänsten Persistent Component State (PersistentComponentState):
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization();
API:et serialiserar endast serversidans namn och rollanspråk för åtkomst i webbläsaren. Om du vill inkludera alla anspråk anger du SerializeAllClaims
till true
i anropet på serversidan till AddAuthenticationStateSerialization
:
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization(
options => options.SerializeAllClaims = true);
I projektets .Client
-fil (Program
) anropar du AddAuthenticationStateDeserialization
, som lägger till en AuthenticationStateProvider där AuthenticationState deserialiseras från servern med hjälp av AuthenticationStateData
och tjänsten Persistent Component State (PersistentComponentState). Det bör finnas ett motsvarande anrop till AddAuthenticationStateSerialization
i serverprojektet.
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
PersistingRevalidatingAuthenticationStateProvider
(referenskälla): För Blazor Web Appsom använder interaktiv återgivning på serversidan (interaktiv SSR) och återgivning på klientsidan (CSR). Det här är en AuthenticationStateProvider på serversidan som omvaliderar säkerhetsstämpeln för den anslutna användaren var 30:e minut när en interaktiv session är ansluten. Den använder också tjänsten Persistent Component State för att överföra autentiseringstillståndet till klienten, vilket förblir konstant under CSR-livslängden.PersistingServerAuthenticationStateProvider
(referenskälla): För Blazor Web Appsom endast använder CSR. Det här är en AuthenticationStateProvider på serversidan som använder tjänsten Persistent Component State för att överföra autentiseringstillståndet till klienten, vilket sedan fastställs för CSR:s livslängd.PersistentAuthenticationStateProvider
(referenskälla): För Blazor Web Appsom använder CSR. Det här är en AuthenticationStateProvider på klientsidan som avgör användarens autentiseringstillstånd genom att söka efter data som sparats på sidan när de renderades på servern. Det här autentiseringstillståndet är fastställt för hela CSR:s livslängd. Om användaren behöver logga in eller ut krävs en fullsidesinläsning. Detta ger endast ett användarnamn och e-postmeddelande i visningssyfte. Det innehåller inte token som autentiserar till servern när efterföljande begäranden görs; processen hanteras separat med hjälp av en cookie som ingår iHttpClient
-begäranden till servern.
Notera
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik utgåva, använd listrutan Växla grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
Ställning Identity
Mer information om hur du scaffoldar Identity i en serverbaserad Blazor-app finns i Scaffold Identity i ASP.NET Core-projekt.
Scaffold Identity till en Blazor app på serversidan:
Ytterligare anspråk och token från externa leverantörer
Information om hur du lagrar extra krav och token från externa leverantörer finns i Spara extra krav och token från externa leverantörer i ASP.NET Core.
Azure App Service på Linux med Identity Server
Ange utfärdaren explicit när du distribuerar till Azure App Service på Linux med Identity Server. För mer information, se Använd Identity för att skydda en webb-API-serverdel för SPA:er.
Mata in AuthenticationStateProvider
för tjänster som är begränsade till en komponent
Försök inte lösa AuthenticationStateProvider inom ett anpassat omfång eftersom det, när en ny instans av AuthenticationStateProvider skapas, resulterar i att den inte initieras korrekt.
Om du vill få åtkomst till AuthenticationStateProvider i en tjänst som är begränsad till en komponent matar du in AuthenticationStateProvider med @inject
-direktivet eller attributet [Inject]
och skickar det till tjänsten som en parameter. Den här metoden säkerställer att rätt, initierad instans av AuthenticationStateProvider används för varje instans av användarappen.
ExampleService.cs
:
public class ExampleService
{
public async Task<string> ExampleMethod(AuthenticationStateProvider authStateProvider)
{
var authState = await authStateProvider.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
return $"{user.Identity.Name} is authenticated.";
}
else
{
return "The user is NOT authenticated.";
}
}
}
Registrera tjänsten med skop. I en Blazor app på serversidan har begränsade tjänster en livslängd som motsvarar varaktigheten för klientanslutningen krets.
I filen Program
:
builder.Services.AddScoped<ExampleService>();
I Startup.ConfigureServices
av Startup.cs
:
services.AddScoped<ExampleService>();
I den följande komponenten InjectAuthStateProvider
:
- Komponenten ärver OwningComponentBase.
-
AuthenticationStateProvider matas in och skickas till
ExampleService.ExampleMethod
. -
ExampleService
löses upp tillsammans med OwningComponentBase.ScopedServices och GetRequiredService, vilket returnerar den korrekta, initierade instansen avExampleService
som består under hela livslängden för användarens krets.
InjectAuthStateProvider.razor
:
@page "/inject-auth-state-provider"
@inherits OwningComponentBase
@inject AuthenticationStateProvider AuthenticationStateProvider
<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>
<p>@message</p>
@code {
private string? message;
private ExampleService? ExampleService { get; set; }
protected override async Task OnInitializedAsync()
{
ExampleService = ScopedServices.GetRequiredService<ExampleService>();
message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
}
}
@page "/inject-auth-state-provider"
@inject AuthenticationStateProvider AuthenticationStateProvider
@inherits OwningComponentBase
<h1>Inject <code>AuthenticationStateProvider</code> Example</h1>
<p>@message</p>
@code {
private string? message;
private ExampleService? ExampleService { get; set; }
protected override async Task OnInitializedAsync()
{
ExampleService = ScopedServices.GetRequiredService<ExampleService>();
message = await ExampleService.ExampleMethod(AuthenticationStateProvider);
}
}
Mer information finns i vägledningen om OwningComponentBase i ASP.NET Core beroendeinjektion Blazor.
Obehörigt innehåll visas vid förhandsrendering med en anpassad AuthenticationStateProvider
Undvik att visa obehörigt innehåll, till exempel innehåll i en AuthorizeView
komponent, samtidigt som du förbereder dig för en anpassad AuthenticationStateProvider
, genom att anta en av följande metoder:
Implementera IHostEnvironmentAuthenticationStateProvider för anpassade AuthenticationStateProvider för att stödja prerendering: Ett exempel på implementering av IHostEnvironmentAuthenticationStateProviderfinns i Blazor ramverkets ServerAuthenticationStateProvider implementering i
ServerAuthenticationStateProvider.cs
(referenskälla).Notera
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik utgåva, använd listrutan Växla grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
Inaktivera prerendering: Ange återgivningsläget med parametern
prerender
inställd påfalse
på den högsta komponenten i appens komponenthierarki som inte är en rotkomponent.Notera
Det går inte att göra en rotkomponent interaktiv, till exempel komponenten
App
. Därför kan prerendering inte inaktiveras direkt av komponentenApp
.För appar som baseras på Blazor Web App-projektmallen inaktiveras prerendering vanligtvis där komponenten
Routes
används i komponentenApp
(Components/App.razor
) :<Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Inaktivera även prerendering för den
HeadOutlet
komponenten:<HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Du kan också selektivt styra återgivningsläget som tillämpas på den
Routes
komponentinstansen. För exempel, se ASP.NET Core Blazor återgivningslägen.
Inaktivera prerendering: Öppna filen
_Host.cshtml
och ändra attributetrender-mode
för -komponenttag-helpern till Server:<component type="typeof(App)" render-mode="Server" />
- Autentisera användaren på servern innan appen startar: För att använda den här metoden måste appen svara på en användares första begäran med den Identity-baserade inloggningssidan eller vyn och förhindra alla begäranden till Blazor-slutpunkter tills de har autentiserats. Mer information finns i Skapa en ASP.NET Core-app med användardata som skyddas av auktorisering. Efter autentisering visas obehörigt innehåll i för-renderade Razor-komponenter endast när användaren verkligen är obehörig att visa innehållet.
Hantering av användartillstånd
Trots ordet "tillstånd" i namnet är AuthenticationStateProvider inte avsett för att lagra allmän användartillstånd. AuthenticationStateProvider anger endast användarens autentiseringstillstånd för appen, om de är inloggade i appen och vilka de är inloggade som.
Autentiseringen använder samma ASP.NET Core Identity-autentisering som Razor Pages- och MVC-appar. Användartillståndet som lagras för ASP.NET Core Identity överförs till Blazor utan att lägga till ytterligare kod i appen. Följ riktlinjerna i ASP.NET Core Identity artiklarna och självstudierna för att Identity funktioner ska träda i kraft i Blazor delar av appen.
Vägledning om allmän tillståndshantering utanför ASP.NET Core Identityfinns i ASP.NET Core Blazor state management.
Ytterligare säkerhetsabstraktioner
Ytterligare två abstraktioner deltar i hanteringen av autentiseringstillståndet:
ServerAuthenticationStateProvider (referenskälla): En AuthenticationStateProvider som används av Blazor-ramverket för att hämta autentiseringstillstånd från servern.
RevalidatingServerAuthenticationStateProvider (referenskälla): En basklass för AuthenticationStateProvider tjänster som används av Blazor-ramverket för att ta emot ett autentiseringstillstånd från värdmiljön och återanvända det med jämna mellanrum.
Standardintervallet för 30 minuters förlängning kan justeras i
RevalidatingIdentityAuthenticationStateProvider
(Areas/Identity/RevalidatingIdentityAuthenticationStateProvider.cs
). I följande exempel förkortas intervallet till 20 minuter:protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20);
Notera
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik utgåva, använd listrutan Växla grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
Hantering av autentiseringstillstånd vid utloggning
Blazor på serversidan bevarar användarautentiseringstillståndet under kretsens livslängd, inklusive på webbläsarflikar. För att proaktivt logga ut en användare mellan webbläsarflikar när användaren loggar ut på en flik måste du implementera en RevalidatingServerAuthenticationStateProvider (referenskälla) med en kort RevalidationInterval.
Notera
Dokumentationslänkar till .NET-referenskällan läser vanligtvis in lagringsplatsens standardgren, vilket representerar den aktuella utvecklingen för nästa version av .NET. Om du vill välja en tagg för en specifik utgåva, använd listrutan Växla grenar eller taggar. Mer information finns i Så här väljer du en versionstagg för ASP.NET Core-källkod (dotnet/AspNetCore.Docs #26205).
Giltighetsperiod för tillfällig omdirigerings-URL
Det här avsnittet gäller för Blazor Web Apps.
Använd alternativet RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration för att hämta eller ange giltighetstiden för ASP.NET Core Data Protection för tillfälliga omdirigerings-URL:er som genereras av server-side rendering Blazor. Dessa används endast tillfälligt, så livslängden behöver bara vara tillräckligt lång för att en klient ska kunna ta emot URL:en och börja navigera till den. Det bör dock också vara tillräckligt länge för att tillåta klocksnedvridning mellan servrar. Standardvärdet är fem minuter.
I följande exempel utökas värdet till sju minuter:
builder.Services.AddRazorComponents(options =>
options.TemporaryRedirectionUrlValidityDuration =
TimeSpan.FromMinutes(7));
Autentisering på klientsidan Blazor
I Blazor appar på klientsidan kan autentiseringskontroller på klientsidan kringgås eftersom all kod på klientsidan kan ändras av användarna. Detsamma gäller för alla apptekniker på klientsidan, inklusive JavaScript SPA-ramverk och interna appar för alla operativsystem.
Lägg till följande:
En paketreferens för
Microsoft.AspNetCore.Components.Authorization
NuGet-paketet.Notera
Mer information om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket på Arbetsflöde för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org.
Det Microsoft.AspNetCore.Components.Authorization namnområdet till appens
_Imports.razor
-fil.
Om du vill hantera autentisering använder du den inbyggda eller anpassade AuthenticationStateProvider-tjänsten.
Mer information om autentisering på klientsidan finns i Secure ASP.NET Core Blazor WebAssembly.
AuthenticationStateProvider
tjänst
AuthenticationStateProvider är den underliggande tjänsten som används av AuthorizeView-komponenten och sammanhängande autentiseringstjänster för att hämta autentiseringstillståndet för en användare.
AuthenticationStateProvider är den underliggande tjänsten som används av komponenten AuthorizeView och CascadingAuthenticationState komponent för att hämta autentiseringstillståndet för en användare.
Du använder vanligtvis inte AuthenticationStateProvider direkt. Använd AuthorizeView
-komponenten eller Task<AuthenticationState>
-metoder som beskrivs senare i den här artikeln. Den största nackdelen med att använda AuthenticationStateProvider direkt är att komponenten inte meddelas automatiskt om underliggande autentiseringstillståndsdata ändras.
Information om hur du implementerar en anpassad AuthenticationStateProviderfinns i ASP.NET Core Blazor autentiseringstillstånd, som innehåller vägledning om hur du implementerar ändringsmeddelanden för användarautentiseringstillstånd.
Hämta en användares huvuddata för anspråk
Tjänsten AuthenticationStateProvider kan tillhandahålla den aktuella användarens ClaimsPrincipal data, som du ser i följande exempel.
ClaimsPrincipalData.razor
:
@page "/claims-principal-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider
<h1>ClaimsPrincipal Data</h1>
<button @onclick="GetClaimsPrincipalData">Get ClaimsPrincipal Data</button>
<p>@authMessage</p>
@if (claims.Any())
{
<ul>
@foreach (var claim in claims)
{
<li>@claim.Type: @claim.Value</li>
}
</ul>
}
<p>@surname</p>
@code {
private string? authMessage;
private string? surname;
private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();
private async Task GetClaimsPrincipalData()
{
var authState = await AuthenticationStateProvider
.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
authMessage = $"{user.Identity.Name} is authenticated.";
claims = user.Claims;
surname = user.FindFirst(c => c.Type == ClaimTypes.Surname)?.Value;
}
else
{
authMessage = "The user is NOT authenticated.";
}
}
}
I föregående exempel:
-
ClaimsPrincipal.Claims returnerar användarens anspråk (
claims
) för visning i användargränssnittet. - Raden som hämtar användarens efternamn (
surname
) anropar ClaimsPrincipal.FindAll med ett predikat för att filtrera användarens anspråk.
@page "/claims-principal-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider
<h1>ClaimsPrincipal Data</h1>
<button @onclick="GetClaimsPrincipalData">Get ClaimsPrincipal Data</button>
<p>@authMessage</p>
@if (claims.Any())
{
<ul>
@foreach (var claim in claims)
{
<li>@claim.Type: @claim.Value</li>
}
</ul>
}
<p>@surname</p>
@code {
private string? authMessage;
private string? surname;
private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();
private async Task GetClaimsPrincipalData()
{
var authState = await AuthenticationStateProvider
.GetAuthenticationStateAsync();
var user = authState.User;
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
authMessage = $"{user.Identity.Name} is authenticated.";
claims = user.Claims;
surname = user.FindFirst(c => c.Type == ClaimTypes.Surname)?.Value;
}
else
{
authMessage = "The user is NOT authenticated.";
}
}
}
Om user.Identity.IsAuthenticated
är true
och eftersom användaren är en ClaimsPrincipalkan anspråk räknas upp och medlemskap i roller utvärderas.
Mer information om beroendeinmatning (DI) och tjänster finns i ASP.NET Core Blazor beroendeinmatning och beroendeinmatning i ASP.NET Core. För att få information om hur du implementerar en anpassad AuthenticationStateProvider, se ASP.NET Core Blazor autentiseringstillstånd.
Exponera autentiseringstillståndet som en sammanhängande parameter
Om autentiseringstillståndsdata krävs för procedurlogik, till exempel när du utför en åtgärd som utlöses av användaren, hämtar du autentiseringstillståndsdata genom att definiera en sammanhängande parameter av typen Task<
AuthenticationState>
, vilket visas i följande exempel.
CascadeAuthState.razor
:
@page "/cascade-auth-state"
<h1>Cascade Auth State</h1>
<p>@authMessage</p>
@code {
private string authMessage = "The user is NOT authenticated.";
[CascadingParameter]
private Task<AuthenticationState>? authenticationState { get; set; }
protected override async Task OnInitializedAsync()
{
if (authenticationState is not null)
{
var authState = await authenticationState;
var user = authState?.User;
if (user?.Identity is not null && user.Identity.IsAuthenticated)
{
authMessage = $"{user.Identity.Name} is authenticated.";
}
}
}
}
@page "/cascade-auth-state"
<h1>Cascade Auth State</h1>
<p>@authMessage</p>
@code {
private string authMessage = "The user is NOT authenticated.";
[CascadingParameter]
private Task<AuthenticationState>? authenticationState { get; set; }
protected override async Task OnInitializedAsync()
{
if (authenticationState is not null)
{
var authState = await authenticationState;
var user = authState?.User;
if (user?.Identity is not null && user.Identity.IsAuthenticated)
{
authMessage = $"{user.Identity.Name} is authenticated.";
}
}
}
}
Om user.Identity.IsAuthenticated
är true
kan anspråk specificeras och medlemskap i roller utvärderas.
Konfigurera den Task<
AuthenticationState>
kaskaderande parametern med tjänsterna AuthorizeRouteView och kaskaderande autentiseringstillstånd.
När du skapar en Blazor app från någon av de Blazor projektmallarna med autentisering aktiverat, innehåller appen AuthorizeRouteView och anropet till AddCascadingAuthenticationState som visas i följande exempel. En Blazor app på klientsidan innehåller även de tjänstregistreringar som krävs. Ytterligare information presenteras i avsnittet Anpassa obehörigt innehåll med komponenten Router
.
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
I filen Program
registrerar du sammanhängande autentiseringstillståndstjänster:
builder.Services.AddCascadingAuthenticationState();
Konfigurera den Task<
AuthenticationState>
sammanhängande parametern med hjälp av komponenterna AuthorizeRouteView och CascadingAuthenticationState.
När du skapar en Blazor app från en av Blazor projektmallar med autentisering aktiverat innehåller appen de AuthorizeRouteView- och CascadingAuthenticationState komponenter som visas i följande exempel. En Blazor app på klientsidan innehåller även de tjänstregistreringar som krävs. Ytterligare information presenteras i avsnittet Anpassa obehörigt innehåll med komponenten Router
.
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Notera
Med versionen av ASP.NET Core 5.0.1 och för ytterligare 5.x-versioner innehåller komponenten Router
parametern PreferExactMatches
inställd på @true
. Mer information finns i Migrera från ASP.NET Core 3.1 till 5.0.
Lägg till auktoriseringstjänster i Blazor-filen i en Program
-app på klientsidan:
builder.Services.AddAuthorizationCore();
Lägg till alternativ och auktoriseringstjänster i Blazor-filen i en Program
-app på klientsidan:
builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();
I en Blazor app på serversidan finns redan tjänster för alternativ och auktorisering, så inga ytterligare steg krävs.
Tillstånd
När en användare har autentiserats tillämpas auktorisering regler för att styra vad användaren kan göra.
Åtkomst beviljas eller nekas vanligtvis baserat på om:
- En användare autentiseras (loggas in).
- En användare har en roll.
- En användare har ett anspråk.
- En princip uppfylls.
Vart och ett av dessa begrepp är samma som i en ASP.NET Core MVC- eller Razor Pages-app. Mer information om ASP.NET Core-säkerhet finns i artiklarna under ASP.NET Core Security och Identity.
AuthorizeView
komponent
Komponenten AuthorizeView visar selektivt användargränssnittsinnehåll beroende på om användaren har behörighet. Den här metoden är användbar när du bara behöver visa data för användaren och inte behöver använda användarens identity i procedurlogik.
Komponenten exponerar en context
variabel av typen AuthenticationState (@context
i Razor syntax), som du kan använda för att komma åt information om den inloggade användaren:
<AuthorizeView>
<p>Hello, @context.User.Identity?.Name!</p>
</AuthorizeView>
Du kan också ange olika innehåll för visning om användaren inte har behörighet med en kombination av parametrarna Authorized och NotAuthorized:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
<p><button @onclick="HandleClick">Authorized Only Button</button></p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
private void HandleClick() { ... }
}
Även om AuthorizeView-komponenten styr synligheten för element baserat på användarens auktoriseringsstatus, framtvingar den inte säkerheten för själva händelsehanteraren. I föregående exempel är metoden HandleClick
bara associerad med en knapp som är synlig för behöriga användare, men ingenting hindrar att den här metoden anropas från andra platser. För att säkerställa säkerhet på metodnivå implementerar du ytterligare auktoriseringslogik i själva hanteraren eller i det relevanta API:et.
Razor-komponenter i Blazor Web Apps visar aldrig <NotAuthorized>
-innehåll när auktoriseringen misslyckas på serversidan under statisk SSR. Serversidan ASP.NET Core-pipelinen bearbetar auktorisering på servern. Använd tekniker på serversidan för att hantera obehöriga begäranden. För mer information, se ASP.NET Core Blazor återgivningslägen.
Varning
Markering och metoder på klientsidan som är kopplade till en AuthorizeView skyddas endast från att visas och köras i användargränssnittet som är renderat som ,, i klientappar Blazor. För att skydda auktoriserat innehåll och säkra metoder i Blazorpå klientsidan tillhandahålls innehållet vanligtvis av ett säkert, auktoriserat webb-API-anrop till ett server-API och lagras aldrig i appen. Mer information finns i Anropa ett webb-API från en ASP.NET Core Blazor-app och ASP.NET Core Blazor WebAssembly ytterligare säkerhetsscenarier.
Innehållet i Authorized och NotAuthorized kan innehålla godtyckliga objekt, till exempel andra interaktiva komponenter.
Auktoriseringsvillkor, till exempel roller eller principer som styr användargränssnittsalternativ eller åtkomst, beskrivs i avsnittet Authorization.
Om auktoriseringsvillkor inte anges använder AuthorizeView en standardprincip:
- Autentiserade (inloggade) användare har behörighet.
- Oautentiserade (utloggade) användare är obehöriga.
Komponenten AuthorizeView kan användas i komponenten NavMenu
(Shared/NavMenu.razor
) för att visa en NavLink
komponent (NavLink), men observera att den här metoden endast tar bort listobjektet från de renderade utdata. Det hindrar inte användaren från att navigera till komponenten. Implementera auktorisering separat i målkomponenten.
Rollbaserad och principbaserad auktorisering
Komponenten AuthorizeView stöder rollbaserad eller principbaserad auktorisering.
Använd parametern Roles för rollbaserad auktorisering. I följande exempel måste användaren ha ett rollanspråk för antingen Admin
eller Superuser
roller:
<AuthorizeView Roles="Admin, Superuser">
<p>You have an 'Admin' or 'Superuser' role claim.</p>
</AuthorizeView>
Om du vill kräva att en användare har både Admin
och Superuser
rollanspråk, ska AuthorizeView-komponenter kapslas in:
<AuthorizeView Roles="Admin">
<p>User: @context.User</p>
<p>You have the 'Admin' role claim.</p>
<AuthorizeView Roles="Superuser" Context="innerContext">
<p>User: @innerContext.User</p>
<p>You have both 'Admin' and 'Superuser' role claims.</p>
</AuthorizeView>
</AuthorizeView>
Föregående kod upprättar en Context
för den inre AuthorizeView komponenten för att förhindra en AuthenticationState kontextkollision. Konteksten för AuthenticationState nås i den yttre AuthorizeView med en standardmetod för att komma åt kontexten (@context.User
). Kontexten används i den inre AuthorizeView med den namngivna innerContext
-kontexten (@innerContext.User
).
Mer information, inklusive konfigurationsvägledning, finns i Rollbaserad auktorisering i ASP.NET Core.
För principbaserad auktorisering använder du parametern Policy med ett enda principnamn:
<AuthorizeView Policy="Over21">
<p>You satisfy the 'Over21' policy.</p>
</AuthorizeView>
Om du vill hantera det fall där användaren ska uppfylla en av flera principer skapar du en princip som bekräftar att användaren uppfyller andra principer.
För att hantera det fall där användaren måste uppfylla flera principer samtidigt tar du antingen av följande metoder:
Skapa en princip för AuthorizeView som bekräftar att användaren uppfyller flera andra principer.
Kapsla principerna i flera AuthorizeView komponenter:
<AuthorizeView Policy="Over21"> <AuthorizeView Policy="LivesInCalifornia"> <p>You satisfy the 'Over21' and 'LivesInCalifornia' policies.</p> </AuthorizeView> </AuthorizeView>
Anspråksbaserad auktorisering är ett särskilt fall av principbaserad auktorisering. Du kan till exempel definiera en princip som kräver att användarna har ett visst anspråk. Mer information finns i Principbaserad auktorisering i ASP.NET Core.
Om varken Roles eller Policy anges använder AuthorizeView standardprincipen:
- Autentiserade (inloggade) användare har behörighet.
- Oautentiserade (utloggade) användare är obehöriga.
Eftersom .NET-strängjämförelser är skiftlägeskänsliga är matchande roll- och principnamn också skiftlägeskänsliga. Till exempel behandlas Admin
(versaler A
) inte som samma roll som admin
(gemener a
).
Pascal-fallet används vanligtvis för roll- och principnamn (till exempel BillingAdministrator
), men användningen av Pascal-fallet är inte ett strikt krav. Olika höljescheman, till exempel kamelfodring, kebabfodring och ormfodring, är tillåtna. Att använda blanksteg i roll- och principnamn är ovanligt men tillåts av ramverket. Till exempel är billing administrator
ett ovanligt format för roll- eller principnamn i .NET-appar, men det är ett giltigt roll- eller principnamn.
Innehåll som visas under asynkron autentisering
Blazor gör att autentiseringstillstånd kan fastställas asynkront. Det primära scenariot för den här metoden finns i Blazor appar på klientsidan som skickar en begäran till en extern slutpunkt för autentisering.
När autentisering pågår visar AuthorizeView inget innehåll. Om du vill visa innehåll under autentiseringen tilldelar du innehåll till parametern Authorizing:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<Authorizing>
<p>You can only see this content while authentication is in progress.</p>
</Authorizing>
</AuthorizeView>
Den här metoden gäller normalt inte för Blazor appar på serversidan. Blazor-appar på serversidan känner till autentiseringstillståndet så snart tillståndet har upprättats. Authorizing-innehållet kan tillhandahållas i appens AuthorizeView-komponent, men det visas aldrig.
[Authorize]
attribut
Attributet [Authorize]
finns i Razor komponenter:
@page "/"
@attribute [Authorize]
You can only see this if you're signed in.
Viktig
Använd endast [Authorize]
på @page
komponenter som nås via Blazor routern. Auktorisering utförs endast som en aspekt av routning och inte för underordnade komponenter som återges på en sida. Om du vill auktorisera visning av specifika delar på en sida använder du AuthorizeView i stället.
Attributet [Authorize]
stöder även rollbaserad eller principbaserad auktorisering. Använd parametern Roles för rollbaserad auktorisering:
@page "/"
@attribute [Authorize(Roles = "Admin, Superuser")]
<p>You can only see this if you're in the 'Admin' or 'Superuser' role.</p>
För principbaserad auktorisering använder du parametern Policy:
@page "/"
@attribute [Authorize(Policy = "Over21")]
<p>You can only see this if you satisfy the 'Over21' policy.</p>
Om varken Roles eller Policy anges använder [Authorize]
standardprincipen:
- Autentiserade (inloggade) användare har behörighet.
- Oautentiserade (utloggade) användare är obehöriga.
När användaren inte har behörighet och om appen inte anpassa obehörigt innehåll med Router
komponentenvisar ramverket automatiskt följande återställningsmeddelande:
Not authorized.
Resursauktorisering
Om du vill auktorisera användare för resurser skickar du begärans routningsdata till parametern Resource för AuthorizeRouteView.
I innehållet för Router.Found för en begärd rutt:
<AuthorizeRouteView Resource="routeData" RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
Mer information om hur auktoriseringstillståndsdata skickas och används i procedurlogik finns i avsnittet Exponera autentiseringstillståndet som en sammanhängande parameter.
När AuthorizeRouteView tar emot routningsdata för resursen har auktoriseringsprinciper åtkomst till RouteData.PageType och RouteData.RouteValues som tillåter att anpassad logik fattar auktoriseringsbeslut.
I följande exempel skapas en EditUser
princip i AuthorizationOptions för appens konfiguration av auktoriseringstjänsten (AddAuthorizationCore) med följande logik:
- Kontrollera om det finns ett routningsvärde med nyckeln
id
. Om nyckeln finns lagras vägvärdet ivalue
. - I en variabel med namnet
id
lagrar duvalue
som en sträng eller anger ett tomt strängvärde (string.Empty
). - Om
id
inte är en tom sträng, kontrollera att principen är uppfylld (returneratrue
) om strängens värde börjar medEMP
. Annars ska du slå fast att policyn misslyckas (returnerafalse
).
I filen Program
:
Lägg till namnområden för Microsoft.AspNetCore.Components och System.Linq:
using Microsoft.AspNetCore.Components; using System.Linq;
Lägg till principen:
options.AddPolicy("EditUser", policy => policy.RequireAssertion(context => { if (context.Resource is RouteData rd) { var routeValue = rd.RouteValues.TryGetValue("id", out var value); var id = Convert.ToString(value, System.Globalization.CultureInfo.InvariantCulture) ?? string.Empty; if (!string.IsNullOrEmpty(id)) { return id.StartsWith("EMP", StringComparison.InvariantCulture); } } return false; }) );
Föregående exempel är en översimplifierad auktoriseringsprincip som bara används för att demonstrera konceptet med ett fungerande exempel. Mer information om hur du skapar och konfigurerar auktoriseringsprinciper finns i Principbaserad auktorisering i ASP.NET Core.
I följande EditUser
komponent har resursen på /users/{id}/edit
en vägparameter för användarens identifierare ({id}
). Komponenten använder föregående EditUser
auktoriseringsprincip för att avgöra om vägvärdet för id
börjar med EMP
. Om id
börjar med EMP
lyckas principen och åtkomsten till komponenten är auktoriserad. Om id
börjar med ett annat värde än EMP
eller om id
är en tom sträng misslyckas principen och komponenten läses inte in.
EditUser.razor
:
@page "/users/{id}/edit"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "EditUser")]
<h1>Edit User</h1>
<p>The "EditUser" policy is satisfied! <code>Id</code> starts with 'EMP'.</p>
@code {
[Parameter]
public string? Id { get; set; }
}
@page "/users/{id}/edit"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "EditUser")]
<h1>Edit User</h1>
<p>The "EditUser" policy is satisfied! <code>Id</code> starts with 'EMP'.</p>
@code {
[Parameter]
public string? Id { get; set; }
}
Anpassa obehörigt innehåll med komponenten Router
Med komponenten Router tillsammans med komponenten AuthorizeRouteView kan appen ange anpassat innehåll om:
- Användaren misslyckas med ett
[Authorize]
villkor som tillämpas på komponenten. Markupen för<NotAuthorized>
-elementet visas. Attributet[Authorize]
beskrivs i avsnittet[Authorize]
attribut. - Asynkron auktorisering pågår, vilket vanligtvis innebär att processen med att autentisera användaren pågår. Markupen för
<Authorizing>
-elementet visas.
Viktig
Blazor routerfunktioner som visar <NotAuthorized>
och <NotFound>
innehåll är inte operativa under statisk återgivning på serversidan (statisk SSR) eftersom begäransbearbetning helt hanteras av ASP.NET Core-mellanmjukvarans pipeline och Razor komponenter renderas inte alls för obehöriga eller felaktiga begäranden. Använd tekniker på serversidan för att hantera obehöriga och felaktiga begäranden under statisk SSR. För mer information, se ASP.NET Core Blazor återgivningslägen.
<Router ...>
<Found ...>
<AuthorizeRouteView ...>
<NotAuthorized>
...
</NotAuthorized>
<Authorizing>
...
</Authorizing>
</AuthorizeRouteView>
</Found>
</Router>
Innehållet i Authorized och NotAuthorized kan innehålla godtyckliga objekt, till exempel andra interaktiva komponenter.
Notera
Föregående kräver sammanhängande registrering av autentiseringstillståndstjänster i appens Program
-fil:
builder.Services.AddCascadingAuthenticationState();
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView ...>
<NotAuthorized>
...
</NotAuthorized>
<Authorizing>
...
</Authorizing>
</AuthorizeRouteView>
</Found>
</Router>
</CascadingAuthenticationState>
Innehållet i NotFound, Authorizedoch NotAuthorized kan innehålla godtyckliga objekt, till exempel andra interaktiva komponenter.
Om NotAuthorized innehåll inte har angetts använder AuthorizeRouteView följande återställningsmeddelande:
Not authorized.
En app som skapats från Blazor WebAssembly-projektmallen med autentisering aktiverat innehåller en RedirectToLogin
komponent, som är placerad i <NotAuthorized>
innehållet i komponenten Router. När en användare inte autentiseras (context.User.Identity?.IsAuthenticated != true
) omdirigerar komponenten RedirectToLogin
webbläsaren till authentication/login
slutpunkten för autentisering. Användaren returneras till den begärda URL:en när den har autentiserats med identity-providern.
Procedurlogik
Om appen krävs för att kontrollera auktoriseringsregler som en del av procedurlogik använder du en överlappande parameter av typen Task<
AuthenticationState>
för att hämta användarens ClaimsPrincipal.
Task<
AuthenticationState
>
kan kombineras med andra tjänster, till exempel IAuthorizationService
, för att utvärdera principer.
I följande exempel:
-
user.Identity.IsAuthenticated
kör kod för autentiserade (inloggade) användare. -
user.IsInRole("admin")
kör kod för användare i rollen "Administratör". -
(await AuthorizationService.AuthorizeAsync(user, "content-editor")).Succeeded
kör kod för användare som uppfyller kraven i "innehållsredigerings"-policyn.
En Blazor app på serversidan innehåller lämpliga namnområden när den skapas från projektmallen. I en Blazor app på klientsidan bekräftar du förekomsten av Microsoft.AspNetCore.Authorization och Microsoft.AspNetCore.Components.Authorization namnområden antingen i komponenten eller i appens _Imports.razor
-fil:
@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization
ProceduralLogic.razor
:
@page "/procedural-logic"
@inject IAuthorizationService AuthorizationService
<h1>Procedural Logic Example</h1>
<button @onclick="@DoSomething">Do something important</button>
@code {
[CascadingParameter]
private Task<AuthenticationState>? authenticationState { get; set; }
private async Task DoSomething()
{
if (authenticationState is not null)
{
var authState = await authenticationState;
var user = authState?.User;
if (user is not null)
{
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
// ...
}
if (user.IsInRole("Admin"))
{
// ...
}
if ((await AuthorizationService.AuthorizeAsync(user, "content-editor"))
.Succeeded)
{
// ...
}
}
}
}
}
@page "/procedural-logic"
@inject IAuthorizationService AuthorizationService
<h1>Procedural Logic Example</h1>
<button @onclick="@DoSomething">Do something important</button>
@code {
[CascadingParameter]
private Task<AuthenticationState>? authenticationState { get; set; }
private async Task DoSomething()
{
if (authenticationState is not null)
{
var authState = await authenticationState;
var user = authState?.User;
if (user is not null)
{
if (user.Identity is not null && user.Identity.IsAuthenticated)
{
// ...
}
if (user.IsInRole("Admin"))
{
// ...
}
if ((await AuthorizationService.AuthorizeAsync(user, "content-editor"))
.Succeeded)
{
// ...
}
}
}
}
}
Felsökning av fel
Vanliga fel:
Auktorisering kräver en sammanhängande parameter av typen
Task<AuthenticationState>
. Överväg att användaCascadingAuthenticationState
för att tillhandahålla detta.null
värde tas emot förauthenticationStateTask
Det är troligt att projektet inte skapades med hjälp av en Blazor mall på serversidan med autentisering aktiverat.
I .NET 7 eller tidigare omsluter du en <CascadingAuthenticationState>
runt någon del av användargränssnittsträdet, till exempel runt Blazor routern:
<CascadingAuthenticationState>
<Router ...>
...
</Router>
</CascadingAuthenticationState>
Använd inte komponenten CascadingAuthenticationState i .NET 8 eller senare:
- <CascadingAuthenticationState>
<Router ...>
...
</Router>
- </CascadingAuthenticationState>
Lägg i stället till sammanhängande autentiseringstillståndstjänster i tjänstsamlingen i filen Program
:
builder.Services.AddCascadingAuthenticationState();
Den CascadingAuthenticationState-komponenten (.NET 7 eller tidigare) eller tjänster som tillhandahålls av AddCascadingAuthenticationState (.NET 8 eller senare) levererar den Task<
AuthenticationState>
kaskadparametern, som i sin tur tas emot från den underliggande AuthenticationStateProvider beroendeinjektionstjänsten.
Personligt identifierbar information (PII)
Microsoft använder GDPR-definition för "personuppgifter" (GDPR 4.1) när dokumentationen diskuterar personligt identifierbar information (PII).
PII avser all information som rör en identifierad eller identifierbar fysisk person. En identifierbar fysisk person är en person som kan identifieras, direkt eller indirekt, med något av följande:
- Namn
- Identifieringsnummer
- Platskoordinater
- Onlineidentifierare
- Andra specifika faktorer
- Fysisk
- Fysiologisk
- Genetisk
- Mental (psykologisk)
- Ekonomisk
- Kulturell
- Sociala identity
Ytterligare resurser
- Resurser för serversidan och Blazor Web App
- Snabbstart: Lägga till inloggning med Microsoft i en ASP.NET Core-webbapp
- snabbstart: Skydda ett ASP.NET Core-webb-API med Microsoft identity plattform
-
Konfigurera ASP.NET Core att fungera med proxyservrar och lastbalanserare: Innehåller vägledning om:
- Använda vidarebefordrade huvudmellanprogram för att bevara HTTPS-schemainformation över proxyservrar och interna nätverk.
- Ytterligare scenarier och användningsfall, inklusive manuell schemakonfiguration, begärandesökvägsändringar för korrekt routning av begäranden och vidarebefordran av begärandeschemat för Linux och icke-IIS omvända proxyservrar.
- Dokumentation om Microsoft identity-plattformen
- ASP.NET Core-säkerhetsavsnitt
- Konfigurera Windows-autentisering i ASP.NET Core
- Skapa en anpassad version av JavaScript-biblioteket Authentication.MSAL
- Awesome Blazor: Exempellänkar för autentisering community
- ASP.NET Core Blazor Hybrid-autentisering och auktorisering
- Resurser på serversidan Blazor
- Snabbstart: Lägga till inloggning med Microsoft i en ASP.NET Core-webbapp
- snabbstart: Skydda ett ASP.NET Core-webb-API med Microsoft identity plattform
-
Konfigurera ASP.NET Core att fungera med proxyservrar och lastbalanserare: Innehåller vägledning om:
- Använda vidarebefordrade huvudmellanprogram för att bevara HTTPS-schemainformation över proxyservrar och interna nätverk.
- Ytterligare scenarier och användningsfall, inklusive manuell schemakonfiguration, begärandesökvägsändringar för korrekt routning av begäranden och vidarebefordran av begärandeschemat för Linux och icke-IIS omvända proxyservrar.
- Dokumentation om Microsoft identity-plattformen
- ASP.NET Core-säkerhetsavsnitt
- Konfigurera Windows-autentisering i ASP.NET Core
- Skapa en anpassad version av JavaScript-biblioteket Authentication.MSAL
- Awesome Blazor: Exempellänkar för autentisering community
ASP.NET Core