Ověřování a autorizace ASP.NET Core Blazor

Poznámka:

Toto není nejnovější verze tohoto článku. 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 popisuje podporu konfigurace a správy zabezpečení ASP.NET Core v aplikacích Blazor.

Scénáře zabezpečení se liší mezi autorizačním kódem spuštěným na straně serveru a klientem v Blazor aplikacích. U autorizačního kódu, který běží na serveru, jsou kontroly autorizace schopné vynutit pravidla přístupu pro oblasti aplikace a komponent. Vzhledem k tomu, že spouštění kódu na straně klienta může být manipulováno, nemůže být autorizační kód spuštěný na klientovi důvěryhodný, aby zcela vynucoval pravidla přístupu nebo kontroloval zobrazení obsahu na straně klienta.

Pokud musí být zaručeno vynucení autorizačního pravidla, neimplementujte kontroly autorizace v kódu na straně klienta. Vytvořte webovou Blazor aplikaci, která se spoléhá pouze na vykreslování na straně serveru (SSR) pro kontroly autorizace a vynucení pravidel.

Konvence autorizace Razor Pages se nevztahují na směrovatelné komponenty Razor. Pokud je komponenta, která není směrovatelnáRazor, vložená na stránku Razor aplikace Pages, zásady autorizace stránky nepřímo ovlivňují Razor komponentu spolu se zbytkem obsahu stránky.

Pokud musí být zaručeno vynucení autorizačního pravidla a zabezpečení dat a kódu, nevyvíjejte aplikaci na straně klienta. Vytvoření Blazor Server aplikace

Konvence autorizace Razor Pages se nevztahují na směrovatelné komponenty Razor. Pokud je komponenta, která není směrovatelnáRazor, vložená na stránku Razor aplikace Pages, zásady autorizace stránky nepřímo ovlivňují Razor komponentu spolu se zbytkem obsahu stránky.

ASP.NET Core Identity je navržená tak, aby fungovala v kontextu komunikace požadavků a odpovědí HTTP, což obecně není Blazor komunikační model klient-server aplikace. Aplikace ASP.NET Core, které pro správu uživatelů využívají ASP.NET Core Identity, by měly pro uživatelské rozhraní související s Identity, jako je registrace uživatele, přihlášení, odhlášení a další úlohy správy uživatelů, místo komponent Razor využívat Razor Pages. Vytváření Razor komponent, které přímo zpracovávají Identity úlohy, je možné v několika scénářích, ale microsoft je nedoporučuje ani nepodporuje.

Abstrakce ASP.NET Core, jako jsou SignInManager<TUser> a UserManager<TUser>, se v komponentách Razor nepodporují. Další informace o použití ASP.NET Core Identity s Blazor, naleznete v tématu Generování uživatelského rozhraní ASP.NET Core Identity do aplikace na straně Blazor serveru.

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

Podpora antiforgery

Šablona Blazor :

Komponenta AntiforgeryToken vykreslí antiforgery token jako skryté pole a tato komponenta se automaticky přidá do instancí formuláře (EditForm). Další informace najdete v tématu ASP.NET Přehled formulářů CoreBlazor.

Služba AntiforgeryStateProvider poskytuje přístup k tokenu antiforgery přidruženému k aktuální relaci. Vloží službu a zavolá její GetAntiforgeryToken() metodu k získání aktuálního AntiforgeryRequestToken. Další informace najdete v tématu Volání webového rozhraní API z aplikace ASP.NET CoreBlazor.

Blazor ukládá tokeny žádostí do stavu komponenty, což zaručuje, že antiforgery tokeny jsou k dispozici interaktivním komponentám, i když nemají přístup k žádosti.

Poznámka:

Omezení rizik proti padělání je vyžadováno pouze při odesílání dat formuláře na server kódovaný jako application/x-www-form-urlencoded, multipart/form-datanebo text/plain protože se jedná o jediné platné typy entypů formuláře.

Další informace naleznete v následujících zdrojích:

Ověřování

Blazor využívá stávající mechanismy ověřování ASP.NET Core k vytvoření identity uživatele. Přesný mechanismus závisí na tom, jak Blazor je aplikace hostovaná, na straně serveru nebo na straně klienta.

Ověřování na straně serveru Blazor

Interaktivně vykreslená serverová strana Blazor funguje přes SignalR připojení s klientem. Ověřování v aplikacích založených na SignalR se zpracovává při navázání tohoto připojení. Ověřování může být založené na nosné cookie tokenu nebo na jiném nosném tokenu, ale ověřování se spravuje prostřednictvím SignalR centra a zcela v okruhu.

