Zabezpečení aplikací na straně Blazor serveru ASP.NET Core
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v tématu .NET a .NET Core Zásady podpory. Aktuální verzi najdete ve verzi .NET 8 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í.
Aktuální verzi najdete ve verzi .NET 8 tohoto článku.
Tento článek vysvětluje, jak zabezpečit aplikace na straně Blazor serveru jako aplikace ASP.NET Core.
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ž je, když se aplikace poprvé připojí k webSocketu. 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í zaznamenávat uživatele pro vlastní služby nebo reagovat na aktualizace uživatele, přečtěte si téma Serverové ASP.NET Další Blazor 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 událostí navigace se kontroluje ověřování. Soubory cookie se ale nezajímají. 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í opětovného AuthenticationStateProvider
ověření ](#additional-authentication-state-providers).
Důležité
Implementace vlastního NavigationManager
ověřování pro ověření během navigace se nedoporučuje. Pokud aplikace musí během navigace spouštět vlastní logiku stavu ověřování, použijte vlastní AuthenticationStateProvider
.
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 null-stav kompilátoru .NET, které jsou podporovány v ASP.NET Core v .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í citlivých dat a přihlašovacích údajů na straně serveru
V testovacích a pracovních a produkčních prostředích by kód na straně Blazor serveru a webová rozhraní API měly používat toky zabezpečeného ověřování, které se vyhýbají údržbě 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.
- Platforma Microsoftuidentity: Další informace najdete v tématu ASP.NET Ověřování a autorizace coreBlazor.
- Windows: Použijte ověřování systému Windows.
BlazorIdentity 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.
Vygeneruje Blazor Web App kód šablony Identity 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.
Pokud chcete zkontrolovat Blazor komponenty architekturyIdentity, přejděte k nim ve Pages
Shared
složkách Account
složky v Blazor Web App šabloně projektu (referenční zdroj).
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 projekt v projektech serveru i klienta.Client
pro tok stavu ověřování uživatele do prohlížeče. Volání projektu AddAuthenticationStateSerializationserveru , zatímco klient projekt volání AddAuthenticationStateDeserialization. Ověřování na serveru místo klienta umožňuje aplikaci přístup ke stavu ověřování během předkončování a před inicializováním modulu runtime .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 ji číst zpět z WebAssembly k vytvoření nové AuthenticationState instance. Další informace najdete v části Správa stavu ověřování.Blazor Web App
Pouze pro řešení interaktivního serveru (referenční zdroj) je serverová stranaAuthenticationStateProvider, IdentityRevalidatingAuthenticationStateProvider
která aktualizuje razítko zabezpečení pro připojeného uživatele každých 30 minut, 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 PersistentAuthenticationStateProvider
třídu (zdroj odkazu) 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 Stavu trvalých součástí (PersistentComponentState) k předběžnému vysunout stav ověřování a zachovat ji na stránce.
V hlavním projektu Blazor Web Appzprostředkovatele stavu ověřování má názevIdentityRevalidatingAuthenticationStateProvider
(pouze referenční zdroj) (pouze řešení pro interaktivitu serveru) nebo PersistingRevalidatingAuthenticationStateProvider
(referenční zdroj) (WebAssembly nebo řešení automatické interaktivity).
BlazorIdentity 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.
Popis toho, jak se režimy globálního interaktivního vykreslování použijí u jinýchIdentity než komponent a současně vynucují statické SSR pro Identity komponenty, najdete v tématu ASP.NET režimy vykreslování jádraBlazor.
Další informace o trvalém předrenderovaného stavu naleznete v tématu Prerender ASP.NET Základní 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 Apptoho, co přijímá:
- 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. Zprostředkovatel stavu ověřování na straně klienta se postará jenom o to, aby odrážel stav ověřování uživatele. Příklady, jak toho dosáhnout pomocí zprostředkovatelů stavu ověřování, jsou demonstrovány šablonou Blazor Web App projektu a popsány níže.
V souboru projektu Program
serveru volání AddAuthenticationStateSerialization, který serializuje AuthenticationState vrácené server-side AuthenticationStateProvider pomocí trvalé stavová služba komponent (PersistentComponentState):
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 deklarace identity, nastavte SerializeAllClaims
na true
volání AddAuthenticationStateSerializationna straně serveru:
builder.Services.AddRazorComponents()
.AddInteractiveWebAssemblyComponents()
.AddAuthenticationStateSerialization(
options => options.SerializeAllClaims = true);
V souboru projektu klienta (.Client
) volání AddAuthenticationStateDeserialization, který přidá místo AuthenticationState AuthenticationStateProvider, kde je deserializován ze serveru pomocí AuthenticationStateData
a trvalý stav komponenty (PersistentComponentState).Program
V projektu serveru by mělo existovat odpovídající volání 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ý stav komponenty k toku stavu ověřování do klienta, což je pak opraveno po dobu životnosti CSR.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 k toku stavu ověřování do klienta, což je pak opraveno po celou dobu životnosti CSR.PersistentAuthenticationStateProvider
(referenční zdroj): Pro Blazor Web Appty, které přijímají CSR. Jedná se o klientskou stranu AuthenticationStateProvider , která určuje stav ověřování uživatele vyhledáním dat uložených na stránce při vykreslení na serveru. Tento stav ověřování je opravený 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, které se ověřují na serveru při provádění následných požadavků, které se zpracovávají samostatně pomocí cookieHttpClient
požadavků 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).
Generování uživatelského rozhraní pro Identity
Další informace o generování uživatelského rozhraní do aplikace na straně Blazor serveru najdete v tématu Generování uživatelského rozhraní Identity Identity v projektech ASP.NET Core.
Generování uživatelského rozhraní Identity do aplikace na straně Blazor serveru:
Další deklarace identity a tokeny od externích zprostředkovatelů
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í back-endu webového rozhraní API pro služby SPA.
Vložení AuthenticationStateProvider
služeb 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 komponentě v rámci služby, zadejte AuthenticationStateProvider @inject
direktivu [Inject]
nebo atribut 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>();
In Startup.ConfigureServices
of Startup.cs
:
services.AddScoped<ExampleService>();
V následující komponentě InjectAuthStateProvider
:
- Komponenta dědí OwningComponentBase.
- Přípravek AuthenticationStateProvider se vloží a předá
ExampleService.ExampleMethod
. ExampleService
je vyřešen s OwningComponentBase.ScopedServices a GetRequiredService, který 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);
}
}
Další informace najdete v pokynech k injektáži závislostí jádra ASP.NET Blazor .OwningComponentBase
Neautorizováno zobrazení obsahu při předkreslování vlastního obsahu AuthenticationStateProvider
Abyste se vyhnuli zobrazení neoprávněného obsahu, například obsahu v komponentěAuthorizeView
, při předvádění vlastními AuthenticationStateProvider
přístupy použijte jeden z následujících přístupů:
Implementujte IHostEnvironmentAuthenticationStateProvider pro vlastní AuthenticationStateProvider podporu předkreslování: Příklad implementace IHostEnvironmentAuthenticationStateProviderarchitektury Blazor ServerAuthenticationStateProvider v
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 Blazor Web App na šabloně projektu 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. Podívejte se například na režimy vykreslování ASP.NET CoreBlazor.
Zakázat předrendering: Otevřete
_Host.cshtml
soubor a změňterender-mode
atribut pomocné rutiny značky komponenty naServer:<component type="typeof(App)" render-mode="Server" />
- Před zahájením aplikace ověřte uživatele na serveru: Pokud chcete tento přístup přijmout, musí aplikace reagovat na počáteční požadavek uživatele pomocí přihlašovací stránky nebo zobrazení založeného Identityna přihlašovací stránce nebo zobrazení a zabránit všem požadavkům na Blazor koncové body, dokud se neověří. 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 slovu "state" v názvu AuthenticationStateProvider není ukládání stavu obecného 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. Stav uživatele uložený pro toky ASP.NET Core Identity bez Blazor přidání dalšího kódu do aplikace. Postupujte podle pokynů v článcích ASP.NET Core Identity a kurzech, Identity které se projeví v Blazor částech aplikace.
Pokyny k obecné správě stavu mimo ASP.NET Core Identitynajdete v tématu ASP.NET Správa stavu jádraBlazor.
Další zprostředkovatelé stavu ověřování
Dvě další třídy odvozené z AuthenticationStateProvider nápovědy ke správě stavu ověřování na serveru:
ServerAuthenticationStateProvider (referenční zdroj): Výchozí hodnota AuthenticationStateProvider používaná architekturou Blazor ke správě stavu ověřování na serveru, pokud není zaregistrovanější zprostředkovatel.
RevalidatingServerAuthenticationStateProvider (referenční zdroj): Základní třída pro AuthenticationStateProvider služby, které přijímají stav ověřování z hostitelského prostředí a v pravidelných intervalech ho znovu obnovují. Blazor Web App Ukázkovou implementaci najdete v šabloně projektu. Přepsat RevalidationInterval tak, aby se změnil výchozí 30minutový interval opětovného obnovení.
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 dočasné adresy URL přesměrování
Tato část se týká Blazor Web Apps.
RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Pomocí možnosti získat nebo nastavit dobu platnosti ASP.NET základní ochrany dat pro dočasné adresy URL přesměrování generované vykreslováním Blazor na straně 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));
Další materiály
- 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
- 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í požadavků a předávání schématu požadavků pro linuxové proxy servery a proxy servery a jiné než IIS.