Ověřování a autorizace ASP.NET Core Blazor
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální vydání naleznete v verzi .NET 9 tohoto článku.
Upozornění
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální vydání najdete v verzi .NET 9 tohoto článku.
Důležité
Tyto informace se týkají předběžného vydání produktu, který může být podstatně změněn před komerčním vydáním. Microsoft neposkytuje žádné záruky, výslovné ani předpokládané, týkající se zde uváděných informací.
Pro aktuální vydání si přečtěte verzi tohoto článku pro .NET 9.
Tento článek popisuje podporu konfigurace a správy zabezpečení ASP.NET Core v aplikacích Blazor.
Blazor používá existující mechanismy ověřování ASP.NET Core k vytvoření identity uživatele. Přesný mechanismus závisí na tom, jak Blazor je aplikace hostovaná, na straně serveru nebo na straně klienta.
Scénáře zabezpečení se liší mezi autorizačním kódem spuštěným na straně serveru a klientem v Blazor aplikacích. U autorizačního kódu, který běží na serveru, jsou kontroly autorizace schopné vynutit pravidla přístupu pro oblasti aplikace a komponent. Vzhledem k tomu, že spouštění kódu na straně klienta může být manipulováno, nemůže být autorizační kód spuštěný na klientovi důvěryhodný, aby zcela vynucoval pravidla přístupu nebo kontroloval zobrazení obsahu na straně klienta.
Pokud musí být zaručeno vynucení autorizačního pravidla, neimplementujte kontroly autorizace v kódu na straně klienta. Sestavte Blazor Web App, které se spoléhá pouze na serverové vykreslování (SSR) pro kontrolu autorizace a prosazování pravidel.
Pokud musí být zaručeno vynucení autorizačního pravidla a zabezpečení dat a kódu, nevyvíjejte aplikaci na straně klienta. Vytvořte aplikaci Blazor Server.
Konvence autorizace Razor Pages se nevztahují na směrovatelné komponenty Razor. Pokud je nesměrovatelná komponenta Razorvložena na stránku aplikace Razor Pages, zásady autorizace stránky nepřímo ovlivňují komponentu Razor spolu se zbytkem obsahu stránky.
ASP.NET Core Identity je navržená tak, aby fungovala v kontextu komunikace požadavků a odpovědí HTTP, což obecně není Blazor komunikační model klient-server aplikace. Aplikace ASP.NET Core, které pro správu uživatelů využívají ASP.NET Core Identity, by měly pro uživatelské rozhraní související s Razor, jako je registrace uživatele, přihlášení, odhlášení a další úlohy správy uživatelů, místo komponent Razor využívat Identity Pages. Vytváření Razor komponent, které přímo zpracovávají Identity úlohy, je možné v několika scénářích, ale microsoft je nedoporučuje ani nepodporuje.
Abstrakce ASP.NET Core, jako jsou SignInManager<TUser> a UserManager<TUser>, se v komponentách Razor nepodporují. Další informace o použití ASP.NET Core Identity s Blazor naleznete v tématu Scaffold ASP.NET Core Identity do aplikace na straně serveru Blazor.
Poznámka:
Příklady kódu v tomto článku přijímají referenční typy s možnou hodnotou null (NRT) a statickou analýzu stavu nul kompilátoru .NET, které jsou podporovány v ASP.NET Core od verze .NET 6 nebo novější. Pokud cílíte na ASP.NET Core 5.0 nebo starší, odeberte z příkladů v tomto článku označení typu null (?
).
Zabezpečená údržba citlivých dat a přihlašovacích údajů
Neukládejte tajné kódy aplikací, připojovací řetězec, přihlašovací údaje, hesla, osobní identifikační čísla (PIN), privátní kód .NET/C# nebo privátní klíče/tokeny v kódu na straně klienta, což je vždy nezabezpečené. Kód na straně Blazor klienta by měl přistupovat k zabezpečeným službám a databázím prostřednictvím zabezpečeného webového rozhraní API, které řídíte.
Ve testovacích, přípravných a produkčních prostředích by serverový kód a webová rozhraní API měly používat toky zabezpečeného ověřování, které se vyhýbají uchovávání přihlašovacích údajů v projektovém kódu nebo konfiguračních souborech. Mimo místní testování vývoje doporučujeme vyhnout se použití proměnných prostředí k ukládání citlivých dat, protože proměnné prostředí nejsou nejbezpečnějším přístupem. Pro místní testování vývoje se pro zabezpečení citlivých dat doporučuje nástroj Secret Manager. Další informace naleznete v následujících zdrojích:
- Toky zabezpečeného ověřování (dokumentace k ASP.NET Core)
- Spravované identity pro služby Microsoft Azure (tento článek)
Pro místní vývoj a testování na straně klienta a serveru použijte nástroj Secret Manager k zabezpečení citlivých přihlašovacích údajů.
Spravované identity pro služby Microsoft Azure
Pro služby Microsoft Azure doporučujeme používat spravované identity. Spravované identity se bezpečně ověřují ve službách Azure bez uložení přihlašovacích údajů v kódu aplikace. Další informace naleznete v následujících zdrojích:
- Co jsou spravované identity pro prostředky Azure? (Dokumentace k Microsoft Entra)
- Dokumentace ke službám Azure
Podpora ochrany proti padělání
Šablona Blazor :
- Přidá antiforgery služby automaticky, když AddRazorComponents je volána v
Program
souboru. - Přidá antiforgery middleware voláním UseAntiforgery do kanálu zpracování požadavků v
Program
souboru a vyžaduje ochranu koncového bodu proti padělání, aby se zmírnily hrozby pro padělání požadavků mezi weby (CSRF/XSRF). UseAntiforgery je voláno po UseHttpsRedirection. Volání UseAntiforgery musí být umístěno po voláních do UseAuthentication a UseAuthorization, pokud jsou k dispozici.
Komponenta AntiforgeryToken vykreslí antiforgery token jako skryté pole a tato komponenta se automaticky přidá do instancí formuláře (EditForm). Další informace najdete v přehledu ASP.NET Core Blazor formulářů.
Služba AntiforgeryStateProvider poskytuje přístup k tokenu proti padělání přidruženému k aktuální relaci. Vložte službu a zavolejte její GetAntiforgeryToken() metodu k získání aktuálního AntiforgeryRequestToken. Další informace najdete v tématu Zavolejte webové rozhraní API z aplikace ASP.NET CoreBlazor.
Blazor ukládá tokeny spojené se žádostí do stavu komponenty, což zaručuje, že tokeny proti padělání jsou k dispozici interaktivním komponentám, i když nemají přístup k této žádosti.
Poznámka:
Omezení rizik proti padělání je vyžadováno pouze při odesílání dat formuláře na server kódovaný jako application/x-www-form-urlencoded
, multipart/form-data
nebo text/plain
protože se jedná o jediné platné typy entypů formuláře.
Další informace naleznete v následujících zdrojích:
- Prevence útoků XSRF/CSRF (Cross-Site Request Forgery) v ASP.NET Core: Tento článek je primárním článkem o ASP.NET Core, který se vztahuje na serverovou stranu Blazor Server, projekt Blazor Web Appserveru a Blazor integraci s MVC/Razor Pages.
- Přehled formulářů Blazor ASP.NET Core: Oddíl podpory antiforgery článku se týká podpory antiforgery ve formuláříchBlazor.
Ověřování na straně serveru Blazor
Aplikace na straně Blazor serveru se konfigurují pro zabezpečení stejným způsobem jako aplikace ASP.NET Core. Další informace najdete v článcích věnovaných zabezpečení ASP.NET Core .
Kontext ověřování se naváže pouze při spuštění aplikace, což nastává ve chvíli, kdy se aplikace poprvé připojí k WebSocketu přes SignalR připojení s klientem. Ověřování může být založeno na cookie nebo jiném bearer tokenu, ale ověřování je spravováno prostřednictvím SignalR hubu a zcela v okruhu. Kontext ověřování se udržuje po celou dobu životnosti okruhu. Aplikace pravidelně obnovují stav ověřování uživatele každých 30 minut.
Pokud aplikace musí zachytávat uživatele pro vlastní služby nebo reagovat na aktualizace uživatele, podívejte se na ASP.NET Core server-side a Blazor Web App další scénáře zabezpečení.
Blazor liší se od tradičních webových aplikací vykreslených serverem, které při každé navigaci na stránce vytvoří nové požadavky HTTP s soubory cookie. Během navigačních událostí se kontroluje autentizace. Soubory cookie nejsou zapojeny. Soubory cookie se odesílají jenom při vytváření požadavku HTTP na server, což není to, co se stane, když uživatel přejde v Blazor aplikaci. Během navigace se stav ověřování uživatele kontroluje v okruhu Blazor , který můžete aktualizovat kdykoli na serveru pomocí RevalidatingAuthenticationStateProvider
abstrakce.
Důležité
Nedoporučuje se implementovat vlastní NavigationManager
pro ověřování a validaci při navigaci. Pokud aplikace musí během navigace provádět vlastní logiku autentizačního stavu, použijte vlastní AuthenticationStateProvider
.
Poznámka:
Příklady kódu v tomto článku využívají referenční typy s možnou hodnotou null (NRT) a statickou analýzu stavu nulity kompilátoru .NET, které jsou podporovány v ASP.NET Core v .NET 6 a novějších verzích. Pokud cílíte na ASP.NET Core 5.0 nebo starší, odeberte z příkladů v tomto článku označení typu null (?
).
Integrovaná nebo vlastní AuthenticationStateProvider služba získává data o stavu ověřování z ASP.NET Core HttpContext.User. Takto se stav ověřování integruje se stávajícími mechanismy ověřování ASP.NET Core.
Další informace o ověřování na straně serveru najdete v tématu ASP.NET Základní Blazor ověřování a autorizace.
Sdílený stav
Aplikace na straně Blazor serveru existují v paměti serveru a několik relací aplikací je hostováno ve stejném procesu. Pro každou relaci Blazor aplikace spustí okruh s vlastním oborem kontejneru injektáže závislostí, takže služby s vymezeným oborem jsou jedinečné pro každou Blazor relaci.
Varování
Nedoporučujeme, aby aplikace na stejném serveru sdílely stav pomocí singletonových služeb, pokud není věnována mimořádná péče, protože to může představovat ohrožení zabezpečení, například únik stavu uživatele napříč instancemi.
Stavové singleton služby můžete v Blazor aplikacích používat, pokud jsou speciálně navrženy pro tento účel. Například použití jednoúčelové mezipaměti paměti je přijatelné, protože mezipaměť paměti vyžaduje klíč pro přístup k dané položce. Za předpokladu, že uživatelé nemají kontrolu nad klíči mezipaměti, které se používají s mezipamětí, nedojde k úniku stavu uloženého v mezipaměti mezi okruhy.
Obecné pokyny ke správě stavu najdete v tématu ASP.NET Blazor Základní správa stavu.
Zabezpečení citlivých dat a přihlašovacích údajů na straně serveru
V testovacích a produkčních prostředích by kódy na straně Blazor serveru a webová rozhraní API měly používat zabezpečené ověřovací toky, které se vyhýbají ukládání přihlašovacích údajů v kódu projektu nebo konfiguračních souborech. Mimo místní testování vývoje doporučujeme vyhnout se použití proměnných prostředí k ukládání citlivých dat, protože proměnné prostředí nejsou nejbezpečnějším přístupem. Pro místní testování vývoje se pro zabezpečení citlivých dat doporučuje nástroj Secret Manager. Další informace naleznete v následujících zdrojích:
- Toky zabezpečeného ověřování (dokumentace k ASP.NET Core)
- Spravované identity pro služby Microsoft Azure (Blazor dokumentace)
Pro místní vývoj a testování na straně klienta a serveru použijte nástroj Secret Manager k zabezpečení citlivých přihlašovacích údajů.
Šablona projektu
Vytvořte novou serverovou Blazor aplikaci podle pokynů v nástrojích pro ASP.NET Core Blazor.
Po výběru šablony aplikace na straně serveru a konfiguraci projektu vyberte ověřování aplikace v části Typ ověřování:
- Žádné (výchozí): Žádné ověřování.
- Jednotlivé účty: Uživatelské účty jsou uloženy v aplikaci pomocí ASP.NET Core Identity.
- Žádné (výchozí): Žádné ověřování.
- Jednotlivé účty: Uživatelské účty jsou uloženy v aplikaci pomocí ASP.NET Core Identity.
- Microsoft identity platform: Další informace najdete v tématu ASP.NET Core Blazor ověřování a autorizace.
- Windows: Použijte ověřování systému Windows.
Blazor Identity Uživatelské rozhraní (jednotlivé účty)
Blazorpodporuje generování úplného BlazorIdentity uživatelského rozhraní, když zvolíte možnost ověřování pro jednotlivé účty.
Šablona Blazor Web App tvoří Identity kód pro databázi SQL Serveru. Verze příkazového řádku používá SQLite a obsahuje databázi SQLite pro Identity.
Šablona:
- Podporuje interaktivní vykreslování na straně serveru (interaktivní SSR) a scénáře vykreslování na straně klienta (CSR) s ověřenými uživateli.
- Přidá IdentityRazor komponenty a související logiku pro rutinní úlohy ověřování, jako je přihlášení a odhlášení uživatelů. Komponenty Identity také podporují pokročilé Identity funkce, jako je potvrzení účtu a obnovení hesla a vícefaktorové ověřování pomocí aplikace třetí strany. Všimněte si, že Identity samotné komponenty nepodporují interaktivitu.
- IdentityPřidá související balíčky a závislosti.
- Odkazuje na Identity balíčky v souboru
_Imports.razor
. - Vytvoří vlastní třídu uživatele Identity (
ApplicationUser
). - Vytvoří a zaregistruje EF Core kontext databáze (
ApplicationDbContext
). - Konfiguruje směrování pro předdefinované Identity koncové body.
- Zahrnuje Identity ověřování a obchodní logiku.
Pro kontrolu komponent
Když zvolíte režim interaktivního automatického vykreslování WebAssembly nebo Interactive Auto Render, server zpracuje všechny požadavky na ověřování a autorizaci a Identity komponenty se na serveru Blazor Web Appv hlavním projektu vykreslují staticky.
Architektura poskytuje vlastní AuthenticationStateProvider v projektech serveru a klienta .Client
pro předání stavu ověření uživatele do prohlížeče. Projekt serveru volá AddAuthenticationStateSerialization
, zatímco projekt klienta volá AddAuthenticationStateDeserialization
. Ověřování na serveru namísto klienta umožňuje aplikaci mít přístup ke stavu ověřování během předběžného vykreslování a před inicializací prostředí .NET WebAssembly. Vlastní AuthenticationStateProvider implementace používají službu Persistent Component State Service (PersistentComponentState) k serializaci stavu ověřování do komentářů HTML a pak jej číst zpět z WebAssembly pro vytvoření nové instance AuthenticationState. Další informace najdete v části Správa stavu ověřování.Blazor Web App
Pouze pro řešení interaktivního serveru je (referenční zdroj) serverová strana AuthenticationStateProvider, která revaliduje razítko zabezpečení pro připojeného uživatele každých 30 minut, kdy je připojen interaktivní okruh.
Když zvolíte režim interaktivního automatického vykreslování WebAssembly nebo Interactive Auto Render, server zpracuje všechny požadavky na ověřování a autorizaci a Identity komponenty se na serveru Blazor Web Appv hlavním projektu vykreslují staticky. Šablona projektu obsahuje třídu (referenční zdroj) v .Client
projektu, která synchronizuje stav ověřování uživatele mezi serverem a prohlížečem. Třída je vlastní implementace AuthenticationStateProvider. Zprostředkovatel používá službu Trvalý stav součástí (PersistentComponentState) k předvykreslení stavu ověřování a k jeho zachování na stránce.
V hlavním projektu Blazor Web App je poskytovatel stavu ověřování nazván buď IdentityRevalidatingAuthenticationStateProvider
(referenční zdroj) (pouze řešení pro interaktivitu serveru) nebo PersistingRevalidatingAuthenticationStateProvider
(referenční zdroj) (řešení pro WebAssembly nebo automatickou interaktivitu).
Blazor Identity závisí na DbContext instancích, které nevytvořila továrna, což je záměrné, protože stačí, aby DbContext komponenty šablony Identity projektu vykreslovány staticky bez podpory interaktivity.
Pro podrobnou informaci o tom, jak se globální interaktivní režimy vykreslování aplikují na komponenty jiné než Identity a zároveň vynucují statické SSR pro Identity komponenty, se podívejte na režimy vykreslování v ASP.NET CoreBlazor.
Další informace o trvalém předrenderovaném stavu naleznete v tématu Prerender ASP.NET Core Razor komponenty.
Poznámka:
Odkazy na dokumentaci k referenčnímu zdroji .NET obvykle načítají výchozí větev úložiště, která představuje aktuální vývoj pro příští verzi .NET. Pokud chcete vybrat značku pro konkrétní verzi, použijte rozevírací seznam pro přepnutí větví nebo značek. Další informace najdete v tématu Jak vybrat značku verze zdrojového kódu ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Správa stavu ověřování v Blazor Web Apps
Tato část se týká Blazor Web Appkteré přijímají:
- Jednotlivé účty
- Vykreslování na straně klienta (CSR, interaktivita založená na WebAssembly).
Zprostředkovatel stavu ověřování na straně klienta se používá jenom uvnitř Blazor a není integrovaný se systémem ověřování ASP.NET Core. Během předdefinování respektuje metadata definovaná na stránce a používá ověřovací systém ASP.NET Core k určení, Blazor jestli je uživatel ověřený. Když uživatel přejde z jedné stránky na jinou, použije se zprostředkovatel ověřování na straně klienta. Když uživatel aktualizuje stránku (znovu načíst celou stránku), není zprostředkovatel stavu ověřování na straně klienta zapojen do rozhodnutí o ověření na serveru. Vzhledem k tomu, že stav uživatele není serverem trvalý, dojde ke ztrátě stavu ověřování udržovaného na straně klienta.
Nejlepší způsob řešení je provést ověřování v rámci systému ověřování ASP.NET Core. Poskytovatel autentizačního stavu na straně klienta se pouze stará o zrcadlení uživatelského stavu ověření. Příklady, jak toho dosáhnout použitím zprostředkovatelů stavu ověřování, jsou demonstrovány šablonou Blazor Web App projektu a popsány níže.
V souboru projektu
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization();
Rozhraní API serializuje pouze název na straně serveru a deklarace identity rolí pro přístup v prohlížeči. Pokud chcete zahrnout všechny nároky, nastavte SerializeAllClaims
na true
ve volání AddAuthenticationStateSerialization
na straně serveru:
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization(
options => options.SerializeAllClaims = true);
V souboru projektu klienta (.Client
) volejte AddAuthenticationStateDeserialization
, což přidá AuthenticationStateProvider, kde je AuthenticationState deserializován ze serveru pomocí AuthenticationStateData
a služby pro trvalý stav komponent ()PersistentComponentState. V projektu serveru by mělo být odpovídající volání na AddAuthenticationStateSerialization
.
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
PersistingRevalidatingAuthenticationStateProvider
(referenční zdroj): Pro Blazor Web Appuživatele, kteří přijímají interaktivní vykreslování na straně serveru (interaktivní SSR) a vykreslování na straně klienta (CSR). Jedná se o serverovou stranu AuthenticationStateProvider , která aktualizuje razítko zabezpečení pro připojeného uživatele každých 30 minut, kdy je připojený interaktivní okruh. Používá také službu Trvalého stavu komponenty k přenesení stavu ověřování ke klientovi, který je pak během životnosti CSR neměnný.PersistingServerAuthenticationStateProvider
(referenční zdroj): Pro Blazor Web Appty, které přijímají pouze CSR. Jedná se o serverovou stranu AuthenticationStateProvider, která používá službu Stavu trvalých komponent ke proudění stavu ověření do klienta, což je pak zajištěno po celou dobu životnosti CSR.PersistentAuthenticationStateProvider
(referenční zdroj): Pro Blazor Web Appy, které přijímají CSR. Jedná se o klientaAuthenticationStateProvider, který určuje stav autentizace uživatele hledáním dat uložených ve stránce při jejím vykreslení na serveru. Tento stav ověřování je neměnný po celou dobu životnosti CSR. Pokud se uživatel potřebuje přihlásit nebo odhlásit, je nutné znovu načíst celou stránku. To poskytuje jenom uživatelské jméno a e-mail pro účely zobrazení. Nezahrnuje tokeny k autentizaci na serveru při samostatném zpracování následných požadavků, což se řeší samostatně pomocí cookie zahrnutého vHttpClient
požadavcích na server.
Poznámka:
Odkazy na dokumentaci k referenčnímu zdroji .NET obvykle načítají výchozí větev úložiště, která představuje aktuální vývoj pro příští verzi .NET. Pokud chcete vybrat značku pro konkrétní verzi, použijte rozevírací seznam pro přepnutí větví nebo značek. Další informace najdete v tématu Jak vybrat značku verze zdrojového kódu ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Lešení Identity
Další informace o generování uživatelského rozhraní do aplikace na straně Identity serveru najdete v tématu Generování uživatelského rozhraní BlazorIdentity v projektech ASP.NET Core.
Vytvoření základní struktury Identity do serverové aplikace Blazor.
Další nároky a tokeny od externích poskytovatelů
Pokud chcete ukládat další deklarace identity od externích zprostředkovatelů, přečtěte si téma věnované zachování dalších deklarací identity a tokenů od externích zprostředkovatelů v ASP.NET Core.
Azure App Service v Linuxu s Identity Serverem
Při nasazování do služby Azure App Service v Linuxu s Identity Serverem zadejte vystavitele explicitně. Další informace najdete v tématu Použití Identity k zabezpečení backendu webového rozhraní API pro SPA.
Vložte AuthenticationStateProvider
pro služby s vymezením na komponentu
Nepokoušejte se vyřešit AuthenticationStateProvider v rámci vlastního oboru, protože výsledkem je vytvoření nové instance AuthenticationStateProvider , která není správně inicializována.
Pokud chcete získat přístup k AuthenticationStateProvider v rámci služby omezené na komponentu, vložte do komponenty AuthenticationStateProvider a předejte ji službě jako parametr. Tento přístup zajišťuje, aby se pro každou instanci aplikace uživatele používala správná inicializovaná instance AuthenticationStateProvider .
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.";
}
}
}
Zaregistrujte službu jako vymezenou. V aplikaci na straně Blazor serveru mají služby s vymezeným oborem životnost stejnou dobu trvání okruhu připojení klienta.
V souboru Program
:
builder.Services.AddScoped<ExampleService>();
V Startup.ConfigureServices
z Startup.cs
:
services.AddScoped<ExampleService>();
V následující komponentě InjectAuthStateProvider
:
- Komponenta dědí OwningComponentBase.
- Přípravek AuthenticationStateProvider se aplikuje a předává se
ExampleService.ExampleMethod
. -
ExampleService
je vyřešen pomocí OwningComponentBase.ScopedServices a GetRequiredService, což vrátí správnou inicializovanou instanciExampleService
, která existuje po dobu životnosti okruhu uživatele.
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);
}
}
Pro více informací si přečtěte pokyny na
Neautorizovaný obsah zobrazen během předkreslování s vlastním AuthenticationStateProvider
Abyste se vyhnuli zobrazení neoprávněného obsahu, například obsahu v komponentě
Implementujte IHostEnvironmentAuthenticationStateProvider pro vlastní AuthenticationStateProvider k podpoře předkreslování: Příklad implementace IHostEnvironmentAuthenticationStateProvider naleznete v implementaci architektury BlazorServerAuthenticationStateProvider ve
ServerAuthenticationStateProvider.cs
(referenční zdroj).Poznámka:
Odkazy na dokumentaci k referenčnímu zdroji .NET obvykle načítají výchozí větev úložiště, která představuje aktuální vývoj pro příští verzi .NET. Pokud chcete vybrat značku pro konkrétní verzi, použijte rozevírací seznam pro přepnutí větví nebo značek. Další informace najdete v tématu Jak vybrat značku verze zdrojového kódu ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Zakázání předběžného vykreslování: Indikujte režim vykreslování s parametrem
prerender
nastavenýmfalse
na komponentu nejvyšší úrovně v hierarchii komponent aplikace, která není kořenovou komponentou.Poznámka:
Interaktivní vytvoření kořenové komponenty, například
App
komponenty, není podporováno. Proto není možné předřazování přímo zakázat komponentouApp
.U aplikací založených na šabloně projektu Blazor Web App je prerendering obvykle zakázán, pokud se komponenta
Routes
používá v komponentěApp
(Components/App.razor
):<Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Zakažte také předběžné předkreslování pro komponentu
HeadOutlet
:<HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
Můžete také selektivně řídit režim vykreslování použitý u
Routes
instance komponenty. Jako příklad se podívejte na režimy vykreslováníBlazor ASP.NET Core.
Zakázat předrenderování: Otevřete soubor
_Host.cshtml
a změňte atributrender-mode
pomocníka komponenty Tag Helper na Server:<component type="typeof(App)" render-mode="Server" />
- Před spuštěním aplikace ověřte uživatele na serveru: Pokud chcete tento přístup přijmout, musí aplikace reagovat na počáteční uživatelský požadavek přihlašovací stránkou nebo zobrazením založeným na Identity a zabránit jakýmkoli požadavkům na koncové body Blazor až do jejich ověření. Další informace najdete v tématu Vytvoření aplikace ASP.NET Core s uživatelskými daty chráněnými autorizací. Po ověření se neautorizovaný obsah v předem vyřazovaných Razor komponent zobrazí jenom v případě, že je uživatel skutečně neautorizovaný k zobrazení obsahu.
Správa stavu uživatele
Navzdory tomu, že se v názvu nachází slovo "state," AuthenticationStateProvider není určen pro ukládání obecného stavu uživatele. AuthenticationStateProvider Označuje pouze stav ověřování uživatele do aplikace, jestli je přihlášený k aplikaci a kdo je přihlášený jako.
Ověřování používá stejné ověřování ASP.NET Core Identity jako Razor aplikace Pages a MVC. Uživatelský stav uložený pro ASP.NET Core Identity se přenáší do Blazor bez nutnosti přidání dalšího kódu do aplikace. Postupujte podle pokynů v článcích a kurzech ASP.NET Core Identity, aby se funkce Identity projevily v částech aplikace Blazor.
Pokyny k obecné správě stavu mimo ASP.NET Core Identity, najdete v tématu Správa stavu v ASP.NET CoreBlazor.
Další abstrakce zabezpečení
Správa stavu ověřování se účastní dvou dalších abstrakcí:
ServerAuthenticationStateProvider (referenční zdroj): Rozhraní AuthenticationStateProvider používá Blazor k získání stavu ověřování ze serveru.
RevalidatingServerAuthenticationStateProvider (referenční zdroj): Základní třída pro AuthenticationStateProvider služby používané architekturou Blazor pro příjem stavu ověřování z hostitelského prostředí a jeho opětovné obnovení v pravidelných intervalech.
Výchozí 30minutový interval revalidace je možné upravit v
RevalidatingIdentityAuthenticationStateProvider
(Areas/Identity/RevalidatingIdentityAuthenticationStateProvider.cs
). Následující příklad zkracuje interval na 20 minut:protected override TimeSpan RevalidationInterval => TimeSpan.FromMinutes(20);
Poznámka:
Odkazy na dokumentaci k referenčnímu zdroji .NET obvykle načítají výchozí větev úložiště, která představuje aktuální vývoj pro příští verzi .NET. Pokud chcete vybrat značku pro konkrétní verzi, použijte rozevírací seznam pro přepnutí větví nebo značek. Další informace najdete v tématu Jak vybrat značku verze zdrojového kódu ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Správa stavu ověřování při odhlášení
Na straně Blazor serveru se zachová stav ověřování uživatele po celou dobu životnosti okruhu, včetně na kartách prohlížeče. Pokud chcete proaktivně odhlásit uživatele na kartách prohlížeče, když se uživatel odhlásí na jedné kartě, musíte implementovat RevalidatingServerAuthenticationStateProvider (referenční zdroj) s krátkým RevalidationInterval.
Poznámka:
Odkazy na dokumentaci k referenčnímu zdroji .NET obvykle načítají výchozí větev úložiště, která představuje aktuální vývoj pro příští verzi .NET. Pokud chcete vybrat značku pro konkrétní verzi, použijte rozevírací seznam pro přepnutí větví nebo značek. Další informace najdete v tématu Jak vybrat značku verze zdrojového kódu ASP.NET Core (dotnet/AspNetCore.Docs #26205).
Doba platnosti adresy URL dočasného přesměrování
Tato část se týká Blazor Web Apps.
Pomocí možnosti RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration můžete získat nebo nastavit dobu platnosti ochrany dat ASP.NET Core pro dočasné URL přesměrování generované renderováním na straně Blazor serveru. Používají se jenom přechodně, takže životnost musí být dostatečná, aby klient získal adresu URL a začal na ni navigovat. Měla by však být dostatečně dlouhá, aby umožňovala nerovnoměrnou distribuci hodin mezi servery. Výchozí hodnota je pět minut.
V následujícím příkladu je hodnota prodloužena na sedm minut:
builder.Services.AddRazorComponents(options =>
options.TemporaryRedirectionUrlValidityDuration =
TimeSpan.FromMinutes(7));
Ověřování na straně Blazor klienta
V aplikacích na straně klienta je možné obejít kontroly ověřování na straně Blazor klienta, protože všichni uživatelé můžou upravovat kód na straně klienta. Totéž platí pro všechny technologie aplikací na straně klienta, včetně architektur JavaScript SPA a nativních aplikací pro jakýkoli operační systém.
Přidejte následující:
Referenční informace k
Microsoft.AspNetCore.Components.Authorization
balíčku NuGet.Poznámka:
Pokyny k přidávání balíčků do aplikací .NET najdete v článcích v části Instalace a správa balíčků na webu Pracovní postup používání balíčků (dokumentace k NuGetu). Ověřte správné verze balíčků na NuGet.org.
Nastavení oboru názvů Microsoft.AspNetCore.Components.Authorization pro soubor
_Imports.razor
aplikace.
Pokud chcete zpracovat ověřování, použijte integrovanou nebo vlastní AuthenticationStateProvider službu.
Další informace o ověřování na straně klienta naleznete v tématu Zabezpečení ASP.NET Core Blazor WebAssembly.
Zabezpečte data v Blazor Web Apps pomocí interaktivního automatického vykreslování.
Když Blazor Web App přijme vykreslování na straně serveru (SSR) a vykreslování na straně klienta (CSR) pro komponenty nebo celou aplikaci, která určuje interaktivní režim automatického vykreslování, autorizace pro přístup k komponentám a datům se použije v dvou místech. Komponenta při vykreslení na serveru omezuje přístup k sobě samé (a ke všem datům, která získává) na základě autorizačního atributu v definičním souboru komponenty (@attribute [Authorize]
). Při vykreslení komponenty na klientovi je přístup k datům omezen prostřednictvím koncových bodů webového rozhraní API serveru, které jsou volány z klienta. Při zabezpečení přístupu k datům v obou umístěních je potřeba věnovat pozornost, aby se zabránilo nesprávnému přístupu k datům.
Představte si následující scénář, ve kterém komponenta zobrazuje zabezpečená data o počasí. Následující příklad můžete prozkoumat a demonstrovat v běžící ukázkové aplikaci pomocí vzorku BlazorWebAppEntra
(.NET 9 nebo novější) nebo vzorku BlazorWebAppOidc
(.NET 8 nebo novější) v GitHub úložišti vzorků Blazor (dotnet/blazor-samples
) (jak stáhnout).
Projekt klienta udržuje třídu WeatherForecast
, která uchovává data o počasí:
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);
}
Rozhraní klientského projektu IWeatherForecaster
definuje metodu GetWeatherForecastAsync
pro získání dat o počasí:
public interface IWeatherForecaster
{
Task<IEnumerable<WeatherForecast>> GetWeatherForecastAsync();
}
Služba ClientWeatherForecaster
projektu klienta implementuje IWeatherForecaster
. Metoda GetWeatherForecastAsync
volá webové rozhraní API v serverovém projektu na koncovém bodě /weather-forecast
pro data o počasí.
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!");
}
Klientský projekt udržuje Weather
komponentu, která:
- Vynucuje autorizaci pomocí atributu
[Authorize]
. - Používá trvalou službu stavu komponent (PersistentComponentState) k zachování dat předpovědi počasí, když komponenta přejde ze statického na interaktivní SSR na serveru.
@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()
{
persistingSubscription = ApplicationState.RegisterOnPersisting(PersistData);
if (!ApplicationState.TryTakeFromJson<IEnumerable<WeatherForecast>>(
nameof(forecasts), out var restoredData))
{
forecasts = await WeatherForecaster.GetWeatherForecastAsync();
}
else
{
forecasts = restoredData!;
}
}
private Task PersistData()
{
ApplicationState.PersistAsJson(nameof(forecasts), forecasts);
return Task.CompletedTask;
}
void IDisposable.Dispose() => persistingSubscription.Dispose();
}
Serverový projekt implementuje IWeatherForecaster
jako ServerWeatherForecaster
, což generuje a vrací simulovaná data o počasí prostřednictvím metody GetWeatherForecastAsync
.
public 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();
}
}
Serverový projekt udržuje zabezpečený koncový bod webového rozhraní API pro volání dat o počasí klienta:
app.MapGet("/weather-forecast", (
[FromServices] IWeatherForecaster WeatherForecaster) =>
{
return WeatherForecaster.GetWeatherForecastAsync();
}).RequireAuthorization();
Při použití předchozího přístupu existují dva systémy, které uživatelům poskytují zabezpečená data o počasí:
- Když se komponenta
Weather
vykresluje na serveru, metodaGetWeatherForecastAsync
službyServerWeatherForecaster
se používá přímo k získání dat o počasí. Zabezpečení dat je vynuceno atributem[Authorize]
komponenty. Stručně řečeno, komponenta vynucuje zabezpečení dat o počasí. - Při vykreslení komponenty
Weather
na klientuse službaClientWeatherForecaster
používá k volání webového rozhraní API na zabezpečený koncový bod/weather-forecast
, který aplikuje metodu rozšíření RequireAuthorization. Pokud má uživatel oprávnění pro přístup k datům o počasí, koncový bod používá službuServerWeatherForecaster
k voláníGetWeatherForecastAsync
. Data se vrátí klientovi. Stručně řečeno, zabezpečení dat o počasí vynucuje koncový bod webového rozhraní API serverové aplikace.
Předchozí přístup funguje dobře, když požadavky na zabezpečení webového rozhraní API odpovídají požadavkům na zabezpečení komponenty. Stejné zásady autorizace se dají použít například pro koncový bod webového rozhraní API i pro komponentu.
Složité scénáře vyžadují další plánování a implementaci. Například serverové webové rozhraní API, které má více volajících s různými přístupovými oprávněními, vyžaduje sofistikovanější zásady autorizace, jednu nebo více dalších zásad nebo další koncové body s různými požadavky na přístup.
Při sestavování zabezpečení aplikací, které přijímají interaktivní automatické vykreslování, mějte na paměti, že zabezpečení implementované pro koncové body webového rozhraní API serveru nezabezpečí implementaci služby serveru, která se používá při vykreslení komponenty na serveru a přistupuje k datům prostřednictvím služby. Pečlivě zvažte rozdíl mezi přístupem k datům na serveru během SSR a přístupem k datům v požadavku klientského webového rozhraní API během csr. Strategicky použijte zabezpečení, abyste se vyhnuli nesprávnému přístupu k datům.
Příklady v ukázkovém úložišti GitHub Blazor (dotnet/blazor-samples
), jak stáhnout (), které demonstrují přístup popsaný v této části:
BlazorWebAppOidc
BlazorWebAppOidcBff
BlazorWebAppEntra
Služba AuthenticationStateProvider
AuthenticationStateProvider je základní služba používaná komponentou AuthorizeView a kaskádovými ověřovacími službami k získání stavu ověřování pro uživatele.
AuthenticationStateProvider je základní služba používaná komponentou AuthorizeView a CascadingAuthenticationState komponentou k získání stavu ověřování uživatele.
AuthenticationStateProvider se obvykle nepoužívá přímo. Použijte komponentu AuthorizeView
nebo přístupy Task<AuthenticationState>
popsané dále v tomto článku. Hlavní nevýhodou použití AuthenticationStateProvider přímo je to, že komponenta není automaticky upozorněna, pokud se změní podkladová data stavu ověřování.
Informace o implementaci vlastního AuthenticationStateProvider najdete v části ASP.NET Core Blazor ověřování stavu, která obsahuje pokyny k implementaci oznámení o změnách stavu ověřování uživatelů.
Získání údajů o nárocích uživatele
Služba AuthenticationStateProvider může poskytnout data aktuálního uživatele ClaimsPrincipal , jak je znázorněno v následujícím příkladu.
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.";
}
}
}
V předchozím příkladu:
-
ClaimsPrincipal.Claims vrací uživatelské nároky (
claims
) pro zobrazení v uživatelském rozhraní. - Řádek, který získá příjmení uživatele (
surname
), volá ClaimsPrincipal.FindAll s predikátem pro filtrování uživatelských nároků.
@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.";
}
}
}
Pokud user.Identity.IsAuthenticated
je true
a uživatel je ClaimsPrincipal, je možné vyčíslit nároky a vyhodnotit členství v rolích.
Další informace o injektáži závislostí (DI) a službách najdete v tématech Injektáž závislostí ASP.NET Core Blazor a Injektáž závislostí v ASP.NET Core. Informace o tom, jak implementovat vlastní AuthenticationStateProvider, najdete v tématu stav ověřování v ASP.NET CoreBlazor.
Zveřejnění stavu ověřování jako kaskádového parametru
Pokud se pro procedurální logiku, například při provádění akce aktivované uživatelem, vyžadují data o stavu ověřování definováním kaskádového parametru typu Task<
AuthenticationState>
, jak ukazuje následující příklad.
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.";
}
}
}
}
Lze vyčíslit nároky a vyhodnotit členství v rolích, pokud user.Identity.IsAuthenticated
je true
.
Nastavte kaskádový parametr Task<
AuthenticationState>
pomocí kaskádových ověřovacích stavových služeb AuthorizeRouteView.
Když vytvoříte Blazor aplikaci z jedné ze Blazor projektových šablon s povoleným ověřováním, aplikace zahrnuje AuthorizeRouteView a volání AddCascadingAuthenticationState, jak je ukázáno v následujícím příkladu. Klientská Blazor aplikace obsahuje i požadované registrace služeb. Další informace jsou uvedeny v části Přizpůsobení neoprávněného obsahu pomocí komponenty Router
.
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
Program
V souboru zaregistrujte kaskádové stavové služby ověřování:
builder.Services.AddCascadingAuthenticationState();
Nastavte kaskádový parametr
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace obsahuje komponenty AuthorizeRouteView a CascadingAuthenticationState, uvedené v následujícím příkladu. Klientská aplikace Blazor obsahuje také požadované registrace služeb. Dodatečné informace jsou uvedeny v části Přizpůsobení neoprávněného obsahu pomocí komponenty Router
.
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Poznámka:
S vydáním ASP.NET Core 5.0.1 a pro všechny další verze 5.x komponenta Router
zahrnuje parametr PreferExactMatches
nastavený na @true
. Další informace najdete v tématu Migrace z ASP.NET Core 3.1 na verzi 5.0.
V aplikaci na straně Blazor klienta přidejte do Program
souboru autorizační služby:
builder.Services.AddAuthorizationCore();
V aplikaci na straně Blazor klienta přidejte do Program
souboru možnosti a autorizační služby:
builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();
V aplikaci na straně Blazor serveru už existují služby pro možnosti a autorizaci, takže nejsou potřeba žádné další kroky.
Autorizace
Po ověření uživatele se pravidla autorizace používají k řízení toho, co může uživatel dělat.
Přístup je obvykle udělen nebo odepřen na základě toho, jestli:
- Uživatel je ověřený (přihlášený).
- Uživatel je v roli.
- Uživatel má nárok.
- Zásada je splněná.
Všechny tyto koncepty jsou stejné jako v aplikaci ASP.NET Core MVC nebo Razor Pages. Další informace o zabezpečení ASP.NET Core najdete v článcích Zabezpečení ASP.NET Core a ASP.NET Core Identity.
AuthorizeView
součást
Komponenta AuthorizeView selektivně zobrazuje obsah uživatelského rozhraní v závislosti na tom, jestli je uživatel autorizovaný. Tento přístup je užitečný jenom v případě, že potřebujete zobrazit data pro uživatele a nemusíte používat identitu uživatele v procedurální logice.
Komponenta zveřejňuje proměnnou context
typu AuthenticationState (@context
v Razor syntaxi), kterou můžete použít pro přístup k informacím o přihlášeném uživateli:
<AuthorizeView>
<p>Hello, @context.User.Identity?.Name!</p>
</AuthorizeView>
Můžete také zadat jiný obsah pro zobrazení, pokud uživatel nemá autorizaci pomocí kombinace Authorized parametrů a NotAuthorized parametrů:
<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() { ... }
}
Přestože komponenta AuthorizeView řídí viditelnost prvků na základě stavu autorizace uživatele, nevynucuje zabezpečení u samotné obslužné rutiny události. V předchozím příkladu HandleClick
je metoda přidružena pouze k tlačítku viditelnému autorizovaným uživatelům, ale nic nebrání vyvolání této metody z jiných míst. Pokud chcete zajistit zabezpečení na úrovni metody, implementujte do samotné obslužné rutiny nebo v příslušném rozhraní API další autorizační logiku.
Razor součásti Blazor Web App nikdy nezobrazují obsah <NotAuthorized>
, pokud autorizace selže na straně serveru během statického serverového vykreslování (statické SSR). Na serverové straně ASP.NET Core kanál zpracovává autorizaci na serveru. Ke zpracování neautorizovaných požadavků použijte techniky na straně serveru. Další informace najdete v tématu režimy vykreslování v ASP.NET CoreBlazor.
Varování
Značky a metody na straně klienta přidružené k objektu AuthorizeView jsou chráněny pouze před zobrazením a spouštěním v vykreslovaných uživatelských rozhraních v aplikacích na straně Blazor klienta. K ochraně autorizovaného obsahu a zabezpečených metod na straně Blazorklienta je obsah obvykle poskytován zabezpečeným, autorizovaným voláním webového rozhraní API na serverové rozhraní API a nikdy se neukládá v aplikaci. Další informace najdete v tématu Volejte webové API z aplikace ASP.NET CoreBlazor a další bezpečnostní scénáře pro ASP.NET CoreBlazor WebAssembly.
Obsah Authorized a NotAuthorized může obsahovat libovolné položky, například jiné interaktivní komponenty.
Podmínky autorizace, jako jsou role nebo zásady, které řídí možnosti uživatelského rozhraní nebo přístup, jsou popsané v části Autorizace.
Pokud nejsou zadané podmínky autorizace, AuthorizeView použije se výchozí zásada:
- Ověření (přihlášení) uživatelé mají oprávnění.
- Neověření (odhlášení) uživatelé nejsou oprávněni.
Komponentu AuthorizeView lze použít v komponentě NavMenu
(Shared/NavMenu.razor
) k zobrazení komponenty NavLink
(NavLink), ale nezapomeňte, že tento přístup odebere položku seznamu jenom z vykresleného výstupu. Nezabrání uživateli v přechodu na tuto komponentu. Implementujte autorizaci samostatně v cílové komponentě.
Autorizace na základě rolí a zásad
Komponenta AuthorizeView podporuje autorizaci založenou na rolích nebo na zásadách.
Pro autorizaci na základě role použijte Roles parametr. V následujícím příkladu musí mít uživatel deklaraci role pro Admin
nebo Superuser
.
<AuthorizeView Roles="Admin, Superuser">
<p>You have an 'Admin' or 'Superuser' role claim.</p>
</AuthorizeView>
Pokud chcete, aby měl uživatel nároky na roli Admin
a Superuser
, vnořte komponenty AuthorizeView:
<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>
Předchozí kód vytvoří Context
pro vnitřní komponentu AuthorizeView, aby se zabránilo kolizi kontextu AuthenticationState. K AuthenticationState kontextu se přistupuje na vnější straně AuthorizeView pomocí standardního přístupu pro přístup k kontextu (@context.User
). K kontextu se přistupuje ve vnitřní části AuthorizeView s pojmenovaným innerContext
kontextem (@innerContext.User
).
Další informace, včetně doprovodných materiálů ke konfiguraci, najdete v tématu Autorizace na základě rolí v ASP.NET Core.
Pro autorizaci na základě zásad použijte Policy parametr s jedním názvem zásady:
<AuthorizeView Policy="Over21">
<p>You satisfy the 'Over21' policy.</p>
</AuthorizeView>
Pokud chcete vyřešit případ, kdy by měl uživatel splňovat jednu z několika zásad, vytvořte zásadu, která potvrzuje, že uživatel splňuje jiné zásady.
Pokud chcete vyřešit případ, kdy uživatel musí současně splňovat několik zásad, použijte jeden z následujících přístupů:
Vytvořte zásadu, AuthorizeView která potvrzuje, že uživatel splňuje několik dalších zásad.
Vnořte zásady do několika AuthorizeView komponent.
<AuthorizeView Policy="Over21"> <AuthorizeView Policy="LivesInCalifornia"> <p>You satisfy the 'Over21' and 'LivesInCalifornia' policies.</p> </AuthorizeView> </AuthorizeView>
Speciálním případem autorizace na základě zásad je autorizace na základě nároků. Můžete například definovat zásadu, která vyžaduje, aby uživatelé měli určitou deklaraci identity. Další informace najdete v tématu Autorizace na základě zásad v ASP.NET Core.
Pokud není zadán ani Roles ani Policy, AuthorizeView použije výchozí zásadu.
- Ověření (přihlášení) uživatelé mají oprávnění.
- Neověření (odhlášení) uživatelé jsou neoprávnění.
Vzhledem k tomu, že porovnávání řetězců v .NET rozlišuje malá a velká písmena, rozlišují se také odpovídající názvy rolí a zásad. Například Admin
(ve velkých písmenechA
) není považována za stejnou roli jako admin
(v malých písmenecha
).
Pascal case se obvykle používá pro názvy rolí a politik (například BillingAdministrator
), ale použití Pascal case není striktním požadavkem. Jsou povolena různá schémata, jako jsou velbloudí případ, případ kebabu a hadí případ. Použití mezer v názvech rolí a zásad je neobvyklé, ale v rámci je povolené. Jedná se například billing administrator
o neobvyklý formát názvu role nebo zásady v aplikacích .NET, ale jde o platnou roli nebo název zásady.
Obsah zobrazený během asynchronního ověřování
Blazor umožňuje asynchronně určit stav ověřování. Primární scénář pro tento přístup je v aplikacích na straně Blazor klienta, které požadují externí koncový bod pro ověřování.
Během ověřování se AuthorizeView nezobrazuje žádný obsah. Pokud chcete zobrazit obsah při ověřování, přiřaďte obsah k parametru 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>
Tento přístup se obvykle nevztahuje na aplikace na straně Blazor serveru. Serverové Blazor aplikace znají stav ověřování, jakmile je tento stav vytvořen. Authorizing obsah lze poskytnout v komponentě AuthorizeView aplikace, ale obsah se nikdy nezobrazí.
Atribut [Authorize]
Atribut [Authorize]
je k dispozici v Razor komponentách:
@page "/"
@attribute [Authorize]
You can only see this if you're signed in.
Důležité
Používejte [Authorize]
pouze na @page
komponenty dosažené přes Blazor směrovač. Autorizace se provádí pouze jako aspekt směrování a neprovádí se pro podřízené komponenty vykreslené na stránce. Pokud chcete autorizovat zobrazení konkrétních částí na stránce, použijte místo toho AuthorizeView.
Atribut [Authorize]
také podporuje autorizaci založenou na rolích nebo na zásadách. Pro autorizaci na základě role použijte parametr Roles:
@page "/"
@attribute [Authorize(Roles = "Admin, Superuser")]
<p>You can only see this if you're in the 'Admin' or 'Superuser' role.</p>
Pro autorizaci na základě zásad použijte parametr Policy:
@page "/"
@attribute [Authorize(Policy = "Over21")]
<p>You can only see this if you satisfy the 'Over21' policy.</p>
Pokud nezadáte ani Roles, ani Policy, [Authorize]
použije výchozí zásadu.
- Ověření (přihlášení) uživatelé mají oprávnění.
- Nepřihlášení uživatelé nejsou oprávněni k přístupu.
Pokud uživatel nemá autorizaci a pokud aplikace neautorizovaný obsah s Router
komponentou nepřizpůsobí, architektura automaticky zobrazí následující záložní zprávu:
Not authorized.
Autorizace prostředků
Chcete-li autorizovat uživatele k prostředkům, předejte údaje o směrování požadavku do parametru Resource v rámci AuthorizeRouteView.
Router.Found V obsahu požadované trasy:
<AuthorizeRouteView Resource="routeData" RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
Další informace o tom, jak se údaje o stavu autorizace předávají a využívají v procedurální logice, najdete v části Zveřejnění stavu ověřování jako kaskádového parametru.
Když AuthorizeRouteView obdrží data směrování pro prostředek, zásady autorizace mají přístup ke komponentám RouteData.PageType a RouteData.RouteValues, které umožňují použití vlastní logiky pro rozhodování o autorizaci.
V následujícím příkladu se v EditUser
vytvoří politika AuthorizationOptions pro konfiguraci autorizační služby aplikace (AddAuthorizationCore) s následující logikou:
- Určete, zda existuje směrovací hodnota s klíčem
id
. Pokud klíč existuje, hodnota trasy je uložená vvalue
. - V proměnné s názvem
id
uložtevalue
jako řetězec nebo nastavte prázdnou hodnotu řetězce (string.Empty
). - Pokud
id
není prázdný řetězec, ověřte, že tato zásada je splněná (vrátítrue
), pokud hodnota řetězce má na začátkuEMP
. V opačném případě ověřte, že tato zásada selže (vrátífalse
).
V souboru Program
:
Přidejte obory názvů pro Microsoft.AspNetCore.Components a System.Linq:
using Microsoft.AspNetCore.Components; using System.Linq;
Přidejte zásady:
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; }) );
Předchozí příklad je přehnaně zjednodušená zásada autorizace, která slouží pouze k demonstraci tohoto konceptu na funkčním příkladu. Další informace o vytváření a konfiguraci zásad autorizace najdete v tématu Autorizace na základě zásad v ASP.NET Core.
V následující komponentě EditUser
má prostředek v /users/{id}/edit
parametr trasy pro identifikátor uživatele ({id}
). Tento komponent využívá předchozí zásady autorizace EditUser
k určení, zda hodnota trasy id
začíná EMP
. Pokud id
má na začátku EMP
, zásada je splněná a přístup ke komponentě je autorizovaný. Pokud id
začíná jinou hodnotou než EMP
nebo pokud id
je prázdný řetězec, zásada selže a komponenta se nenačte.
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; }
}
Přizpůsobte neoprávněný obsah pomocí komponenty Router
Komponenta Router ve spojení s komponentou AuthorizeRouteView umožňuje aplikaci určit vlastní obsah, pokud:
- Uživatel nesplní podmínku
[Authorize]
aplikovanou na komponentu. Zobrazuje se značka elementu<NotAuthorized>
. Atribut[Authorize]
je popsaný v části věnované atributům[Authorize]
. - Probíhá asynchronní autorizace, což obvykle znamená, že probíhá proces ověřování uživatele. Zobrazuje se značka elementu
<Authorizing>
.
Důležité
Blazor Funkce směrovače, které zobrazují <NotAuthorized>
a <NotFound>
obsah, nejsou funkční při vykreslování na straně statického serveru (static SSR), protože zpracování požadavků zcela probíhá prostřednictvím kanálu middlewaru ASP.NET Core a Razor komponenty se nevykreslují vůbec pro neautorizované nebo chybné požadavky. Použití technik na straně serveru ke zpracování neoprávněných a chybných požadavků během statického serveru SSR. Další informace najdete v tématu
<Router ...>
<Found ...>
<AuthorizeRouteView ...>
<NotAuthorized>
...
</NotAuthorized>
<Authorizing>
...
</Authorizing>
</AuthorizeRouteView>
</Found>
</Router>
Obsah Authorized a NotAuthorized může obsahovat libovolné položky, například jiné interaktivní komponenty.
Poznámka:
Předchozí postup vyžaduje kaskádovou registraci stavových služeb ověřování v souboru aplikace Program
:
builder.Services.AddCascadingAuthenticationState();
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView ...>
<NotAuthorized>
...
</NotAuthorized>
<Authorizing>
...
</Authorizing>
</AuthorizeRouteView>
</Found>
</Router>
</CascadingAuthenticationState>
NotFoundObsah souboru , Authorizeda NotAuthorized může obsahovat libovolné položky, například jiné interaktivní komponenty.
V případě, že obsah NotAuthorized není uveden, AuthorizeRouteView použije následující záložní zprávu.
Not authorized.
Aplikace vytvořená ze Blazor WebAssembly šablony projektu s povoleným ověřováním zahrnuje komponentu RedirectToLogin
, která je umístěna v <NotAuthorized>
obsahu Router komponenty. Pokud uživatel není ověřený (context.User.Identity?.IsAuthenticated != true
), RedirectToLogin
komponenta přesměruje prohlížeč na authentication/login
koncový bod pro ověření. Po ověření u zprostředkovatele identity se uživatel vrátí na požadovanou adresu URL.
Procedurální logika
Pokud je aplikace nutná ke kontrole autorizačních pravidel v rámci procedurální logiky, použijte kaskádový parametr typu Task<
AuthenticationState>
k získání ClaimsPrincipal uživatele.
Task<
AuthenticationState
>
lze kombinovat s dalšími službami, jako je IAuthorizationService
, k vyhodnocení zásad.
V následujícím příkladu:
- Spustí
user.Identity.IsAuthenticated
kód pro ověřené uživatele (přihlášené). - Spustí
user.IsInRole("admin")
kód pro uživatele s rolí Správce. - Služba
(await AuthorizationService.AuthorizeAsync(user, "content-editor")).Succeeded
provádí kód pro uživatele, kteří splňují zásady "editora obsahu".
Serverová Blazor aplikace obsahuje příslušné obory názvů vytvořené ze šablony projektu. V aplikaci na straně klienta Blazor ověřte přítomnost oborů názvů Microsoft.AspNetCore.Authorization a Microsoft.AspNetCore.Components.Authorization buď v komponentě, nebo v souboru aplikace _Imports.razor
.
@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)
{
// ...
}
}
}
}
}
Řešení chyb
Běžné chyby:
Autorizace vyžaduje kaskádový parametr typu
Task<AuthenticationState>
. Zvažte použitíCascadingAuthenticationState
k jeho zajištění.Hodnota
null
je přijata proauthenticationStateTask
Je pravděpodobné, že projekt nebyl vytvořen pomocí šablony na straně Blazor serveru s povoleným ověřováním.
V .NET 7 nebo starších verzích rozhraní obtočte <CascadingAuthenticationState>
kolem části stromu uživatelského rozhraní, například kolem Blazor směrovače:
<CascadingAuthenticationState>
<Router ...>
...
</Router>
</CascadingAuthenticationState>
V .NET 8 nebo novějších nepoužívejte komponentu CascadingAuthenticationState :
- <CascadingAuthenticationState>
<Router ...>
...
</Router>
- </CascadingAuthenticationState>
Místo toho do kolekce služby v Program
souboru přidejte kaskádové stavové služby ověřování:
builder.Services.AddCascadingAuthenticationState();
Komponenta CascadingAuthenticationState (.NET 7 nebo starší) nebo služby poskytované AddCascadingAuthenticationState (.NET 8 nebo novější) dodávají kaskádový parametr Task<
AuthenticationState>
, který je přijímán ze služby pro injektování závislostí AuthenticationStateProvider.
Identifikovatelné osobní údaje (PII)
Microsoft používá definici GDPR pro "osobní údaje" (GDPR 4.1), když dokumentace popisuje identifikovatelné osobní údaje (PII).
PII odkazuje na všechny informace týkající se identifikované nebo identifikovatelné fyzické osoby. Identifikovatelná fyzická osoba je osoba, která může být identifikována přímo nebo nepřímo, s některou z následujících možností:
- Název
- Identifikační číslo
- Souřadnice umístění
- Online identifikátor
- Další specifické faktory
- Fyzické
- Fyziologický
- Genetický
- Duševní (psychická)
- Hospodářský
- Kulturní
- Sociální identita
Další materiály
- Serverové prostředky a Blazor Web App prostředky
- Rychlý start: Přidání přihlašování účtem Microsoft do webové aplikace ASP.NET Core
- Rychlý start : Ochrana webového rozhraní API ASP.NET Core pomocí platformy Microsoft Identity Platform
-
Konfigurace ASP.NET Core pro práci s proxy servery a nástroji pro vyrovnávání zatížení: Obsahuje pokyny k:
- Použití middlewaru Forwarded Headers k zachování informací o schématu HTTPS napříč proxy servery a interními sítěmi
- Další scénáře a případy použití, včetně manuální konfigurace schématu, změn cesty požadavku pro správné směrování požadavků a předávání schématu požadavků pro Linuxové a jiné než IIS reverzní proxy servery.
- Dokumentace k platformě Microsoft Identity Platform
- Témata zabezpečení ASP.NET Core
- Konfigurace ověřování Windows v ASP.NET Core
- IHttpContextAccessor/HttpContext v aplikacích ASP.NET Core Blazor
- Sestavení vlastní verze knihovny Authentication.MSAL JavaScript
- Awesome Blazor: Odkazy na komunitní ukázky pro ověřování
- Ověřování a autorizace ASP.NET Core Blazor Hybrid
- Prostředky na straně Blazor serveru
- Rychlý start: Přidání přihlašování účtem Microsoft do webové aplikace ASP.NET Core
- Rychlý start : Ochrana webového rozhraní API ASP.NET Core pomocí platformy Microsoft Identity Platform
-
Konfigurace ASP.NET Core pro práci s proxy servery a nástroji pro vyrovnávání zatížení: Obsahuje pokyny k:
- Použití middlewaru Forwarded Headers k zachování informací o schématu HTTPS napříč proxy servery a interními sítěmi
- Další scénáře a případy použití, včetně ruční konfigurace schématu, změn cesty požadavku pro správné směrování a předávání schématu požadavků pro linuxové a ne-IIS reverzní proxy servery.
- Dokumentace k platformě Microsoft Identity Platform
- Témata zabezpečení ASP.NET Core
- IHttpContextAccessor/HttpContext v aplikacích ASP.NET Core Blazor
- Konfigurace ověřování Windows v ASP.NET Core
- Sestavení vlastní verze knihovny Authentication.MSAL JavaScript
- Awesome Blazor: Odkazy na komunitní ukázky pro ověřování