Integrovaná AuthenticationStateProvider služba získává data o stavu ověřování z ASP.NET Core HttpContext.User. Takto se stav ověřování integruje se stávajícími mechanismy ověřování ASP.NET Core.

IHttpContextAccessor/HttpContext v Razor součástech

IHttpContextAccessor musí se vyhnout interaktivnímu vykreslování, protože není k dispozici platný HttpContext .

IHttpContextAccessor lze použít pro součásti, které jsou staticky vykresleny na serveru. Pokud je to ale možné, doporučujeme ho vyhnout.

HttpContext lze použít jako kaskádový parametr pouze v staticky vykreslovaných kořenových komponentách pro obecné úlohy, jako je kontrola a úprava hlaviček nebo jiných vlastností v komponentě App (Components/App.razor). Hodnota je vždy null určená pro interaktivní vykreslování.

[CascadingParameter]
public HttpContext? HttpContext { get; set; }

Pro scénáře, ve HttpContext kterých se vyžaduje v interaktivních komponentách, doporučujeme tok dat přes trvalý stav komponenty ze serveru. Další informace najdete v tématu Další scénáře zabezpečení na straně serveru ASP.NET CoreBlazor.

Nepoužívejte IHttpContextAccessor/HttpContext přímo ani nepřímo v Razor komponentách serverových Blazor aplikací. Blazor aplikace běží mimo kontext kanálu ASP.NET Core. Není HttpContext zaručeno, že bude k dispozici v rámci aplikace IHttpContextAccessora HttpContext není zaručeno, že bude obsahovat kontext, který aplikaci spustil Blazor .

Doporučený postup pro předávání stavu požadavku do Blazor aplikace je prostřednictvím parametrů kořenové komponenty během počátečního vykreslování aplikace. Případně může aplikace zkopírovat data do vymezené služby v události životního cyklu inicializace kořenové komponenty pro použití v celé aplikaci. Další informace najdete v tématu Další scénáře zabezpečení na straně serveru ASP.NET CoreBlazor.

Důležitým aspektem zabezpečení na straně Blazor serveru je, že se uživatel připojený k danému okruhu může v určitém okamžiku Blazor po navázání okruhu aktualizovat, ale IHttpContextAccessorneaktualizuje se. Další informace o řešení této situace s vlastními službami najdete v tématu Další scénáře zabezpečení na straně serveru ASP.NET CoreBlazor.

Sdílený stav

Aplikace na straně Blazor serveru jsou živé v paměti serveru a několik relací aplikací se hostuje ve stejném procesu. Pro každou relaci Blazor aplikace spustí okruh s vlastním oborem kontejneru injektáže závislostí, takže služby s vymezeným oborem jsou jedinečné pro každou Blazor relaci.

Upozorňující

Nedoporučujeme aplikace ve stejném stavu sdílení serveru, které používají singletonové služby, pokud se o to nezajímá extrémní péče, protože to může představovat ohrožení zabezpečení, jako je únik stavu uživatele napříč okruhy.

Stavové jednoúčelové služby můžete v Blazor aplikacích používat, pokud jsou speciálně navržené. Například použití jednoúčelové mezipaměti paměti je přijatelné, protože mezipaměť paměti vyžaduje klíč pro přístup k dané položce. Za předpokladu, že uživatelé nemají kontrolu nad klíči mezipaměti, které se používají s mezipamětí, nedojde k úniku stavu uloženého v mezipaměti mezi okruhy.

Obecné pokyny ke správě stavu najdete v tématu ASP.NET Blazor Základní správa stavu.

Ověřování na straně Blazor klienta

V aplikacích na straně klienta je možné obejít kontroly ověřování na straně Blazor klienta, protože všichni uživatelé můžou upravovat kód na straně klienta. Totéž platí pro všechny technologie aplikací na straně klienta, včetně architektur JavaScript SPA a nativních aplikací pro jakýkoli operační systém.

Přidejte následující:

Pro zpracování ověřování je použití integrované nebo vlastní AuthenticationStateProvider služby popsané v následujících částech.

Další informace najdete v tématu Zabezpečení ASP.NET Core Blazor WebAssembly.

Služba AuthenticationStateProvider

AuthenticationStateProvider je základní služba používaná komponentou AuthorizeView a kaskádovými ověřovacími službami k získání stavu ověřování pro uživatele.

