Udostępnij za pośrednictwem


stan uwierzytelniania podstawowego Blazor ASP.NET

Uwaga

Nie jest to najnowsza wersja tego artykułu. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.

Ostrzeżenie

Ta wersja ASP.NET Core nie jest już obsługiwana. Aby uzyskać więcej informacji, zobacz zasady pomocy technicznej platformy .NET i platformy .NET Core. Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.

Ważne

Te informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany, zanim zostanie wydany komercyjnie. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.

Aby zapoznać się z bieżącą wersją, zobacz wersję tego artykułu platformy .NET 9.

W tym artykule wyjaśniono, jak utworzyć niestandardowego dostawcę stanu uwierzytelniania i otrzymywać powiadomienia o zmianie stanu uwierzytelniania użytkownika w kodzie.

Ogólne podejścia podejmowane w przypadku aplikacji po stronie serwera i po stronie klienta są podobne, ale różnią się dokładnymi implementacjami, więc ten artykuł jest przestawiany między aplikacjami po stronie Blazor serwera i aplikacjami po Blazor stronie Blazor klienta. Użyj selektora przestawnego w górnej części artykułu, aby zmienić element przestawny artykułu w taki sposób, aby był zgodny z typem Blazor projektu, z którym pracujesz:

  • Aplikacje po stronie Blazor serwera (Server pivot): Blazor Server dla platformy .NET 7 lub starszej oraz projektu serwera dla Blazor Web App platformy .NET 8 lub nowszej.
  • Aplikacje po stronie Blazor klienta (Blazor WebAssembly pivot): Blazor WebAssembly dla wszystkich wersji platformy .NET lub .Client projektu programu dla platformy .NET 8 lub nowszej Blazor Web App .

Klasa abstrakcyjna AuthenticationStateProvider

Struktura Blazor zawiera abstrakcyjną AuthenticationStateProvider klasę, która udostępnia informacje o stanie uwierzytelniania bieżącego użytkownika z następującymi elementami członkowskimi:

Implementowanie niestandardowego dostawcy AuthenticationStateProvider

Aplikacja musi odwoływać się do Microsoft.AspNetCore.Components.Authorization pakietu NuGet, który zapewnia obsługę uwierzytelniania i autoryzacji dla Blazor aplikacji.

Uwaga

Aby uzyskać instrukcje dodawania pakietów do aplikacji .NET, zobacz artykuły w sekcji Instalowanie pakietów i zarządzanie nimi w temacie Przepływ pracy użycia pakietów (dokumentacja programu NuGet). Sprawdź prawidłowe wersje pakietów pod adresem NuGet.org.

Skonfiguruj następujące usługi uwierzytelniania, autoryzacji i kaskadowego stanu uwierzytelniania w Program pliku.

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja jest wstępnie skonfigurowana przy użyciu następujących rejestracji usługi, która obejmuje uwidacznianie stanu uwierzytelniania jako parametr kaskadowy. Aby uzyskać więcej informacji, zobacz ASP.NET Core authentication and authorization with additional information (Uwierzytelnianie i autoryzacja rdzeniaBlazor) z dodatkowymi informacjami przedstawionymi w sekcji Dostosowywanie nieautoryzowanej zawartości w sekcji składnikówRouter.

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddAuthorization();
builder.Services.AddCascadingAuthenticationState();

Skonfiguruj usługi uwierzytelniania i autoryzacji w Program pliku.

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja obejmuje następującą rejestrację usługi.

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddAuthorization();

Skonfiguruj usługi uwierzytelniania i autoryzacji w Startup.ConfigureServices programie Startup.cs.

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja obejmuje następującą rejestrację usługi.

using Microsoft.AspNetCore.Components.Authorization;

...

services.AddAuthorization();

