Udostępnij za pośrednictwem


Zabezpieczanie aplikacji po stronie Blazor serwera ASP.NET Core

Uwaga

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

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ą, zapoznaj się z wersją tego artykułu platformy .NET 8.

W tym artykule wyjaśniono, jak zabezpieczyć aplikacje po stronie Blazor serwera jako aplikacje ASP.NET Core.

Aplikacje po stronie Blazor serwera są konfigurowane pod kątem zabezpieczeń w taki sam sposób jak aplikacje ASP.NET Core. Aby uzyskać więcej informacji, zobacz artykuły w tematach dotyczących zabezpieczeń platformy ASP.NET Core.

Kontekst uwierzytelniania jest ustanawiany tylko po uruchomieniu aplikacji, czyli wtedy, gdy aplikacja najpierw nawiązuje połączenie z protokołem WebSocket. Kontekst uwierzytelniania jest utrzymywany przez cały okres istnienia obwodu. Aplikacje okresowo ponownie weryfikują stan uwierzytelniania użytkownika, obecnie co 30 minut.

Jeśli aplikacja musi przechwytywać użytkowników dla usług niestandardowych lub reagować na aktualizacje użytkownika, zobacz Scenariusze zabezpieczeń po stronie serwera ASP.NET CoreBlazor.

Blazor różni się od tradycyjnych aplikacji internetowych renderowanych na serwerze, które tworzą nowe żądania HTTP z cookies na każdej nawigacji strony. Uwierzytelnianie jest sprawdzane podczas zdarzeń nawigacji. Jednak cookienie są zaangażowane. Cookies są wysyłane tylko podczas wysyłania żądania HTTP do serwera, co nie jest wykonywane po przejściu Blazor użytkownika w aplikacji. Podczas nawigacji stan uwierzytelniania użytkownika jest sprawdzany w obwodzie Blazor , który można aktualizować w dowolnym momencie na serwerze przy użyciu RevalidatingAuthenticationStateProvider abstrakcji.

Ważne

Implementowanie niestandardowego NavigationManager elementu w celu uzyskania weryfikacji uwierzytelniania podczas nawigacji nie jest zalecane. Jeśli aplikacja musi wykonywać niestandardową logikę stanu uwierzytelniania podczas nawigacji, użyj niestandardowego AuthenticationStateProviderelementu .

Uwaga

Przykłady kodu w tym artykule przyjmują typy odwołań dopuszczających wartość null (NRTs) i statyczną analizę stanu null kompilatora platformy .NET, które są obsługiwane w programie ASP.NET Core na platformie .NET 6 lub nowszym. W przypadku określania wartości docelowej ASP.NET Core 5.0 lub starszej usuń oznaczenie typu null (?) z przykładów w tym artykule.

Szablon projektu

Utwórz nową aplikację po stronie Blazor serwera, postępując zgodnie ze wskazówkami w temacie Tooling for ASP.NET Core Blazor.

Po wybraniu szablonu aplikacji po stronie serwera i skonfigurowaniu projektu wybierz uwierzytelnianie aplikacji w obszarze Typ uwierzytelniania:

  • Brak (wartość domyślna): brak uwierzytelniania.
  • Indywidualne konta: konta użytkowników są przechowywane w aplikacji przy użyciu ASP.NET Core Identity.

BlazorIdentity Interfejs użytkownika (indywidualne konta)

Blazorprogram obsługuje generowanie pełnego BlazorIdentity interfejsu użytkownika podczas wybierania opcji uwierzytelniania dla indywidualnych kont.

Kod Blazor szkieletu Identity szablonu aplikacji internetowej dla bazy danych programu SQL Server. Wersja wiersza polecenia domyślnie używa biblioteki SQLite i zawiera bazę danych SQLite dla programu Identity.

Szablon obsługuje następujące elementy:

  • Dodaje IdentityRazor składniki i powiązaną logikę dla rutynowych zadań uwierzytelniania, takich jak logowanie użytkowników i ich out.
  • IdentityDodaje powiązane pakiety i zależności.
  • Odwołuje się do Identity pakietów w pliku _Imports.razor.
  • Tworzy niestandardową klasę użytkownika Identity (ApplicationUser).
  • Tworzy i rejestruje EF Core kontekst bazy danych (ApplicationDbContext).
  • Konfiguruje routing dla wbudowanych Identity punktów końcowych.
  • Obejmuje Identity walidację i logikę biznesową.