AuthenticationStateProvider je základní služba používaná komponentou AuthorizeView a CascadingAuthenticationState komponentou k získání stavu ověřování uživatele.

AuthenticationStateProvider se obvykle nepoužívá přímo. Použijte komponentu AuthorizeView nebo přístupy Task<AuthenticationState> popsané dále v tomto článku. Hlavní nevýhodou použití AuthenticationStateProvider přímo je to, že komponenta není automaticky upozorněna, pokud se změní podkladová data stavu ověřování.

Poznámka:

Pokud chcete implementovat vlastní AuthenticationStateProvideraplikaci, přečtěte si téma Zabezpečené ASP.NET základní aplikace na straně Blazor serveru.

Služba AuthenticationStateProvider může poskytnout data aktuálního uživatele ClaimsPrincipal , jak je znázorněno v následujícím příkladu.

ClaimsPrincipalData.razor:

@page "/claims-principle-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>ClaimsPrincipal Data</h1>

<button @onclick="GetClaimsPrincipalData">Get ClaimsPrincipal Data</button>

<p>@authMessage</p>

@if (claims.Count() > 0)
{
    <ul>
        @foreach (var claim in claims)
        {
            <li>@claim.Type: @claim.Value</li>
        }
    </ul>
}

<p>@surname</p>

@code {
    private string? authMessage;
    private string? surname;
    private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();

    private async Task GetClaimsPrincipalData()
    {
        var authState = await AuthenticationStateProvider
            .GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            authMessage = $"{user.Identity.Name} is authenticated.";
            claims = user.Claims;
            surname = user.FindFirst(c => c.Type == ClaimTypes.Surname)?.Value;
        }
        else
        {
            authMessage = "The user is NOT authenticated.";
        }
    }
}

V předchozím příkladu:

  • ClaimsPrincipal.Claims vrátí deklarace identity uživatele (claims) pro zobrazení v uživatelském rozhraní.
  • Řádek, který získá volání příjmení (surname) ClaimsPrincipal.FindAll uživatele s predikátem k filtrování deklarací identity uživatele.
@page "/claims-principle-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>ClaimsPrincipal Data</h1>

<button @onclick="GetClaimsPrincipalData">Get ClaimsPrincipal Data</button>

<p>@authMessage</p>

@if (claims.Count() > 0)
{
    <ul>
        @foreach (var claim in claims)
        {
            <li>@claim.Type: @claim.Value</li>
        }
    </ul>
}

<p>@surname</p>

@code {
    private string? authMessage;
    private string? surname;
    private IEnumerable<Claim> claims = Enumerable.Empty<Claim>();

    private async Task GetClaimsPrincipalData()
    {
        var authState = await AuthenticationStateProvider
            .GetAuthenticationStateAsync();
        var user = authState.User;

        if (user.Identity is not null && user.Identity.IsAuthenticated)
        {
            authMessage = $"{user.Identity.Name} is authenticated.";
            claims = user.Claims;
            surname = user.FindFirst(c => c.Type == ClaimTypes.Surname)?.Value;
        }
        else
        {
            authMessage = "The user is NOT authenticated.";
        }
    }
}

Pokud user.Identity.IsAuthenticated je true a uživatel je ClaimsPrincipal, je možné vyčíslit deklarace identity a vyhodnotit členství v rolích.

Další informace o injektáži závislostí (DI) a službách najdete v tématech Injektáž závislostí ASP.NET Core Blazor a Injektáž závislostí v ASP.NET Core. Informace o tom, jak implementovat vlastní AuthenticationStateProvider aplikace na straně Blazor serveru, najdete v tématu Zabezpečené ASP.NET základní aplikace na straně Blazor serveru.

Zveřejnění stavu ověřování jako kaskádového parametru

Pokud se pro procedurální logiku, například při provádění akce aktivované uživatelem, vyžadují data o stavu ověřování definováním kaskádového parametru typu Task<AuthenticationState>, jak ukazuje následující příklad.

CascadeAuthState.razor:

@page "/cascade-auth-state"

<h1>Cascade Auth State</h1>

<p>@authMessage</p>

@code {
    private string authMessage = "The user is NOT authenticated.";

    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user?.Identity is not null && user.Identity.IsAuthenticated)
            {
                authMessage = $"{user.Identity.Name} is authenticated.";
            }
        }
    }
}
@page "/cascade-auth-state"

<h1>Cascade Auth State</h1>

<p>@authMessage</p>

