Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Warning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Important
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 nuvarande utgåvan, 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 fastställa användarens identitet. 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 Auktoriseringskonventioner för sidor gäller inte för routningsbara Razor komponenter. Om en icke-dirigerbar Razor komponent bäddas in på en sida i en Razor pages-app påverkar sidans auktoriseringskonventioner indirekt komponenten Razor tillsammans med resten 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 Skapa ASP.NET Core Identity i en app på serversidanBlazor.
Note
Kodexemplen i den här artikeln använder nullbara referenstyper (NRT) och statisk analys av .NET-kompilatorns null-tillstånd, som stöds i ASP.NET Core i .NET 6 eller senare. När du riktar in dig på .NET 5 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 alltid är osäkert. 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 Secret Manager-verktyget för att skydda känsliga data. Mer information finns i följande resurser:
- Skydda 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 serversidan använder du secret manager-verktyget 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 automatiskt till antiforgery-tjänster när AddRazorComponents anropas i filen Program.
- Lägger till Antiforgery Middleware genom att i UseAntiforgery-filen anropa Programi 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). Mer information finns i översikten över ASP.NET Core-formulärBlazor.
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-appBlazor.
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.
Note
              Skydd mot förfalskning krävs endast när formulärdata skickas till servern som kodas som application/x-www-form-urlencoded, multipart/form-dataeller text/plain eftersom dessa är de enda giltiga formulärenctypes.
Mer information finns i följande resurser:
- Förhindra XSRF-/CSRF-attacker (Cross-Site Request Forgery) i ASP.NET Core: Den här artikeln är den primära ASP.NET Core-artikeln om ämnet, som gäller för serversidan Blazor Server, serverprojektet för Blazor Web Apps och Blazor integrering med MVC/Razor Pages.
- översikt över ASP.NET Core-formulärBlazor: Avsnittet Stöd för skydd mot förfalskning i artikeln gäller 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 till 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 upp användare för anpassade tjänster eller reagera på uppdateringar av användaren, läs mer om Blazor Web App.
              Blazor skiljer sig från traditionella server-renderade webbappar 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 abstraktionenRevalidatingAuthenticationStateProvider.