Aby sprawdzić Blazor składniki platformyIdentity, uzyskaj dostęp do nich w Pages folderachAccounti Shared w szablonie Blazor projektu aplikacji internetowej (źródle odwołania).

Po wybraniu trybów renderowania Interactive WebAssembly lub Interactive Auto serwer obsługuje wszystkie żądania uwierzytelniania i autoryzacji, a Identity składniki są renderowane statycznie na serwerze w Blazor głównym projekcie aplikacji internetowej. Szablon projektu zawiera klasę PersistentAuthenticationStateProvider (źródło odwołania) w .Client projekcie w celu zsynchronizowania stanu uwierzytelniania użytkownika między serwerem a przeglądarką. Klasa jest niestandardową implementacją klasy AuthenticationStateProvider. Dostawca używa PersistentComponentState klasy do wstępnego uwierzytelniania stanu i utrwalania go na stronie.

BlazorIdentity zależy DbContext od wystąpień, które nie są tworzone przez fabrykę, co jest zamierzone, ponieważ DbContext jest wystarczające, aby składniki szablonu Identity projektu były renderowane statycznie bez obsługi interakcyjności.

W głównym projekcie Blazor aplikacji internetowej dostawca stanu uwierzytelniania nosi nazwęIdentityRevalidatingAuthenticationStateProvider(źródło referencyjne) (tylko rozwiązania interakcyjne serwera) lub PersistingRevalidatingAuthenticationStateProvider (źródło referencyjne) (WebAssembly lub Auto interactivity solutions).

Aby zapoznać się z opisem sposobu stosowania globalnych trybów renderowania interakcyjnego do składników innychIdentity niż składniki, a jednocześnie wymuszania statycznego przewodnika SSR dla Identity składników, zobacz ASP.NET Tryby renderowania PodstawoweBlazor.

Aby uzyskać więcej informacji na temat utrwalania stanu wstępnego, zobacz Prerender ASP.NET Core components (Składniki prerender ASP.NET CoreRazor).

Aby uzyskać więcej informacji na temat interfejsu BlazorIdentity użytkownika i wskazówek dotyczących integrowania identyfikatorów logowania zewnętrznego za pośrednictwem witryn społecznościowych, zobacz Co nowego z tożsamością na platformie .NET 8.

Uwaga

Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Zarządzanie stanem uwierzytelniania w usłudze Blazor Web Apps

Ta sekcja dotyczy Blazor aplikacji internetowych, które przyjmują:

  • Interaktywne renderowanie po stronie serwera (interakcyjne SSR) i CSR.
  • Renderowanie po stronie klienta (CSR).

Dostawca stanu uwierzytelniania po stronie klienta jest używany tylko w ramach Blazor programu i nie jest zintegrowany z systemem uwierzytelniania ASP.NET Core. Podczas prerenderingu Blazor uwzględnia metadane zdefiniowane na stronie i używa systemu uwierzytelniania ASP.NET Core w celu określenia, czy użytkownik jest uwierzytelniony. Gdy użytkownik przechodzi z jednej strony do innej, jest używany dostawca uwierzytelniania po stronie klienta. Gdy użytkownik odświeży stronę (załaduj ponownie pełną stronę), dostawca stanu uwierzytelniania po stronie klienta nie jest zaangażowany w decyzję uwierzytelniania na serwerze. Ponieważ stan użytkownika nie jest utrwalany przez serwer, każdy stan uwierzytelniania utrzymywany po stronie klienta zostanie utracony.