@code {
    private string authMessage = "The user is NOT authenticated.";

    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    protected override async Task OnInitializedAsync()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user?.Identity is not null && user.Identity.IsAuthenticated)
            {
                authMessage = $"{user.Identity.Name} is authenticated.";
            }
        }
    }
}

Pokud user.Identity.IsAuthenticated je true, je možné vyčíslit deklarace identity a vyhodnotit členství v rolích.

Nastavte kaskádového parametru Task<AuthorizeRouteViewAuthenticationState> pomocí a kaskádových ověřovacích stavových služeb.

Když vytvoříte Blazor aplikaci z jedné ze Blazor šablon projektu s povoleným ověřováním, aplikace obsahuje AuthorizeRouteView volání a volání, které se AddCascadingAuthenticationState zobrazí v následujícím příkladu. Aplikace na straně Blazor klienta zahrnuje také požadované registrace služeb. Další informace jsou uvedeny v části Přizpůsobení neoprávněného obsahu v části Komponenta Směrovač.

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

Program V souboru zaregistrujte kaskádové stavové služby ověřování:

builder.Services.AddCascadingAuthenticationState();

Nastavte kaskádového parametru Task<>AuthenticationStateAuthorizeRouteView pomocí komponent a CascadingAuthenticationState komponent.

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 následujícím příkladu. Aplikace na straně Blazor klienta zahrnuje také požadované registrace služeb. Další informace jsou uvedeny v části Přizpůsobení neoprávněného obsahu v části Komponenta Směrovač.

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

Poznámka:

S vydáním ASP.NET Core 5.0.1 a pro všechny další verze 5.x komponenta Router zahrnuje parametr PreferExactMatches nastavený na @true. Další informace najdete v tématu Migrace z ASP.NET Core 3.1 na verzi 5.0.

V aplikaci na straně Blazor klienta přidejte do souboru služby pro možnosti a autorizaci Program :

builder.Services.AddOptions();
builder.Services.AddAuthorizationCore();

V aplikaci na straně Blazor serveru už existují služby pro možnosti a autorizaci, takže nejsou potřeba žádné další kroky.

Autorizace

Po ověření uživatele se pravidla autorizace používají k řízení toho, co může uživatel dělat.

Přístup je obvykle udělen nebo odepřen na základě toho, jestli:

  • Uživatel je ověřený (přihlášený).
  • Uživatel je v roli.
  • Uživatel má deklaraci identity.
  • Zásady jsou splněné.

Všechny tyto koncepty jsou stejné jako v aplikaci ASP.NET Core MVC nebo Razor Pages. Další informace o zabezpečení ASP.NET Core najdete v článcích Zabezpečení ASP.NET Core a ASP.NET Core Identity.

AuthorizeView Komponenty

Komponenta AuthorizeView selektivně zobrazuje obsah uživatelského rozhraní v závislosti na tom, jestli je uživatel autorizovaný. Tento přístup je užitečný, když potřebujete jenom zobrazit data pro uživatele a nemusíte používat identitu uživatele v procedurální logice.

Komponenta zveřejňuje proměnnou context typu AuthenticationState (@context v Razor syntaxi), kterou můžete použít pro přístup k informacím o přihlášeném uživateli:

<AuthorizeView>
    <p>Hello, @context.User.Identity?.Name!</p>
</AuthorizeView>

Můžete také zadat jiný obsah pro zobrazení, pokud uživatel nemá autorizaci pomocí kombinace Authorized parametrů a NotAuthorized parametrů:

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
        <p><button @onclick="SecureMethod">Authorized Only Button</button></p>
    </Authorized>
    <NotAuthorized>
        <p>You're not authorized.</p>
    </NotAuthorized>
</AuthorizeView>

@code {
    private void SecureMethod() { ... }
}

Výchozí obslužnou rutina události pro autorizovaný element, jako je například metoda SecureMethod elementu <button> v předchozím příkladu, může vyvolat pouze autorizovaný uživatel.

RazorBlazor součásti Web Apps nikdy nezobrazují <NotAuthorized> obsah, pokud autorizace selže na straně serveru při statickém vykreslování na straně serveru (statická služba SSR). Na straně serveru ASP.NET základní kanál zpracovává autorizaci na serveru. Ke zpracování neautorizovaných požadavků použijte techniky na straně serveru. Další informace najdete v tématu ASP.NET režimy vykreslování coreBlazor.

Upozorňující