Important
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 navigeringen använder du en anpassad AuthenticationStateProvider.
Note
Kodexemplen i den här artikeln använder nullbara referenstyper (NRT) och statisk analys av .NET-kompilatorns null-tillstånd, som stöds i ASP.NET Core i .NET 6 eller senare. När du riktar in dig på .NET 5 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-autentisering Blazor och -auktorisering.
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.
Warning
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åndsbaserade singleton-tjänster i Blazor-appar om de är utformade särskilt 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 översikten över 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 Secret Manager-verktyget för att skydda känsliga data. Mer information finns i följande resurser:
- Skydda 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 serversidan använder du secret manager-verktyget för att skydda känsliga autentiseringsuppgifter.
Projektmall
Skapa en ny app på serversidan Blazor genom att följa riktlinjerna i Verktyg för 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.
- Microsofts identitetsplattform: Mer information finns i ASP.NET Core-autentisering Blazor och -auktorisering.
- Windows: Använd Windows-autentisering.
Blazor Identity användargränssnitt (enskilda konton)
Blazor stöder generering av ett fullständigt Blazor-baserat Identity användargränssnitt när du väljer autentiseringsalternativet för enskilda konton.
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. Komponenterna Identity har också stöd för avancerade Identity funktioner, till exempel kontobekräftelse och lösenordsåterställning 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 inspektera Blazor ramverkets Identity komponenter kan du komma åt dem i mapparna PagesShared och Components/Account i mappen i serverprojektet för projektmallenBlazor Web App (dotnet/aspnetcoreGitHub-lagringsplatsen).
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, IdentityRevalidatingAuthenticationStateProvider (Components/Account/IdentityRevalidatingAuthenticationStateProvider.cs) i serverprojektet i projektmallenBlazor Web App (dotnet/aspnetcoreGitHub-lagringsplatsen), är en serversida AuthenticationStateProvider som omvaliderar säkerhetsstämpeln för den anslutna användaren var 30:e minut när 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 .Client projektet för att synkronisera användarens autentiseringstillstånd mellan servern och webbläsaren. Klassen är en anpassad implementering av AuthenticationStateProvider. Providern använder Persistent Component State-tjänsten (PersistentComponentState) för att förberenda autentiseringstillståndet och lagra det på sidan.
I huvudprojektet för en Blazor Web Appnamnges autentiseringstillståndsprovidern antingen IdentityRevalidatingAuthenticationStateProvider i mappen för Components/Account serverprojektet i projektmallenBlazor Web App (dotnet/aspnetcoreGitHub-lagringsplats) (endast serverinteraktivitetslösningar) eller PersistingRevalidatingAuthenticationStateProvider (WebAssembly- eller Auto interactivity-lösningar) i samma mapp.
Blazor Identity beror på DbContext instanser som inte har skapats av en fabrik, vilket är avsiktligt eftersom DbContext det räcker för att projektmallens komponenter ska återges Identity statiskt utan stöd för interaktivitet.
En beskrivning av hur globala interaktiva återgivningslägen tillämpas på icke-komponenterIdentity samtidigt som statisk SSR tillämpas för komponenterna Identity finns i ASP.NET Core-återgivningslägenBlazor.
Mer information om hur du bevarar förinstallerat tillstånd finns i ASP.NET Core Blazor prerendered state persistence.
Note
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 version använder du 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 Apps som antar:
- Individuella konton
- Återgivning på klientsidan (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 den AuthenticationState som returneras av serversidan AuthenticationStateProvider med 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 filen för klientprojektet (.ClientProgram) anropar du AddAuthenticationStateDeserialization, vilket lägger till en AuthenticationStateProvider där AuthenticationState deserialiseras från servern med AuthenticationStateData och tjänsten Persistent Component State (). Det bör finnas ett motsvarande anrop till AddAuthenticationStateSerialization i serverprojektet.
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
- PersistingRevalidatingAuthenticationStateProvider(- dotnet/aspnetcoreGitHub-lagringsplats): För Blazor Web Apps som 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 sedan säkerställs under CSR:s livslängd.
- PersistingServerAuthenticationStateProvider(- dotnet/aspnetcoreGitHub-lagringsplats): För Blazor Web Apps som endast använder CSR. Det här är en server-sida AuthenticationStateProvider som använder tjänsten Persistent Component State för att överföra autentiseringstillståndet till klienten, som sedan är fast under livstiden för CSR.
- PersistentAuthenticationStateProvider(- dotnet/aspnetcoreGitHub-lagringsplats): För Blazor Web Apps som antar 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 i- HttpClient-begäranden till servern.
Note
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 version använder du 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 integrerar Identity i en app på serversidan Blazor finns i dokumentet Scaffolding Identity för ASP.NET Core-projekt.
Scaffold Identity till en Blazor-applikation för serversidan.
Ytterligare anspråk och token från externa leverantörer
För att lagra ytterligare krav från externa leverantörer, se Spara ytterligare 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. Mer information finns i Använda 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 komma åt AuthenticationStateProvider i en tjänst som är begränsad till en komponent matar du in AuthenticationStateProvider i komponenten och skickar den 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 app på serversidan Blazor har begränsade tjänster en livslängd som motsvarar varaktigheten för klientanslutningskretsen.
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.
- 
              ExampleServicelöses upp tillsammans med OwningComponentBase.ScopedServices och GetRequiredService, vilket returnerar den korrekta, initierade instansen avExampleServicesom 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);
    }
}
För mer information, se vägledningen om OwningComponentBase i ASP.NET Core-beroendeinjektionBlazor.
Obehörigt innehåll visas vid förhandsrendering med en anpassad AuthenticationStateProvider
Om du vill undvika att visa obehörigt innehåll, till exempel innehåll i en AuthorizeView komponent, medan du förbereder med en anpassad AuthenticationStateProvider, använder du någon av följande metoder:
- Implementera IHostEnvironmentAuthenticationStateProvider för den anpassade AuthenticationStateProvider för att stödja prerendering: Ett exempel på implementering av IHostEnvironmentAuthenticationStateProvider finns i ramverkets Blazor-implementering i ServerAuthenticationStateProvider. - Note - 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 version använder du 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 - prerenderinställd på- falsepå den högsta komponenten i appens komponenthierarki som inte är en rotkomponent.- Note - Det går inte att göra en rotkomponent interaktiv, till exempel komponenten - App. Därför kan prerendering inte inaktiveras direkt av komponenten- App.- För appar som baseras på Blazor Web App-projektmallen inaktiveras prerendering vanligtvis där komponenten - Routesanvänds i komponenten- App(- Components/App.razor) :- <Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />- Inaktivera även prerendering för den - HeadOutletkomponenten:- <HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />- Du kan också selektivt styra återgivningsläget som tillämpas på den - Routeskomponentinstansen. Se till exempel ASP.NET Core-återgivningslägenBlazor.
- Inaktivera förrendering: Öppna - _Host.cshtmlfilen och ändra- render-modeattributet för komponenttagghjälpen 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 används AuthenticationStateProvider inte för att lagra allmänt 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 översikten över ASP.NET Core State Blazor Management.
Ytterligare säkerhetsabstraktioner
Ytterligare två abstraktioner deltar i hanteringen av autentiseringstillståndet:
- ServerAuthenticationStateProvider (referenskälla): Ett AuthenticationStateProvider som används av ramverket Blazor för att hämta autentiseringstillstånd från servern. 
- RevalidatingServerAuthenticationStateProvider(referenskälla): En basklass för tjänster som används av ramverket AuthenticationStateProvider för Blazor att ta emot ett autentiseringstillstånd från värdmiljön och återanvända det med jämna mellanrum. 
Note
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 version använder du 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).
I appar som genereras från projektmallen Blazor för .NET 8 eller senare justerar du standardintervallet för 30 minuters förlängning i IdentityRevalidatingAuthenticationStateProvider. Tidigare än .NET 8 justerar du intervallet i RevalidatingIdentityAuthenticationStateProvider. I följande exempel förkortas intervallet till 20 minuter:
protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20);
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 signera en användare på webbläsarflikar när användaren loggar ut på en flik måste du implementera en RevalidatingServerAuthenticationStateProvider (referenskälla) med en kort RevalidationInterval.
Note
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 version använder du 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.AuthorizationNuGet-paketet.- Note - Vägledning om hur du lägger till paket i .NET-appar finns i artiklarna under Installera och hantera paket i arbetsflödet för paketförbrukning (NuGet-dokumentation). Bekräfta rätt paketversioner på NuGet.org. 
- Det Microsoft.AspNetCore.Components.Authorization-namnområdet tillhör 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.
Skydda data i Blazor Web Appmed interaktiv automatisk rendering
När en Blazor Web App implementerar återgivning på serversidan (SSR) och återgivning på klientsidan (CSR) för komponenter eller en hel app som anger läget interaktiv automatisk återgivning tillämpas behörighet att komma åt komponenter och data på två platser. Komponenten begränsar åtkomsten till sig själv (och alla data som den hämtar) när den återges på servern på grund av ett auktoriseringsattribut i komponentens definitionsfil (@attribute [Authorize]). När komponenten återges på klienten begränsas åtkomsten till data via serverwebb-API-slutpunkterna som anropas från klienten. Du måste vara försiktig när du skyddar dataåtkomsten på båda platserna för att förhindra felaktig dataåtkomst.
Tänk dig följande scenario där säkra väderdata visas av en komponent. Demonstrationer av några av följande metoder kan utvärderas och testas med hjälp av exemplen BlazorWebAppEntra/BlazorWebAppEntraBff(.NET 9 eller senare) eller exemplenBlazorWebAppOidc/BlazorWebAppOidcBff(.NET 8 eller senare) på Blazor GitHub-lagringsplatsen för exempel () (dotnet/blazor-sampleshur du laddar ned).
Klientprojektet har en WeatherForecast-klass för att lagra väderdata:
public sealed class WeatherForecast(DateOnly date, int temperatureC, string summary)
{
    public DateOnly Date { get; set; } = date;
    public int TemperatureC { get; set; } = temperatureC;
    public string? Summary { get; set; } = summary;
    public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
}
Klientprojektets IWeatherForecaster-gränssnitt definierar en GetWeatherForecastAsync metod för att hämta väderdata:
public interface IWeatherForecaster
{
    Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync();
}
Klientprojektets ClientWeatherForecaster-tjänst implementerar IWeatherForecaster. Metoden GetWeatherForecastAsync anropar ett webb-API i serverprojektet vid /weather-forecast slutpunkten för väderdata:
internal sealed class ClientWeatherForecaster(HttpClient httpClient) 
    : IWeatherForecaster
{
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync() =>
        await httpClient.GetFromJsonAsync<WeatherForecast[]>("/weather-forecast") ??
            throw new IOException("No weather forecast!");
}
Klientprojektet har en Weather komponent som:
- Framtvingar auktorisering med ett [Authorize]attribut.
- Använder tjänsten Persistent Component State (PersistentComponentState) för att bevara väderprognosdata när komponenten övergår från statisk till interaktiv SSR på servern. Mer information finns i ASP.NET Core Blazor prerendered state persistence.
@page "/weather"
@using Microsoft.AspNetCore.Authorization
@using BlazorWebAppEntra.Client.Weather
@attribute [Authorize]
@inject IWeatherForecaster WeatherForecaster
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates showing data.</p>
@if (Forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th aria-label="Temperature in Celsius">Temp. (C)</th>
                <th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in Forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}