Aby rozwiązać ten problem, najlepszym rozwiązaniem jest przeprowadzenie uwierzytelniania w systemie uwierzytelniania ASP.NET Core. Dostawca stanu uwierzytelniania po stronie klienta zajmuje się tylko odzwierciedleniem stanu uwierzytelniania użytkownika. Przykłady tego, jak to zrobić za pomocą dostawców stanu uwierzytelniania, są przedstawiane przez Blazor szablon projektu aplikacji internetowej:

  • PersistingRevalidatingAuthenticationStateProvider (źródło referencyjne): w przypadku Blazor aplikacji internetowych, które przyjmują interaktywne renderowanie po stronie serwera (interakcyjne SSR) i renderowanie po stronie klienta (CSR). Jest to strona AuthenticationStateProvider serwera, która rewalyzuje sygnaturę zabezpieczeń dla połączonego użytkownika co 30 minut połączony obwód interakcyjny. Używa ona również usługi Stanu składnika trwałego do przepływu stanu uwierzytelniania do klienta, który jest następnie stały przez okres istnienia żądania CSR.

  • PersistingServerAuthenticationStateProvider (źródło referencyjne): w przypadku Blazor usługi Web Apps, które przyjmują tylko csr. Jest to strona AuthenticationStateProvider serwera, która używa usługi stanu składnika trwałego do przepływu stanu uwierzytelniania do klienta, który jest następnie stały przez okres istnienia csr.

  • PersistentAuthenticationStateProvider (źródło referencyjne): w przypadku Blazor aplikacji internetowych, które przyjmują csr. Jest to po stronie AuthenticationStateProvider klienta, która określa stan uwierzytelniania użytkownika, wyszukując dane utrwalone na stronie podczas renderowania na serwerze. Ten stan uwierzytelniania jest stały dla okresu istnienia csr. Jeśli użytkownik musi się zalogować lub wylogować, wymagane jest ponowne załadowanie pełnej strony. Zapewnia to tylko nazwę użytkownika i adres e-mail do celów wyświetlania. Nie obejmuje tokenów uwierzytelniających się na serwerze podczas podejmowania kolejnych żądań, które są obsługiwane oddzielnie przy użyciu elementu cookie uwzględnionego w HttpClient żądaniach do serwera.

Uwaga

Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Szkielet Identity

Aby uzyskać więcej informacji na temat tworzenia Identity szkieletów w aplikacji po stronie Blazor serwera, zobacz Tworzenie szkieletu Identity w projektach ASP.NET Core.

Identity Tworzenie szkieletu w aplikacji po stronie Blazor serwera:

Dodatkowe oświadczenia i tokeny od dostawców zewnętrznych

Aby przechowywać dodatkowe oświadczenia od dostawców zewnętrznych, zobacz Utrwalanie dodatkowych oświadczeń i tokenów od dostawców zewnętrznych na platformie ASP.NET Core.

Usługa Azure App Service dla systemu Linux z serwerem Identity

Podczas wdrażania w usłudze Azure App Service dla systemu Linux z serwerem Identity jawnie określ wystawcę. Aby uzyskać więcej informacji, zobacz Zabezpieczanie Identity zaplecza internetowego interfejsu API dla spAs.

Implementowanie niestandardowego dostawcy AuthenticationStateProvider

Jeśli aplikacja wymaga niestandardowego dostawcy, zaimplementuj AuthenticationStateProvider i przesłoń GetAuthenticationStateAsyncpolecenie .

W poniższym przykładzie wszyscy użytkownicy są uwierzytelniani przy użyciu nazwy użytkownika mrfibuli.

CustomAuthStateProvider.cs:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var identity = new ClaimsIdentity(new[]
        {
            new Claim(ClaimTypes.Name, "mrfibuli"),
        }, "Custom Authentication");

        var user = new ClaimsPrincipal(identity);

        return Task.FromResult(new AuthenticationState(user));
    }
}

Usługa jest zarejestrowana CustomAuthStateProviderProgram w pliku:

using Microsoft.AspNetCore.Components.Authorization;

...

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

Usługa jest zarejestrowana CustomAuthStateProvider w Program pliku po wywołaniu metody AddServerSideBlazor:

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddServerSideBlazor();

...

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

Usługa CustomAuthStateProvider jest zarejestrowana w Startup.ConfigureServices usłudzeStartup.cs po wywołaniu metody :AddServerSideBlazor

using Microsoft.AspNetCore.Components.Authorization;

...

services.AddServerSideBlazor();

...

services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Potwierdź lub dodaj element AuthorizeRouteView do Router składnika.

W składniku Routes (Components/Routes.razor):

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

Dodaj kaskadowe usługi stanu uwierzytelniania do kolekcji usług w Program pliku :

builder.Services.AddCascadingAuthenticationState();

Uwaga

Podczas tworzenia Blazor aplikacji na podstawie jednego Blazor z szablonów projektów z włączonym uwierzytelnianiem aplikacja zawiera AuthorizeRouteView wywołanie i .AddCascadingAuthenticationState 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 za pomocą składnika Router.

Potwierdź lub dodaj element AuthorizeRouteView i CascadingAuthenticationState do Router składnika:

<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 pokazane w poprzednim przykładzie. 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 za pomocą składnika Router.

Element AuthorizeView demonstruje nazwę uwierzytelnionego użytkownika w dowolnym składniku:

<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).

Powiadomienie o zmianach stanu uwierzytelniania

