stav ověřování ASP.NET Core Blazor
Poznámka:
Toto není nejnovější verze tohoto článku. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
Upozorňující
Tato verze ASP.NET Core se už nepodporuje. Další informace najdete v zásadách podpory .NET a .NET Core. Aktuální verzi najdete v tomto článku ve verzi .NET 9.
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 v tomto článku ve verzi .NET 9.
Tento článek vysvětluje, jak vytvořit vlastního zprostředkovatele stavu ověřování a přijímat oznámení o změnách stavu ověření uživatele v kódu.
Obecné přístupy pro serverové a klientské Blazor aplikace jsou podobné, ale liší se v jejich přesných implementacích, takže tento článek se liší mezi aplikacemi na straně Blazor serveru a aplikacemi na straně Blazor klienta. Pomocí selektoru kontingenční tabulky v horní části článku můžete změnit kontingenční tabulku tak, aby odpovídala Blazor typu projektu, se kterým pracujete:
- Serverové Blazor aplikace (Server pivot): Blazor Server pro .NET 7 nebo starší a serverový projekt Blazor Web App pro .NET 8 nebo novější.
- Blazor Klientské aplikace (Blazor WebAssemblypivot): Blazor WebAssembly pro všechny verze .NET nebo
.Client
projekt Blazor Web App rozhraní .NET 8 nebo novější.
Abstraktní AuthenticationStateProvider
třída
Architektura Blazor obsahuje abstraktní AuthenticationStateProvider třídu, která poskytuje informace o stavu ověřování aktuálního uživatele s následujícími členy:
- GetAuthenticationStateAsync: Asynchronně získá stav ověřování aktuálního uživatele.
- AuthenticationStateChanged: Událost, která poskytuje oznámení při změně stavu ověřování. Tato událost může být vyvolána například v případě, že se uživatel přihlásí nebo z aplikace odhlásí.
- NotifyAuthenticationStateChanged: Vyvolá událost změny stavu ověřování.
Implementace vlastní třídy AuthenticationStateProvider
Aplikace musí odkazovat na Microsoft.AspNetCore.Components.Authorization
balíček NuGet, který poskytuje podporu ověřování a autorizace pro Blazor aplikace.
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.
V souboru nakonfigurujte následující služby ověřování, autorizace a kaskádové stavové služby Program
ověřování.
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace je předem nakonfigurovaná s následujícími registracemi služeb, které zahrnují zveřejnění stavu ověřování jako kaskádový parametr. Další informace najdete v tématu ASP.NET Ověřování a autorizace jádra Blazor s dalšími informacemi získáte v části Přizpůsobení neoprávněného Router
obsahu v části Komponenta.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();
Nakonfigurujte v souboru ověřovací a autorizační služby Program
.
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace zahrnuje následující registraci služby.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorization();
Konfigurace ověřovacích a autorizačních služeb v Startup.ConfigureServices
systému Startup.cs
.
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace zahrnuje následující registraci služby.
using Microsoft.AspNetCore.Components.Authorization;
...
services.AddAuthorization();
V Blazor WebAssembly aplikacích (všechny verze .NET) nebo .Client
projektu Blazor Web App (.NET 8 nebo novější) nakonfigurujte ověřování, autorizaci a kaskádové stavové služby ověřování v Program
souboru.
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace je předem nakonfigurovaná s následujícími registracemi služeb, které zahrnují zveřejnění stavu ověřování jako kaskádový parametr. Další informace najdete v tématu ASP.NET Ověřování a autorizace jádra Blazor s dalšími informacemi získáte v části Přizpůsobení neoprávněného Router
obsahu v části Komponenta.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
Nakonfigurujte v souboru ověřovací a autorizační služby Program
.
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace zahrnuje následující registraci služby.
using Microsoft.AspNetCore.Components.Authorization;
...
builder.Services.AddAuthorizationCore();
Podtřídy AuthenticationStateProvider a přepsání GetAuthenticationStateAsync pro vytvoření stavu ověřování uživatele V následujícím příkladu jsou všichni uživatelé ověřeni pomocí uživatelského jména mrfibuli
.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, "mrfibuli"),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
}
Poznámka:
Předchozí kód, který vytvoří nový ClaimsIdentity , používá zjednodušenou inicializaci kolekce zavedenou v jazyce C# 12 (.NET 8). Další informace naleznete v tématu Výrazy kolekce – referenční dokumentace jazyka C#.
Služba CustomAuthStateProvider
je zaregistrovaná Program
v souboru. Zaregistrujte službu s vymezeným oborem AddScoped:
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Blazor Server V aplikaci zaregistrujte službu vymezenou AddScopedpo volání:AddServerSideBlazor
builder.Services.AddServerSideBlazor();
builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Blazor Server V aplikaci zaregistrujte službu vymezenou AddScopedpo volání:AddServerSideBlazor
services.AddServerSideBlazor();
services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();
Služba CustomAuthStateProvider
je zaregistrovaná Program
v souboru. Zaregistrujte službu singleton pomocí AddSingleton:
builder.Services.AddSingleton<AuthenticationStateProvider, CustomAuthStateProvider>();
Pokud není k dispozici, přidejte @using
do _Imports.razor
souboru příkaz, který zpřístupní Microsoft.AspNetCore.Components.Authorization obor názvů napříč komponentami:
@using Microsoft.AspNetCore.Components.Authorization;
Potvrďte nebo změňte komponentu zobrazení trasy na AuthorizeRouteView součást v Router definici komponenty. Umístění Router
komponenty se liší v závislosti na typu aplikace. Pomocí vyhledávání vyhledejte komponentu, pokud nevíte o jeho umístění v projektu.
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(Layout.MainLayout)" />
...
</Found>
</Router>
Poznámka:
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, zahrne tato aplikace komponentu AuthorizeRouteView . Další informace najdete v tématu ASP.NET Ověřování a autorizace jádra Blazor s dalšími informacemi získáte v části Přizpůsobení neoprávněného Router
obsahu v části Komponenta.
Kde se komponenta Router nachází:
- Potvrďte nebo změňte komponentu zobrazení trasy na AuthorizeRouteViewpoložku .
- Potvrďte nebo přidejte komponentu CascadingAuthenticationState Router kolem komponenty.
Umístění Router
komponenty se liší v závislosti na typu aplikace. Pomocí vyhledávání vyhledejte komponentu, pokud nevíte o jeho umístění v projektu.
<CascadingAuthenticationState>
<Router ...>
<Found ...>
<AuthorizeRouteView RouteData="routeData"
DefaultLayout="typeof(MainLayout)" />
...
</Found>
</Router>
</CascadingAuthenticationState>
Poznámka:
Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace obsahuje tyto AuthorizeRouteView součásti a CascadingAuthenticationState součásti. Další informace najdete v tématu ASP.NET Ověřování a autorizace jádra Blazor s dalšími informacemi získáte v části Přizpůsobení neoprávněného Router
obsahu v části Komponenta.
Následující ukázková AuthorizeView komponenta ukazuje jméno ověřeného uživatele:
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
Pokyny k použití AuthorizeViewnajdete v tématu ASP.NET Ověřování a autorizace coreBlazor.
Oznámení o změnách stavu ověřování
Vlastní může AuthenticationStateProvider
vyvolat NotifyAuthenticationStateChanged základní AuthenticationStateProvider třídu, která uživatele upozorní na změnu stavu ověřování, aby bylo možné znovu enderovat.
Následující příklad vychází z implementace vlastního AuthenticationStateProvider příkazu podle pokynů v části Implementace vlastní AuthenticationStateProvider
části výše v tomto článku. Pokud jste už postupovali podle pokynů v této části, nahradí se v této části následující CustomAuthStateProvider
příklad.
Následující CustomAuthStateProvider
implementace zveřejňuje vlastní metodu , AuthenticateUser
, přihlásit se uživatele a upozornit uživatele na změnu stavu ověřování.
CustomAuthStateProvider.cs
:
using System.Security.Claims;
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
public override Task<AuthenticationState> GetAuthenticationStateAsync()
{
var identity = new ClaimsIdentity();
var user = new ClaimsPrincipal(identity);
return Task.FromResult(new AuthenticationState(user));
}
public void AuthenticateUser(string userIdentifier)
{
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, userIdentifier),
], "Custom Authentication");
var user = new ClaimsPrincipal(identity);
NotifyAuthenticationStateChanged(
Task.FromResult(new AuthenticationState(user)));
}
}
Poznámka:
Předchozí kód, který vytvoří nový ClaimsIdentity , používá zjednodušenou inicializaci kolekce zavedenou v jazyce C# 12 (.NET 8). Další informace naleznete v tématu Výrazy kolekce – referenční dokumentace jazyka C#.
V komponentě:
- Vložit AuthenticationStateProvider.
- Přidejte pole pro uložení identifikátoru uživatele.
- Přidejte tlačítko a metodu pro přetypování AuthenticationStateProvider a
CustomAuthStateProvider
voláníAuthenticateUser
pomocí identifikátoru uživatele.
@inject AuthenticationStateProvider AuthenticationStateProvider
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
((CustomAuthStateProvider)AuthenticationStateProvider)
.AuthenticateUser(userIdentifier);
}
}
Předchozí přístup lze rozšířit tak, aby aktivoval oznámení o změnách stavu ověřování prostřednictvím vlastní služby. Následující CustomAuthenticationService
třída udržuje objekt deklarací identity aktuálního uživatele v záložním poli (currentUser
) s událostí (UserChanged
), kterou může poskytovatel stavu ověřování přihlásit k odběru, kde událost vyvolá NotifyAuthenticationStateChanged. S další konfigurací dále v této části CustomAuthenticationService
se dá vložit do komponenty s logikou, která nastaví CurrentUser
aktivaci UserChanged
události.
CustomAuthenticationService.cs
:
using System.Security.Claims;
public class CustomAuthenticationService
{
public event Action<ClaimsPrincipal>? UserChanged;
private ClaimsPrincipal? currentUser;
public ClaimsPrincipal CurrentUser
{
get { return currentUser ?? new(); }
set
{
currentUser = value;
if (UserChanged is not null)
{
UserChanged(currentUser);
}
}
}
}
Program
V souboru zaregistrujte CustomAuthenticationService
kontejner injektáž závislostí:
builder.Services.AddScoped<CustomAuthenticationService>();
V Startup.ConfigureServices
kontejneru Startup.cs
CustomAuthenticationService
injektáže závislostí zaregistrujte:
services.AddScoped<CustomAuthenticationService>();
Program
V souboru zaregistrujte CustomAuthenticationService
kontejner injektáž závislostí:
builder.Services.AddSingleton<CustomAuthenticationService>();
Následující CustomAuthStateProvider
přihlášení k odběru CustomAuthenticationService.UserChanged
události. Metoda GetAuthenticationStateAsync
vrátí stav ověřování uživatele. Stav ověřování je zpočátku založen na hodnotě CustomAuthenticationService.CurrentUser
. Když se uživatel změní, vytvoří se nový stav ověřování pro nového uživatele (new AuthenticationState(newUser)
) pro volání na GetAuthenticationStateAsync
:
using Microsoft.AspNetCore.Components.Authorization;
public class CustomAuthStateProvider : AuthenticationStateProvider
{
private AuthenticationState authenticationState;
public CustomAuthStateProvider(CustomAuthenticationService service)
{
authenticationState = new AuthenticationState(service.CurrentUser);
service.UserChanged += (newUser) =>
{
authenticationState = new AuthenticationState(newUser);
NotifyAuthenticationStateChanged(Task.FromResult(authenticationState));
};
}
public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
Task.FromResult(authenticationState);
}
Metoda následující komponenty SignIn
vytvoří objekt deklarací identity pro identifikátor uživatele, který se nastaví na CustomAuthenticationService.CurrentUser
:
@using System.Security.Claims
@inject CustomAuthenticationService AuthService
<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>
<AuthorizeView>
<Authorized>
<p>Hello, @context.User.Identity?.Name!</p>
</Authorized>
<NotAuthorized>
<p>You're not authorized.</p>
</NotAuthorized>
</AuthorizeView>
@code {
public string userIdentifier = string.Empty;
private void SignIn()
{
var currentUser = AuthService.CurrentUser;
var identity = new ClaimsIdentity(
[
new Claim(ClaimTypes.Name, userIdentifier),
],
"Custom Authentication");
var newUser = new ClaimsPrincipal(identity);
AuthService.CurrentUser = newUser;
}
}
Poznámka:
Předchozí kód, který vytvoří nový ClaimsIdentity , používá zjednodušenou inicializaci kolekce zavedenou v jazyce C# 12 (.NET 8). Další informace naleznete v tématu Výrazy kolekce – referenční dokumentace jazyka C#.
Další materiály
- Zobrazení neautorizovaného obsahu na straně serveru při předkreslování vlastního obsahu
AuthenticationStateProvider
- Jak získat přístup k
AuthenticationStateProvider
nastaveníDelegatingHandler
pomocíIHttpClientFactory
- Zabezpečení ASP.NET Core Blazor Web App pomocí OpenID Connect (OIDC)
- Zabezpečení ASP.NET Core Blazor WebAssembly s využitím ASP.NET Core Identity
- Zobrazení neautorizovaného obsahu na straně serveru při předkreslování vlastního obsahu
AuthenticationStateProvider
- Jak získat přístup k
AuthenticationStateProvider
nastaveníDelegatingHandler
pomocíIHttpClientFactory
- Zabezpečení ASP.NET Core Blazor Web App pomocí OpenID Connect (OIDC)
- Zabezpečení ASP.NET Core Blazor WebAssembly s prerenderingem ASP.NET Core Identitys ověřováním v hostovaných Blazor WebAssembly aplikacích