Sdílet prostřednictvím


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:

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í:

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ě:

@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.csCustomAuthenticationService 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