W klasie bazowej można wywołać metodę niestandardową AuthenticationStateProviderAuthenticationStateProvider, 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 niestandardowego AuthenticationStateProvider .

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 System.Threading.Tasks;
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[]
        {
            new Claim(ClaimTypes.Name, userIdentifier),
        }, "Custom Authentication");

        var user = new ClaimsPrincipal(identity);

        NotifyAuthenticationStateChanged(
            Task.FromResult(new AuthenticationState(user)));
    }
}

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);
    }
}
@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ższe AuthenticationService elementy utrzymują podmiot zabezpieczeń oświadczeń bieżącego użytkownika w polu zaplecza (currentUser) ze zdarzeniem (UserChanged), do AuthenticationStateProvider którego można zasubskrybować, gdzie zdarzenie wywołuje NotifyAuthenticationStateChangedelement . W dalszej części tej sekcji AuthenticationService można wstawić dodatkową konfigurację do składnika z logiką ustawiającą CurrentUser element w celu wyzwolenia UserChanged zdarzenia.

using System.Security.Claims;

public class AuthenticationService
{
    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 AuthenticationService element w kontenerze wstrzykiwania zależności:

builder.Services.AddScoped<AuthenticationService>();

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

services.AddScoped<AuthenticationService>();

Poniżej CustomAuthStateProvider subskrybuje AuthenticationService.UserChanged zdarzenie. GetAuthenticationStateAsync zwraca stan uwierzytelniania użytkownika. Początkowo stan uwierzytelniania jest oparty na wartości AuthenticationService.CurrentUser. Po zmianie użytkownika zostanie utworzony nowy stan uwierzytelniania przy użyciu nowego użytkownika (new AuthenticationState(newUser)) dla wywołań metody GetAuthenticationStateAsync:

using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Components.Authorization;

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    private AuthenticationState authenticationState;

    public CustomAuthStateProvider(AuthenticationService service)
    {
        authenticationState = new AuthenticationState(service.CurrentUser);

        service.UserChanged += (newUser) =>
        {
            authenticationState = new AuthenticationState(newUser);

            NotifyAuthenticationStateChanged(
                Task.FromResult(new AuthenticationState(newUser)));
        };
    }

    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 :AuthenticationService.CurrentUser

@inject AuthenticationService AuthenticationService

<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 = AuthenticationService.CurrentUser;

        var identity = new ClaimsIdentity(
            new[]
            {
                new Claim(ClaimTypes.Name, userIdentifier),
            },
            "Custom Authentication");

        var newUser = new ClaimsPrincipal(identity);

        AuthenticationService.CurrentUser = newUser;
    }
}
@inject AuthenticationService AuthenticationService

<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 = AuthenticationService.CurrentUser;

        var identity = new ClaimsIdentity(
            new[]
            {
                new Claim(ClaimTypes.Name, userIdentifier),
            },
            "Custom Authentication");

        var newUser = new ClaimsPrincipal(identity);

        AuthenticationService.CurrentUser = newUser;
    }
}

Wstrzykiwanie AuthenticationStateProvider dla usług o zakresie do składnika

Nie próbuj rozwiązywać problemów AuthenticationStateProvider w zakresie niestandardowym, ponieważ powoduje utworzenie nowego wystąpienia obiektu AuthenticationStateProvider , które nie zostało poprawnie zainicjowane.

Aby uzyskać dostęp do AuthenticationStateProvider elementu w ramach usługi o zakresie składnika, należy wstrzyknąć AuthenticationStateProvider element z @inject dyrektywą lub [Inject] atrybutem i przekazać go do usługi jako parametr. Takie podejście gwarantuje, że poprawne, zainicjowane wystąpienie AuthenticationStateProvider obiektu jest używane dla każdego wystąpienia aplikacji użytkownika.

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.";
        }
    }
}

Zarejestruj usługę jako zakres. W aplikacji po stronie Blazor serwera zakres usług ma okres istnienia równy czasowi trwania obwodu połączenia klienta.

W pliku Program:

builder.Services.AddScoped<ExampleService>();

W Startup.ConfigureServices pliku :Startup.cs

services.AddScoped<ExampleService>();

W poniższym składniku InjectAuthStateProvider:

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

Aby uzyskać więcej informacji, zobacz wskazówki dotyczące OwningComponentBaseiniekcji zależności ASP.NET CoreBlazor.

Wyświetlanie nieautoryzowanej zawartości podczas prerenderingu za pomocą niestandardowego AuthenticationStateProvider