Značky a metody na straně klienta přidružené k objektu AuthorizeView jsou chráněny pouze před zobrazením a spouštěním v vykreslovaných uživatelských rozhraních v aplikacích na straně Blazor klienta. K ochraně autorizovaného obsahu a zabezpečených metod na straně Blazorklienta je obsah obvykle poskytován zabezpečeným, autorizovaným voláním webového rozhraní API na serverové rozhraní API a nikdy se neukládá v aplikaci. Další informace najdete v tématu Volání webového rozhraní API z aplikace ASP.NET Core Blazor a další scénáře zabezpečení ASP.NET CoreBlazor WebAssembly.

Obsah Authorized a NotAuthorized může obsahovat libovolné položky, například jiné interaktivní komponenty.

Podmínky autorizace, jako jsou role nebo zásady, které řídí možnosti uživatelského rozhraní nebo přístup, jsou popsané v části Autorizace.

Pokud nejsou zadané podmínky autorizace, AuthorizeView použije se výchozí zásada:

  • Ověření (přihlášení) uživatelé mají oprávnění.
  • Neověřené (odhlášené) uživatele nejsou neoprávnění.

Komponentu AuthorizeView lze použít v komponentě NavMenu (Shared/NavMenu.razor) k zobrazení komponenty NavLink (NavLink), ale nezapomeňte, že tento přístup odebere položku seznamu jenom z vykresleného výstupu. Nezabrání uživateli v přechodu na tuto komponentu. Implementujte autorizaci samostatně v cílové komponentě.

Autorizace na základě rolí a zásad

Komponenta AuthorizeView podporuje autorizaci založenou na rolích nebo na zásadách.

Pro autorizaci na základě role použijte Roles parametr. V následujícím příkladu musí mít uživatel deklaraci role pro role Admin nebo Superuser role:

<AuthorizeView Roles="Admin, Superuser">
    <p>You have an 'Admin' or 'Superuser' role claim.</p>
</AuthorizeView>

Pokud chcete vyžadovat, aby měl uživatel deklarace AdminSuperuser identity rolí, vnoření AuthorizeView součástí:

<AuthorizeView Roles="Admin">
    <p>User: @context.User</p>
    <p>You have the 'Admin' role claim.</p>
    <AuthorizeView Roles="Superuser" Context="innerContext">
        <p>User: @innerContext.User</p>
        <p>You have both 'Admin' and 'Superuser' role claims.</p>
    </AuthorizeView>
</AuthorizeView>

Předchozí kód vytvoří pro vnitřní AuthorizeView komponentu, Context aby se zabránilo AuthenticationState kolizi kontextu. K AuthenticationState kontextu se přistupuje na vnější straně AuthorizeView pomocí standardního přístupu pro přístup k kontextu (@context.User). K kontextu se přistupuje ve vnitřní části AuthorizeView s pojmenovaným innerContext kontextem (@innerContext.User).

Další informace, včetně doprovodných materiálů ke konfiguraci, najdete v tématu Autorizace na základě rolí v ASP.NET Core.

Pro autorizaci na základě zásad použijte Policy parametr s jednou zásadou:

<AuthorizeView Policy="Over21">
    <p>You satisfy the 'Over21' policy.</p>
</AuthorizeView>

Pokud chcete vyřešit případ, kdy by měl uživatel splňovat jednu z několika zásad, vytvořte zásadu, která potvrzuje, že uživatel splňuje jiné zásady.

Pokud chcete vyřešit případ, kdy uživatel musí současně splňovat několik zásad, použijte jeden z následujících přístupů:

  • Vytvořte zásadu, AuthorizeView která potvrzuje, že uživatel splňuje několik dalších zásad.

  • Vnoření zásad do několika AuthorizeView komponent:

    <AuthorizeView Policy="Over21">
        <AuthorizeView Policy="LivesInCalifornia">
            <p>You satisfy the 'Over21' and 'LivesInCalifornia' policies.</p>
        </AuthorizeView>
    </AuthorizeView>
    

Speciálním případem autorizace na základě zásad je autorizace na základě deklarací identity. Můžete například definovat zásadu, která vyžaduje, aby uživatelé měli určitou deklaraci identity. Další informace najdete v tématu Autorizace na základě zásad v ASP.NET Core.

RolesPolicy Pokud ani nezadáte, AuthorizeView použije se výchozí zásada:

  • Ověření (přihlášení) uživatelé mají oprávnění.
  • Neověřené (odhlášené) uživatele nejsou neoprávnění.

Vzhledem k tomu, že porovnání řetězců .NET ve výchozím nastavení rozlišují malá a velká písmena, rozlišují se také odpovídající názvy rolí a zásad. Například Admin (velkáA) není považována za stejnou roli jako admin (malá).a