@code {
    [PersistentState]
    public IEnumerable<WeatherForecast>? Forecasts { get; set; }
    protected override async Task OnInitializedAsync()
    {
        Forecasts ??= await WeatherForecaster.GetWeatherForecastAsync();
    }
}
@page "/weather"
@using Microsoft.AspNetCore.Authorization
@using BlazorWebAppEntra.Client.Weather
@attribute [Authorize]
@implements IDisposable
@inject PersistentComponentState ApplicationState
@inject IWeatherForecaster WeatherForecaster
<PageTitle>Weather</PageTitle>
<h1>Weather</h1>
<p>This component demonstrates showing data.</p>
@if (forecasts == null)
{
    <p><em>Loading...</em></p>
}
else
{
    <table class="table">
        <thead>
            <tr>
                <th>Date</th>
                <th aria-label="Temperature in Celsius">Temp. (C)</th>
                <th aria-label="Temperature in Fahrenheit">Temp. (F)</th>
                <th>Summary</th>
            </tr>
        </thead>
        <tbody>
            @foreach (var forecast in forecasts)
            {
                <tr>
                    <td>@forecast.Date.ToShortDateString()</td>
                    <td>@forecast.TemperatureC</td>
                    <td>@forecast.TemperatureF</td>
                    <td>@forecast.Summary</td>
                </tr>
            }
        </tbody>
    </table>
}
@code {
    private IEnumerable<WeatherForecast>? forecasts;
    private PersistingComponentStateSubscription persistingSubscription;
    protected override async Task OnInitializedAsync()
    {
        if (!ApplicationState.TryTakeFromJson<IEnumerable<WeatherForecast>>(
            nameof(forecasts), out var restoredData))
        {
            forecasts = await WeatherForecaster.GetWeatherForecastAsync();
        }
        else
        {
            forecasts = restoredData!;
        }
        // Call at the end to avoid a potential race condition at app shutdown
        persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
    }
    private Task PersistData()
    {
        ApplicationState.PersistAsJson(nameof(forecasts), forecasts);
        return Task.CompletedTask;
    }
    void IDisposable.Dispose() => persistingSubscription.Dispose();
}
Serverprojektet implementerar IWeatherForecaster som ServerWeatherForecaster, vilket genererar och returnerar väderdata genom GetWeatherForecastAsync-metoden.
internal sealed class ServerWeatherForecaster() : IWeatherForecaster
{
    public readonly string[] summaries =
    [
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", 
        "Sweltering", "Scorching"
    ];
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync()
    {
        // Simulate asynchronous loading to demonstrate streaming rendering
        await Task.Delay(500);
        return 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();
    }
}
Om appen måste anropa ett externt webb-API för att hämta väderdata kan du mata in en HTTP-klient (HttpClient) för att begära data:
internal sealed class ServerWeatherForecaster(HttpClient httpClient, 
    IHttpContextAccessor httpContextAccessor) : IWeatherForecaster
{
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync()
    {
        var httpContext = httpContextAccessor.HttpContext ??
            throw new InvalidOperationException("No HttpContext!");
        var accessToken = await httpContext.GetTokenAsync("access_token") ??
            throw new InvalidOperationException("No access_token was saved");
        using var request = 
            new HttpRequestMessage(HttpMethod.Get, "/weather-forecast");
        request.Headers.Authorization = new("Bearer", accessToken);
        using var response = await httpClient.SendAsync(request);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
            throw new IOException("No weather forecast!");
    }
}
I ytterligare ett tillvägagångssätt kan du injicera en HTTP-klientfabrik (IHttpClientFactory) i ServerWeatherForecaster och anropa ett externt webb-API med en namngiven HTTP-klient som använder en tokenhanterare. Mer information finns i Anropa ett webb-API från en ASP.NET Core-appBlazor.
Om appen använder Microsofts identitetsplattform med Microsoft-webbpaket Identity för Microsoft Entra-ID (se Anropa ett webb-API från en ASP.NET Core-appBlazor) visar följande ServerWeatherForecaster hur du gör ett externt webb-API-anrop. Åtkomsttoken kopplas automatiskt till begäran.
internal sealed class ServerWeatherForecaster(IDownstreamApi downstreamApi) : IWeatherForecaster
{
    public async Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync()
    {
        using var response = await downstreamApi.CallApiForUserAsync("DownstreamApi",
            options =>
            {
                options.RelativePath = "/weather-forecast";
            });
        return await response.Content.ReadFromJsonAsync<WeatherForecast[]>() ??
            throw new IOException("No weather forecast!");
    }
}
Oavsett vilken metod som används ServerWeatherForecaster för att hämta data, underhåller serverprojektet en säker webb-API-slutpunkt för klientväderdataanrop. Den här slutpunkten resulterar i ett ServerWeatherForecaster.GetWeatherForecastAsync anrop på servern:
app.MapGet("/weather-forecast", (
    [FromServices] IWeatherForecaster WeatherForecaster) =>
{
    return WeatherForecaster.GetWeatherForecastAsync();
}).RequireAuthorization();
Med hjälp av föregående metod finns det två system för att tillhandahålla säkra väderdata till användaren:
- När komponenten Weatheråterges på servernServerWeatherForecasteranvänds tjänstensGetWeatherForecastAsyncmetod direkt för att hämta väderdata. Säkerheten för data framtvingas av komponentens[Authorize]attribut. Sammanfattningsvis framtvingas säkerheten för väderdata av komponenten.
- När komponenten Weatheråterges på klientenClientWeatherForecasteranvänds tjänsten för att göra ett webb-API-anrop till den säkra/weather-forecastslutpunkt som tillämpar tilläggsmetodenRequireAuthorization. Om användaren har behörighet att komma åt väderdata använder slutpunkten tjänstenServerWeatherForecasterför att anropaGetWeatherForecastAsync. Data returneras till klienten. Sammanfattningsvis framtvingas säkerheten för väderdata av serverappens webb-API-slutpunkt.
Föregående metod fungerar bra när säkerhetskraven för webb-API:et matchar komponentens säkerhetskrav. Till exempel kan samma auktoriseringsprincip tillämpas på både webb-API-slutpunkten och komponenten.
Komplexa scenarier kräver ytterligare planering och implementering. Till exempel kräver ett serverwebb-API som har flera anropare med olika åtkomstbehörigheter antingen en mer avancerad auktoriseringsprincip, en eller flera ytterligare principer eller ytterligare slutpunkter med olika åtkomstkrav.
När du skapar säkerhet i appar som implementerar interaktiv automatisk återgivning bör du tänka på att säkerheten som implementeras för serverns webb-API-slutpunkter inte skyddar serverns tjänstimplementering som används när en komponent renderas på servern och kommer åt data via tjänsten. Väg noggrant skillnaden mellan att komma åt data på servern under SSR jämfört med att komma åt data på en klientwebb-API-begäran under CSR. Tillämpa säkerhet strategiskt för att undvika felaktig åtkomst till data.
Exempel i exempel på Blazor GitHub-lagringsplats () (dotnet/blazor-sampleshur du laddar ned) som visar den metod som beskrivs i det här avsnittet:
- BlazorWebAppOidc
- BlazorWebAppOidcBff
- BlazorWebAppEntra
- BlazorWebAppEntraBff
              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 komponentenAuthorizeView eller Task<AuthenticationState> metoderna 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 ett anpassat AuthenticationStateProviderfinns i ASP.NET Core-autentiseringstillståndBlazor, 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 ClaimsPrincipal, kan anspråk räknas upp och medlemskap i roller utvärderas.