Aby uniknąć wyświetlania nieautoryzowanej zawartości, na przykład zawartości w składnikuAuthorizeView, podczas prerendering z niestandardowym AuthenticationStateProviderelementem , należy zastosować jedną z następujących metod:

  • Wyłącz prerendering: wskazuje tryb renderowania z parametrem prerender ustawionym na false najwyższy poziom składnika w hierarchii składników aplikacji, który nie jest składnikiem głównym.

    Uwaga

    Tworzenie składnika głównego interakcyjnego, takiego jak App składnik, nie jest obsługiwane. W związku z tym prerendering nie może być wyłączony bezpośrednio przez App składnik.

    W przypadku aplikacji opartych na szablonie Blazor projektu aplikacja internetowa wstępne jest zwykle wyłączone, gdy Routes składnik jest używany w składniku App (Components/App.razor) :

    <Routes @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Ponadto wyłącz prerendering dla HeadOutlet składnika:

    <HeadOutlet @rendermode="new InteractiveServerRenderMode(prerender: false)" />
    

    Można również selektywnie sterować trybem renderowania zastosowanym Routes do wystąpienia składnika. Zobacz na przykład tryby renderowania ASP.NET CoreBlazor.

  • Wyłącz prerendering: otwórz _Host.cshtml plik i zmień render-mode atrybut pomocnika tagów składnika na Server:

    <component type="typeof(App)" render-mode="Server" />
    
  • Uwierzytelnij użytkownika na serwerze przed rozpoczęciem działania aplikacji: aby zastosować to podejście, aplikacja musi odpowiadać na początkowe żądanie użytkownika przy użyciu strony logowania lub wyświetlania opartego Identityna protokole i uniemożliwić uwierzytelnianie żądań do Blazor punktów końcowych. Aby uzyskać więcej informacji, zobacz Tworzenie aplikacji ASP.NET Core z danymi użytkownika chronionymi przez autoryzację. Po uwierzytelnieniu nieautoryzowana zawartość w prerenderowanych Razor składnikach jest wyświetlana tylko wtedy, gdy użytkownik jest naprawdę nieautoryzowany do wyświetlania zawartości.

Zarządzanie stanem użytkownika

Pomimo słowa "state" w nazwie AuthenticationStateProvider nie jest przeznaczony do przechowywania stanu użytkownika ogólnego. AuthenticationStateProvider Wskazuje tylko stan uwierzytelniania użytkownika w aplikacji, niezależnie od tego, czy są oni zalogowani do aplikacji i którzy są zalogowani jako.

Uwierzytelnianie używa tego samego uwierzytelniania ASP.NET Core Identity co Razor aplikacje Pages i MVC. Stan użytkownika przechowywany dla przepływów ASP.NET Core Identity do Blazor bez dodawania dodatkowego kodu do aplikacji. Postępuj zgodnie ze wskazówkami w artykułach ASP.NET Core Identity i samouczkach dotyczących Identity funkcji, które zostaną zastosowane w Blazor częściach aplikacji.

Aby uzyskać wskazówki dotyczące ogólnego zarządzania stanem poza programem ASP.NET CoreIdentity, zobacz zarządzanie stanem ASP.NET CoreBlazor.

Dodatkowe abstrakcje zabezpieczeń

Dwie dodatkowe abstrakcje uczestniczą w zarządzaniu stanem uwierzytelniania:

Uwaga

Linki dokumentacji do źródła referencyjnego platformy .NET zwykle ładują domyślną gałąź repozytorium, która odzwierciedla bieżące programowanie dla następnej wersji platformy .NET. Aby wybrać tag dla określonej wersji, użyj listy rozwijanej Przełącz gałęzie lub tagi. Aby uzyskać więcej informacji, zobacz Jak wybrać tag wersji kodu źródłowego platformy ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Czas trwania ważności tymczasowego adresu URL przekierowania

Ta sekcja dotyczy Blazor usługi Web Apps.

RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Użyj opcji , aby uzyskać lub ustawić okres ważności ochrony danych dla tymczasowych adresów URL przekierowania emitowanych przez Blazor renderowanie po stronie serwera. Są one używane tylko w sposób przejściowy, więc okres istnienia musi być wystarczająco długi, aby klient odbierał adres URL i rozpoczynał nawigację do niego. Jednak powinno to być również wystarczająco długie, aby umożliwić niesymetryczność zegara na serwerach. Wartość domyślna to pięć minut.

W poniższym przykładzie wartość jest rozszerzona do siedmiu minut:

builder.Services.AddRazorComponents(options => 
    options.TemporaryRedirectionUrlValidityDuration = 
        TimeSpan.FromMinutes(7));

Dodatkowe zasoby