Písmena Pascal se obvykle používají pro názvy rolí a zásad (například BillingAdministrator), ale použití případu Pascal není striktní požadavek. Jsou povolena různá schémata, jako jsou velbloudí případ, případ kebabu a hadí případ. Použití mezer v názvech rolí a zásad je neobvyklé, ale architektura je povolená. Jedná se například billing administrator o neobvyklý formát názvu role nebo zásady v aplikacích .NET, ale jde o platnou roli nebo název zásady.

Obsah zobrazený během asynchronního ověřování

Blazor umožňuje asynchronně určit stav ověřování. Primární scénář pro tento přístup je v aplikacích na straně Blazor klienta, které požadují externí koncový bod pro ověřování.

Během ověřování AuthorizeView ve výchozím nastavení nezobrazuje žádný obsah. Pokud chcete zobrazit obsah při ověřování, přiřaďte obsah k parametru Authorizing :

<AuthorizeView>
    <Authorized>
        <p>Hello, @context.User.Identity?.Name!</p>
    </Authorized>
    <Authorizing>
        <p>You can only see this content while authentication is in progress.</p>
    </Authorizing>
</AuthorizeView>

Tento přístup se obvykle nevztahuje na aplikace na straně Blazor serveru. Aplikace na straně Blazor serveru znají stav ověřování hned po vytvoření stavu. Authorizing obsah lze poskytnout v komponentě AuthorizeView aplikace, ale obsah se nikdy nezobrazí.

Atribut [Authorize]

Atribut [Authorize] je k dispozici v Razor komponentách:

@page "/"
@attribute [Authorize]

You can only see this if you're signed in.

Důležité

Používejte [Authorize]@page pouze komponenty, které byly dosaženy Blazor přes směrovač. Autorizace se provádí pouze jako aspekt směrování a neprovádí se pro podřízené komponenty vykreslené na stránce. Pokud chcete autorizovat zobrazení konkrétních částí na stránce, použijte místo toho AuthorizeView.

Atribut [Authorize] také podporuje autorizaci založenou na rolích nebo na zásadách. Pro autorizaci na základě role použijte parametr Roles:

@page "/"
@attribute [Authorize(Roles = "Admin, Superuser")]

<p>You can only see this if you're in the 'Admin' or 'Superuser' role.</p>

Pro autorizaci na základě zásad použijte parametr Policy:

@page "/"
@attribute [Authorize(Policy = "Over21")]

<p>You can only see this if you satisfy the 'Over21' policy.</p>

RolesPolicy Pokud ani nezadáte, [Authorize] použije se výchozí zásada:

  • Ověření (přihlášení) uživatelé mají oprávnění.
  • Neověřené (odhlášené) uživatele nejsou neoprávnění.

Pokud uživatel nemá autorizaci a pokud aplikace neautorizovaný obsah s komponentou Směrovač nepřizpůsobí, architektura automaticky zobrazí následující záložní zprávu:

Not authorized.

Autorizace prostředků

Pokud chcete autorizovat uživatele pro prostředky, předejte data směrování požadavku do parametru Resource v AuthorizeRouteView.

Router.Found V obsahu požadované trasy:

<AuthorizeRouteView Resource="routeData" RouteData="routeData" 
    DefaultLayout="typeof(MainLayout)" />

Další informace o tom, jak se údaje o stavu autorizace předávají a využívají v procedurální logice, najdete v části Zveřejnění stavu ověřování jako kaskádového parametru.

Když AuthorizeRouteView získá data směrování pro prostředek, zásady autorizace mají přístup ke komponentám RouteData.PageType a RouteData.RouteValues, které umožňují pro rozhodování o autorizaci používat vlastní logiku.

V následujícím příkladu se v AuthorizationOptions vytvoří zásady EditUser pro konfiguraci autorizační služby aplikace (AddAuthorizationCore) s následující logikou:

  • Určete, jestli existuje hodnota trasy s klíčem id. Pokud klíč existuje, hodnota trasy je uložená v value.
  • V proměnné s názvem id uložte value jako řetězec nebo nastavte prázdnou hodnotu řetězce (string.Empty).
  • Pokud id není prázdný řetězec, ověřte, že tato zásada je splněná (vrátí true), pokud hodnota řetězce má na začátku EMP. V opačném případě ověřte, že tato zásada selže (vrátí false).