W Blazor WebAssembly aplikacjach (wszystkich wersjach platformy .NET) lub .Client w projekcie Blazor Web App programu (.NET 8 lub nowszym) skonfiguruj uwierzytelnianie, autoryzację i kaskadowe usługi stanu uwierzytelniania w Program pliku.

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja jest wstępnie skonfigurowana przy użyciu następujących rejestracji usługi, która obejmuje uwidacznianie stanu uwierzytelniania jako parametr kaskadowy. Aby uzyskać więcej informacji, zobacz ASP.NET Core authentication and authorization with additional information (Uwierzytelnianie i autoryzacja rdzeniaBlazor) z dodatkowymi informacjami przedstawionymi w sekcji Dostosowywanie nieautoryzowanej zawartości w sekcji składnikówRouter.

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();

Skonfiguruj usługi uwierzytelniania i autoryzacji w Program pliku.

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja obejmuje następującą rejestrację usługi.

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddAuthorizationCore();

Podklasa AuthenticationStateProvider i przesłonięcia GetAuthenticationStateAsync w celu utworzenia stanu uwierzytelniania użytkownika. W poniższym przykładzie wszyscy użytkownicy są uwierzytelniani przy użyciu nazwy użytkownika 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));
    }
}

Uwaga

Powyższy kod, który tworzy nowe ClaimsIdentity , używa uproszczonej inicjalizacji kolekcji wprowadzonej w języku C# 12 (.NET 8). Aby uzyskać więcej informacji, zobacz Collection expressions — C# language reference (Wyrażenia kolekcji — dokumentacja języka C#).

Usługa CustomAuthStateProvider jest zarejestrowana Program w pliku. Zarejestruj usługę o określonym zakresie za pomocą polecenia AddScoped:

builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

W aplikacji zarejestruj usługę Blazor Server o AddScoped określonym zakresie po wywołaniu metody :AddServerSideBlazor

builder.Services.AddServerSideBlazor();

builder.Services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

W aplikacji zarejestruj usługę Blazor Server o AddScoped określonym zakresie po wywołaniu metody :AddServerSideBlazor

services.AddServerSideBlazor();

services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Usługa CustomAuthStateProvider jest zarejestrowana Program w pliku. Zarejestruj pojedynczą usługę przy użyciu polecenia AddSingleton:

builder.Services.AddSingleton<AuthenticationStateProvider, CustomAuthStateProvider>();

Jeśli nie istnieje, dodaj instrukcję @using do _Imports.razor pliku, aby udostępnić Microsoft.AspNetCore.Components.Authorization przestrzeń nazw między składnikami:

@using Microsoft.AspNetCore.Components.Authorization;

Potwierdź lub zmień składnik widoku trasy na element AuthorizeRouteView w Router definicji składnika. Lokalizacja Router składnika różni się w zależności od typu aplikacji. Użyj wyszukiwania, aby zlokalizować składnik, jeśli nie znasz jego lokalizacji w projekcie.

<Router ...>
    <Found ...>
        <AuthorizeRouteView RouteData="routeData" 
            DefaultLayout="typeof(Layout.MainLayout)" />
        ...
    </Found>
</Router>

Uwaga

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja zawiera AuthorizeRouteView składnik. Aby uzyskać więcej informacji, zobacz ASP.NET Core authentication and authorization with additional information (Uwierzytelnianie i autoryzacja rdzeniaBlazor) z dodatkowymi informacjami przedstawionymi w sekcji Dostosowywanie nieautoryzowanej zawartości w sekcji składnikówRouter.

Router Gdzie znajduje się składnik:

Lokalizacja Router składnika różni się w zależności od typu aplikacji. Użyj wyszukiwania, aby zlokalizować składnik, jeśli nie znasz jego lokalizacji w projekcie.

<CascadingAuthenticationState>
    <Router ...>
        <Found ...>
            <AuthorizeRouteView RouteData="routeData" 
                DefaultLayout="typeof(MainLayout)" />
            ...
        </Found>
    </Router>
</CascadingAuthenticationState>

Uwaga

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja zawiera AuthorizeRouteView składniki i CascadingAuthenticationState . Aby uzyskać więcej informacji, zobacz ASP.NET Core authentication and authorization with additional information (Uwierzytelnianie i autoryzacja rdzeniaBlazor) z dodatkowymi informacjami przedstawionymi w sekcji Dostosowywanie nieautoryzowanej zawartości w sekcji składnikówRouter.

Poniższy przykładowy AuthorizeView składnik demonstruje nazwę uwierzytelnioowanego użytkownika:

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