Mer information om beroendeinmatning (DI) och tjänster finns i ASP.NET Core-beroendeinmatning Blazor och beroendeinmatning i ASP.NET Core. Information om hur du implementerar en anpassad AuthenticationStateProviderfinns i ASP.NET Core-autentiseringstillståndBlazor.
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 truekan anspråk specificeras och medlemskap i roller utvärderas.
Konfigurera Task<AuthenticationState>kaskadparameter med hjälp av AuthorizeRouteView och kaskadautentiseringstillståndstjänster.
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 visas i avsnittet Anpassa obehörigt innehåll med komponentenRouter.
<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 visas i avsnittet Anpassa obehörigt innehåll med komponentenRouter.
<CascadingAuthenticationState>
    <Router ...>
        <Found ...>
            <AuthorizeRouteView RouteData="routeData" 
                DefaultLayout="typeof(MainLayout)" />
            ...
        </Found>
    </Router>
</CascadingAuthenticationState>
Note
Med versionen av .NET 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 .NET 5.
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.
Authorization
När en användare har autentiserats tillämpas auktoriseringsregler 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 är uppfylld.
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 identitet 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. ASP.NET Core-pipelinen bearbetar auktorisering på serversidan. Använd tekniker på serversidan för att hantera obehöriga begäranden. Mer information finns i ASP.NET Core-återgivningslägenBlazor.
Warning
Markering på klientsidan och metoder som är associerade med en AuthorizeView skyddas endast från visning och körning i det renderade användargränssnittet i klientsideappar 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-app Blazor 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 Auktorisering .
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.
Om du vill hantera det fall där användaren måste uppfylla flera principer samtidigt använder du någon 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 både Roles och Policy anges lyckas auktoriseringen endast när båda villkoren är uppfyllda. Användaren måste alltså tillhöra minst en av de angivna rollerna och uppfylla de krav som definieras av principen.
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 betraktas 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 rollnamn och policynamn ä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 tillåter att autentiseringstillståndet bestäms 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] är tillgängligt i Razor komponenter:
@page "/"
@attribute [Authorize]
You can only see this if you're signed in.
Important
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 anpassar obehörigt innehåll med komponentenRouter, visar 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 idlagrar duvaluesom en sträng eller anger ett tomt strängvärde (string.Empty).
- Om idinte ä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 EMPlyckas 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 attributavsnittet[Authorize].
- 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.
Important
              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. Mer information finns i ASP.NET Core-återgivningslägenBlazor.