V souboru Program:

  • Přidejte obory názvů pro Microsoft.AspNetCore.Components a System.Linq:

    using Microsoft.AspNetCore.Components;
    using System.Linq;
    
  • Přidejte zásady:

    options.AddPolicy("EditUser", policy =>
        policy.RequireAssertion(context =>
        {
            if (context.Resource is RouteData rd)
            {
                var routeValue = rd.RouteValues.TryGetValue("id", out var value);
                var id = Convert.ToString(value, 
                    System.Globalization.CultureInfo.InvariantCulture) ?? string.Empty;
    
                if (!string.IsNullOrEmpty(id))
                {
                    return id.StartsWith("EMP", StringComparison.InvariantCulture);
                }
            }
    
            return false;
        })
    );
    

Předchozí příklad je přehnaně zjednodušená zásada autorizace, která slouží pouze k demonstraci tohoto konceptu na funkčním příkladu. Další informace o vytváření a konfiguraci zásad autorizace najdete v tématu Autorizace na základě zásad v ASP.NET Core.

V následující komponentě EditUser má prostředek v /users/{id}/edit parametr trasy pro identifikátor uživatele ({id}). Tato komponenta využívá předchozí zásady autorizace EditUser k určení, jestli hodnota trasy pro id má na začátku EMP. Pokud id má na začátku EMP, zásada je splněná a přístup ke komponentě je autorizovaný. Pokud id začíná jinou hodnotou než EMP nebo pokud id je prázdný řetězec, zásada selže a komponenta se nenačte.

EditUser.razor:

@page "/users/{id}/edit"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "EditUser")]

<h1>Edit User</h1>

<p>The "EditUser" policy is satisfied! <code>Id</code> starts with 'EMP'.</p>

@code {
    [Parameter]
    public string? Id { get; set; }
}
@page "/users/{id}/edit"
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize(Policy = "EditUser")]

<h1>Edit User</h1>

<p>The "EditUser" policy is satisfied! <code>Id</code> starts with 'EMP'.</p>

@code {
    [Parameter]
    public string? Id { get; set; }
}

Přizpůsobení neautorizovaného obsahu s využitím komponenty Router

Komponenta Router ve spojení s komponentou AuthorizeRouteView umožňuje aplikaci určit vlastní obsah, pokud:

Důležité

Blazor Funkce směrovače, které zobrazují <NotAuthorized> a <NotFound> obsah nejsou funkční při vykreslování na straně statického serveru (static SSR), protože zpracování požadavků je zcela zpracováno ASP.NET zpracování požadavků kanálu middlewaru Core a Razor součásti se nevykreslují vůbec pro neoprávněné nebo chybné požadavky. Použití technik na straně serveru ke zpracování neoprávněných a chybných požadavků během statického serveru SSR. Další informace najdete v tématu ASP.NET režimy vykreslování coreBlazor.

<Router ...>
    <Found ...>
        <AuthorizeRouteView ...>
            <NotAuthorized>
                ...
            </NotAuthorized>
            <Authorizing>
                ...
            </Authorizing>
        </AuthorizeRouteView>
    </Found>
</Router>

Obsah Authorized a NotAuthorized může obsahovat libovolné položky, například jiné interaktivní komponenty.

Poznámka:

Předchozí postup vyžaduje kaskádovou registraci stavových služeb ověřování v souboru aplikace Program :

builder.Services.AddCascadingAuthenticationState();
<CascadingAuthenticationState>
    <Router ...>
        <Found ...>
            <AuthorizeRouteView ...>
                <NotAuthorized>
                    ...
                </NotAuthorized>
                <Authorizing>
                    ...
                </Authorizing>
            </AuthorizeRouteView>
        </Found>
    </Router>
</CascadingAuthenticationState>

NotFoundObsah souboru , Authorizeda NotAuthorized může obsahovat libovolné položky, například jiné interaktivní komponenty.

Pokud NotAuthorized není zadaný obsah, použije se AuthorizeRouteView následující záložní zpráva:

Not authorized.

Aplikace vytvořená ze Blazor WebAssembly šablony projektu s povoleným ověřováním zahrnuje komponentu RedirectToLogin , která je umístěna v <NotAuthorized> obsahu Router komponenty. Pokud uživatel není ověřený (context.User.Identity?.IsAuthenticated != true), RedirectToLogin komponenta přesměruje prohlížeč na authentication/login koncový bod pro ověření. Po ověření u zprostředkovatele identity se uživatel vrátí na požadovanou adresu URL.

Procedurální logika