Aby uzyskać wskazówki dotyczące korzystania z programu AuthorizeView, zobacz ASP.NET Core authentication and authorization (Uwierzytelnianie i autoryzacja podstawowe ASP.NET CoreBlazor).

Powiadomienia o zmianie stanu uwierzytelniania

W klasie bazowej można wywołać metodę niestandardową AuthenticationStateProvider AuthenticationStateProvider, aby powiadomić użytkowników o zmianie stanu uwierzytelniania na rerender.NotifyAuthenticationStateChanged

Poniższy przykład jest oparty na implementacji niestandardowej AuthenticationStateProvider , postępując zgodnie ze wskazówkami w sekcji Implementowanie niestandardowej AuthenticationStateProvider wcześniej w tym artykule. Jeśli już wykonano wskazówki opisane w tej sekcji, poniższa część zastępuje element CustomAuthStateProvider pokazany w sekcji .

Poniższa CustomAuthStateProvider implementacja uwidacznia niestandardową metodę , AuthenticateUserw celu zalogowania użytkownika i powiadamiania użytkowników o zmianie stanu uwierzytelniania.

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)));
    }
}

Uwaga

Powyższy kod, który tworzy nowe ClaimsIdentity , używa uproszczonej inicjalizacji kolekcji wprowadzonej w języku C# 12 (.NET 8). Aby uzyskać więcej informacji, zobacz Collection expressions — C# language reference (Wyrażenia kolekcji — dokumentacja języka C#).

W składniku:

  • Wstrzykiwanie AuthenticationStateProvider.
  • Dodaj pole do przechowywania identyfikatora użytkownika.
  • Dodaj przycisk i metodę, aby rzutować AuthenticationStateProvider element na CustomAuthStateProvider element i wywołać AuthenticateUser element za pomocą identyfikatora użytkownika.
@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);
    }
}

Powyższe podejście można ulepszyć w celu wyzwolenia powiadomień o zmianach stanu uwierzytelniania za pośrednictwem usługi niestandardowej. Poniższa CustomAuthenticationService klasa obsługuje podmiot zabezpieczeń oświadczeń bieżącego użytkownika w polu kopii zapasowej (currentUser) ze zdarzeniem (UserChanged), do którego dostawca stanu uwierzytelniania może subskrybować, gdzie zdarzenie wywołuje NotifyAuthenticationStateChanged. W dalszej części tej sekcji CustomAuthenticationService można wstawić dodatkową konfigurację do składnika z logiką ustawiającą CurrentUser element w celu wyzwolenia UserChanged zdarzenia.

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 W pliku zarejestruj CustomAuthenticationService element w kontenerze wstrzykiwania zależności:

builder.Services.AddScoped<CustomAuthenticationService>();

W Startup.ConfigureServices pliku Startup.cszarejestruj element CustomAuthenticationService w kontenerze wstrzykiwania zależności:

services.AddScoped<CustomAuthenticationService>();

Program W pliku zarejestruj CustomAuthenticationService element w kontenerze wstrzykiwania zależności:

builder.Services.AddSingleton<CustomAuthenticationService>();

Poniżej CustomAuthStateProvider subskrybuje CustomAuthenticationService.UserChanged zdarzenie. Metoda GetAuthenticationStateAsync zwraca stan uwierzytelniania użytkownika. Początkowo stan uwierzytelniania jest oparty na wartości CustomAuthenticationService.CurrentUser. Gdy użytkownik zmieni się, zostanie utworzony nowy stan uwierzytelniania dla nowego użytkownika (new AuthenticationState(newUser)) dla wywołań metody 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 następującego składnika SignIn tworzy podmiot zabezpieczeń oświadczeń dla identyfikatora użytkownika, który ma być ustawiony 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;
    }
}

Uwaga

Powyższy kod, który tworzy nowe ClaimsIdentity , używa uproszczonej inicjalizacji kolekcji wprowadzonej w języku C# 12 (.NET 8). Aby uzyskać więcej informacji, zobacz Collection expressions — C# language reference (Wyrażenia kolekcji — dokumentacja języka C#).

Dodatkowe zasoby