Sdílet prostřednictvím


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, aktuálně každých 30 minut ve výchozím nastavení.

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

Blazorliší se od tradičních webových aplikací vykreslících serverem, které na každé navigaci na stránce vytvoří nové požadavky HTTP.cookie Během událostí navigace se kontroluje ověřování. cookieNení to ale zapleteno. CookieFunkce s 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í RevalidatingAuthenticationStateProvider abstrakce.

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

Š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.
  • Microsoft Identity Platform: Další informace najdete v tématu ASP.NET Základní Blazor ověřování a autorizace.
  • 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 BlazorIdentity kód šablony webové aplikace pro databázi SQL Serveru. Verze příkazového řádku používá ve výchozím nastavení SQLite a obsahuje databázi SQLite pro Identity.

Šablona zpracovává následující:

  • 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.
    • Podporují se interaktivní vykreslování na straně serveru (interaktivní SSR) a scénáře vykreslování na straně klienta (CSR).
  • 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 PagesShared složkách Account složky v Blazor šabloně projektu webové aplikace (referenční zdroj).

Když zvolíte režimy 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 vykreslují staticky v Blazor hlavním projektu webové aplikace.

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 Blazor WebAssembly modulu runtime. 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í ve Službě Web Apps.Blazor

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žimy 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 vykreslují staticky v Blazor hlavním projektu webové aplikace. Š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 webové aplikace má zprostředkovatel stavu ověřování název IdentityRevalidatingAuthenticationStateProvider (pouze referenční zdroj) (pouze řešení interaktivity serveru) nebo PersistingRevalidatingAuthenticationStateProvider (zdroj odkazu) (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.

Další informace o uživatelském BlazorIdentity rozhraní a doprovodných materiálech k integraci externích přihlášení prostřednictvím sociálních webů najdete v tématu Co je nového s identitou v .NET 8.

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í ve Službě Blazor Web Apps

Tato část se týká Blazor webových aplikací, které přijímají:

  • 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 projektu webové aplikace 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();

Ve výchozím nastavení rozhraní API serializuje pouze název na straně serveru a deklarace 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 AuthenticationStateAuthenticationStateProvider, 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 webové aplikace, které 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 webové aplikace, 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 webové aplikace, 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í IdentityIdentity 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.

Implementace vlastní třídy AuthenticationStateProvider

Pokud aplikace vyžaduje vlastního poskytovatele, implementujte AuthenticationStateProvider a přepište GetAuthenticationStateAsync.

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

Služba CustomAuthStateProvider je zaregistrovaná Program v souboru:

using Microsoft.AspNetCore.Components.Authorization;

...

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

Služba CustomAuthStateProvider se zaregistruje v Program souboru po volání:AddServerSideBlazor

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddServerSideBlazor();

...

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

Služba CustomAuthStateProvider je zaregistrovaná Startup.ConfigureServicesStartup.cspo volání:AddServerSideBlazor

using Microsoft.AspNetCore.Components.Authorization;

...

services.AddServerSideBlazor();

...

services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Potvrďte nebo přidejte AuthorizeRouteView komponentu Router .

V komponentě Routes (Components/Routes.razor):

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

Do kolekce služby v Program souboru přidejte kaskádové stavové služby ověřování:

builder.Services.AddCascadingAuthenticationState();

Poznámka:

Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace zahrnuje AuthorizeRouteView volání a volání AddCascadingAuthenticationState. 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 obsahu v části Komponenta Směrovač.

Potvrďte nebo přidejte AuthorizeRouteView komponentuRouter:CascadingAuthenticationState

<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 součásti AuthorizeRouteView a CascadingAuthenticationState součásti uvedené v předchozím příkladu. 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 obsahu v části Komponenta Směrovač.

Předvádí AuthorizeView jméno ověřeného uživatele v libovolné komponentě:

<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 pomocí pokynů v části Implementace vlastního AuthenticationStateProvider oddílu.

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

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);
    }
}
@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í příkaz AuthenticationService udržuje objekt deklarací identity aktuálního uživatele v backingovém poli (currentUser) s událostí (UserChanged), ke které AuthenticationStateProvider se může přihlásit k odběru, kde událost vyvolá NotifyAuthenticationStateChanged. S další konfigurací dále v této části AuthenticationService se dá vložit do komponenty s logikou, která nastaví CurrentUser aktivaci UserChanged události.

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 V souboru zaregistrujte AuthenticationService kontejner injektáž závislostí:

builder.Services.AddScoped<AuthenticationService>();

V Startup.ConfigureServices kontejneru Startup.csAuthenticationService injektáže závislostí zaregistrujte:

services.AddScoped<AuthenticationService>();

Následující CustomAuthStateProvider přihlášení k odběru AuthenticationService.UserChanged události. GetAuthenticationStateAsync vrátí stav ověřování uživatele. Stav ověřování je zpočátku založen na hodnotě AuthenticationService.CurrentUser. Když dojde ke změně uživatele, vytvoří se nový stav ověřování s novým uživatelem (new AuthenticationState(newUser)) pro volání: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 následující komponenty SignIn vytvoří objekt deklarací identity pro identifikátor uživatele, který se nastaví 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;
    }
}

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:

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 AuthenticationStateProviderpřístupy použijte jeden z následujících přístupů:

  • Zakázání předběžného vykreslování: Indikujte režim vykreslování s parametrem prerender nastaveným false 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 komponentou App .

    U aplikací založených na Blazor šabloně projektu webové aplikace je předkreslování obvykle zakázáno, pokud Routes se komponenta 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ěňte render-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ší abstrakce zabezpečení

Správa stavu ověřování se účastní dvou dalších abstrakcí:

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 platí pro Blazor Web Apps.

RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Pomocí možnosti získat nebo nastavit dobu platnosti 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