Pokud je aplikace nutná ke kontrole autorizačních pravidel v rámci procedurální logiky, použijte kaskádový parametr typu Task<AuthenticationState> k získání ClaimsPrincipal uživatele. Task<AuthenticationState> lze kombinovat s dalšími službami, jako je IAuthorizationService, k vyhodnocení zásad.

V následujícím příkladu:

  • Spustí user.Identity.IsAuthenticated kód pro ověřené uživatele (přihlášené).
  • Spustí user.IsInRole("admin") kód pro uživatele v roli Správa.
  • Spustí (await AuthorizationService.AuthorizeAsync(user, "content-editor")).Succeeded kód pro uživatele, kteří splňují zásady content-editoru.

Aplikace na straně Blazor serveru obsahuje ve výchozím nastavení odpovídající obory názvů při vytváření ze šablony projektu. V aplikaci na straně Blazor klienta ověřte přítomnost Microsoft.AspNetCore.Authorization komponent nebo v souboru aplikace _Imports.razor a Microsoft.AspNetCore.Components.Authorization obory názvů:

@using Microsoft.AspNetCore.Authorization
@using Microsoft.AspNetCore.Components.Authorization

ProceduralLogic.razor:

@page "/procedural-logic"
@inject IAuthorizationService AuthorizationService

<h1>Procedural Logic Example</h1>

<button @onclick="@DoSomething">Do something important</button>

@code {
    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    private async Task DoSomething()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user is not null)
            {
                if (user.Identity is not null && user.Identity.IsAuthenticated)
                {
                    // ...
                }

                if (user.IsInRole("Admin"))
                {
                    // ...
                }

                if ((await AuthorizationService.AuthorizeAsync(user, "content-editor"))
                    .Succeeded)
                {
                    // ...
                }
            }
        }
    }
}
@page "/procedural-logic"
@inject IAuthorizationService AuthorizationService

<h1>Procedural Logic Example</h1>

<button @onclick="@DoSomething">Do something important</button>

@code {
    [CascadingParameter]
    private Task<AuthenticationState>? authenticationState { get; set; }

    private async Task DoSomething()
    {
        if (authenticationState is not null)
        {
            var authState = await authenticationState;
            var user = authState?.User;

            if (user is not null)
            {
                if (user.Identity is not null && user.Identity.IsAuthenticated)
                {
                    // ...
                }

                if (user.IsInRole("Admin"))
                {
                    // ...
                }

                if ((await AuthorizationService.AuthorizeAsync(user, "content-editor"))
                    .Succeeded)
                {
                    // ...
                }
            }
        }
    }
}

Řešení chyb

Běžné chyby:

  • Autorizace vyžaduje kaskádový parametr typu Task<AuthenticationState>. Zvažte použití CascadingAuthenticationState k jeho zajištění.

  • Hodnota null je přijata pro authenticationStateTask

Je pravděpodobné, že projekt nebyl vytvořen pomocí šablony na straně Blazor serveru s povoleným ověřováním.

V rozhraní .NET 7 nebo starších obtékání <CascadingAuthenticationState> části stromu uživatelského rozhraní, například kolem Blazor směrovače:

<CascadingAuthenticationState>
    <Router ...>
        ...
    </Router>
</CascadingAuthenticationState>

V .NET 8 nebo novějších nepoužívejte komponentu CascadingAuthenticationState :

- <CascadingAuthenticationState>
      <Router ...>
          ...
      </Router>
- </CascadingAuthenticationState>

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

builder.Services.AddCascadingAuthenticationState();

Komponenta CascadingAuthenticationState (.NET 7 nebo starší) nebo služby poskytované platformou AddCascadingAuthenticationState (.NET 8 nebo novější) poskytují>Task<AuthenticationStatekaskádový parametr, který zase přijímá ze služby injektáže závislostí.AuthenticationStateProvider

Identifikovatelné osobní údaje (PII)

Microsoft používá definici GDPR pro "osobní údaje" (GDPR 4.1), když dokumentace popisuje identifikovatelné osobní údaje (PII).

PII odkazuje na všechny informace týkající se identifikované nebo identifikovatelné fyzické osoby. Identifikovatelná fyzická osoba je osoba, která může být identifikována přímo nebo nepřímo, s některou z následujících možností:

  • Název
  • Identifikační číslo
  • Souřadnice umístění
  • Online identifikátor
  • Další specifické faktory
    • Fyzické
    • Fyziologické
    • Genetické
    • Duševní (psychická)
    • Hospodářské
    • Kulturní
    • Sociální identita

Další materiály