<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.
Note
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 efter autentisering med identitetsprovidern.
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.IsAuthenticatedkö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")).Succeededkö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ända- CascadingAuthenticationStateför att tillhandahålla detta.
- nullvärdet tas emot för- authenticationStateTask
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-definitionen 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:
- Name
- Identifieringsnummer
- Platskoordinater
- Online identifierare
- Andra specifika faktorer - Physical
- Physiological
- Genetic
- Mentalt (psykologiskt)
- Economic
- Cultural
- Social identitet
 
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 Microsofts identitetsplattform
- 
              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 Platform
- ASP.NET Kärnsäkerhetsavsnitt
- Konfigurera Windows-autentisering i ASP.NET Core
- IHttpContextAccessor/HttpContext i ASP.NET Core-appar Blazor
- Skapa en anpassad version av JavaScript-biblioteket Authentication.MSAL
- AwesomeBlazor: Exempellänkar för community för autentisering
- ASP.NET Core-autentisering Blazor Hybrid 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 Microsofts identitetsplattform
- 
              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 Platform
- ASP.NET Kärnsäkerhetsavsnitt
- IHttpContextAccessor/HttpContext i ASP.NET Core-appar Blazor
- Konfigurera Windows-autentisering i ASP.NET Core
- Skapa en anpassad version av JavaScript-biblioteket Authentication.MSAL
- AwesomeBlazor: Exempellänkar för community för autentisering
ASP.NET Core