Megosztás a következőn keresztül:


ASP.NET Core Blazor hitelesítése és engedélyezése

Jegyzet

Ez nem a cikk legújabb verziója. Az aktuális kiadást lásd ebben a cikk .NET 9-es verziója.

Figyelmeztetés

A ASP.NET Core ezen verziója már nem támogatott. További információ: .NET és .NET Core támogatási szabályzat. Az aktuális kiadást lásd ebben a cikk .NET 9-es verziója.

Fontos

Ezek az információk egy olyan előzetes termékre vonatkoznak, amelyet a kereskedelmi forgalomba kerülés előtt jelentősen módosíthatnak. A Microsoft nem vállal kifejezett vagy hallgatólagos szavatosságot az itt megadott információkra vonatkozóan.

Az aktuális kiadást lásd ebben a cikk .NET 9-es verziója.

Ez a cikk ASP.NET Core Blazor-alkalmazások biztonsági konfigurációjának és felügyeletének támogatását ismerteti.

Blazor a meglévő ASP.NET Core hitelesítési mechanizmusokkal hozza létre a felhasználó identitását. A pontos mechanizmus attól függ, hogy a Blazor alkalmazás hogyan üzemel, kiszolgálóoldali vagy ügyféloldali.

A biztonsági forgatókönyvek eltérnek a kiszolgálóoldalon futó és ügyféloldalon futó engedélyezési kód esetében a Blazor alkalmazásokban. A kiszolgálón futó engedélyezési kódok esetében az engedélyezési ellenőrzések képesek az alkalmazás és az összetevők területeire vonatkozó hozzáférési szabályok kikényszerítésére. Mivel az ügyféloldali kódvégrehajtás módosítható, az ügyfélen végrehajtott engedélyezési kód nem megbízható a hozzáférési szabályok teljes körű kikényszerítéséhez vagy az ügyféloldali tartalom megjelenítésének szabályozásához.

Ha az engedélyezési szabály érvényesítését garantálni kell, ne hajtsa végre az engedélyezési ellenőrzéseket az ügyféloldali kódban. Hozzon létre egy Blazor Web App, amely csak a kiszolgálóoldali renderelésre (SSR) támaszkodik az engedélyezési ellenőrzésekhez és a szabályérvényesítéshez.

Ha az engedélyezési szabályok betartatását, valamint az adatok és kódok biztonságát garantálni kell, ne dolgozzon ki ügyféloldali alkalmazást. Blazor Server-alkalmazás létrehozása.

Razor Lapok engedélyezési konvenciói nem vonatkoznak a kiszolgálható Razor komponensekre. Ha egy nem módosítható Razor összetevő beágyazott egy Razor Pages-alkalmazáslapjára, az oldal engedélyezési konvenciói közvetetten befolyásolják a Razor összetevőt, valamint a lap többi tartalmát.

ASP.NET Core Identity a HTTP kérés- és válaszkommunikáció kontextusában működik, amely általában nem az Blazor alkalmazás ügyfél-kiszolgáló kommunikációs modellje. ASP.NET Core alkalmazások, amelyek az ASP.NET Core Identity-t használják felhasználókezeléshez, a Razor-hoz kapcsolódó felhasználói felülethez használjanak Razor lapokat a Identity összetevők helyett, például a felhasználói regisztráció, bejelentkezés, kijelentkezés és egyéb felhasználókezelési feladatok esetén. A Razor feladatokat közvetlenül kezelő Identity összetevők létrehozása több forgatókönyv esetében is lehetséges, de a Microsoft nem javasolja vagy támogatja.

ASP.NET alapvető absztrakciók, például SignInManager<TUser> és UserManager<TUser>nem támogatottak Razor összetevőkben. Az ASP.NET Core IdentityBlazorhasználatával kapcsolatos további információkért lásd: Scaffold ASP.NET Core Identity kiszolgálóoldali Blazor alkalmazásba.

Jegyzet

A cikkben szereplő példakódok null értékű referenciatípusokat (NRT-ket) és .NET-fordító nullállapotú statikus elemzésivezetnek be, amelyeket a .NET 6-os vagy újabb verziójú ASP.NET Core támogat. Ha ASP.NET Core 5.0-s vagy korábbi verziójára céloz, távolítsa el a null típusú megjelölést (?) a jelen cikkben szereplő példákból.

Bizalmas adatok és hitelesítő adatok biztonságos karbantartása

Ne tárolja az alkalmazás titkos kulcsait, kapcsolati sztringeket, hitelesítő adatokat, jelszavakat, személyes azonosítószámokat (PIN-eket), titkos .NET/C#-kódot vagy titkos kulcsokat/jogkivonatokat az ügyféloldali kódban, amely mindig nem biztonságos. Az ügyféloldali Blazor kódnak egy ön által felügyelt biztonságos webes API-val kell hozzáférnie a biztonságos szolgáltatásokhoz és adatbázisokhoz.

Tesztelési/előkészítési és éles környezetekben a kiszolgálóoldali Blazor kód- és webes API-knak biztonságos hitelesítési folyamatokat kell használniuk, amelyek nem őrzik meg a hitelesítő adatokat a projektkódban vagy a konfigurációs fájlokban. A helyi fejlesztési tesztelésen kívül javasoljuk, hogy kerülje a környezeti változók bizalmas adatok tárolására való használatát, mivel a környezeti változók nem a legbiztonságosabb megközelítések. A helyi fejlesztési teszteléshez a Secret Manager eszköz ajánlott bizalmas adatok védelméhez. További információ:

Ügyféloldali és kiszolgálóoldali helyi fejlesztéshez és teszteléshez használja a Secret Manager eszközt a bizalmas hitelesítő adatok védelméhez.

Felügyelt identitások a Microsoft Azure-szolgáltatásokhoz

A Microsoft Azure-szolgáltatások esetében felügyelt identitások használatát javasoljuk. A felügyelt identitások biztonságosan hitelesíthetők az Azure-szolgáltatásokban anélkül, hogy hitelesítő adatokat tárolnak az alkalmazáskódban. További információ:

Hamisítás elleni támogatás

A Blazor sablon:

A AntiforgeryToken összetevő rejtett mezőként jeleníti meg az antiforgery tokent, és ezt az összetevőt automatikusan hozzáadják a form (EditForm) példányaihoz. További információért lásd: ASP.NET Core Blazor űrlapok áttekintése.

A AntiforgeryStateProvider szolgáltatás hozzáférést biztosít az aktuális munkamenethez társított antiforgery tokenhez. Injektálja a szolgáltatást, és hívja meg a GetAntiforgeryToken() metódust az aktuális AntiforgeryRequestTokenmegszerzéséhez. További információ: Webes API meghívása egy ASP.NET Core Blazor-alkalmazásból.

Blazor a kéréstokeneket az összetevő állapotban tárolja, ami garantálja, hogy a hamisítás elleni tokenek elérhetők legyenek az interaktív összetevők számára, még akkor is, ha nincs hozzáférésük a kéréshez.

Jegyzet

Antiforgery kárenyhítési csak akkor szükséges, ha application/x-www-form-urlencoded, multipart/form-datavagy text/plain kódolt űrlapadatokat küld a kiszolgálónak, mivel ezek az csak érvényes űrlap-enctípusok.

További információ:

Kiszolgálóoldali Blazor hitelesítés

A kiszolgálóoldali Blazor alkalmazások ugyanúgy vannak konfigurálva a biztonság érdekében, mint ASP.NET Core-alkalmazások. További információ: ASP.NET Alapvető biztonsági témakörök.

A hitelesítési környezet csak az alkalmazás indításakor jön létre, vagyis amikor az alkalmazás először csatlakozik a WebSockethez egy SignalR kapcsolaton keresztül, az ügyféllel. A hitelesítés egy cookie vagy más hozzáférési jogkivonaton alapulhat, de a hitelesítés a SignalR hubon keresztül és teljes egészében a áramkörön belül. A hitelesítési környezet az áramkör teljes élettartama alatt megmarad. Az alkalmazások 30 percenként rendszeresen újraértékelik a felhasználó hitelesítési állapotát.

Ha az alkalmazásnak egyéni szolgáltatásokhoz kell rögzítenie a felhasználókat, vagy reagálnia kell a felhasználó frissítésére, tekintse meg ASP.NET Core kiszolgálóoldali és Blazor Web App további biztonsági forgatókönyveket.

Blazor különbözik a hagyományos kiszolgáló által renderelt webalkalmazásoktól, amelyek minden oldalnavigáción cookie-kkal új HTTP-kéréseket tesznek. A rendszer ellenőrzi a hitelesítést a navigációs események során. A cookie-k azonban nem érintettek. A cookie-kat csak akkor küldi el a rendszer, ha HTTP-kérést küld egy kiszolgálónak, ami nem történik meg, amikor a felhasználó egy Blazor alkalmazásban navigál. A navigáció során a rendszer ellenőrzi a felhasználó hitelesítési állapotát a Blazor kapcsolatcsoporton belül, amelyet bármikor frissíthet a kiszolgálón az RevalidatingAuthenticationStateProvider absztrakcióshasználatával.

Fontos

Nem ajánlott egyéni NavigationManager implementálni a hitelesítés ellenőrzéséhez a navigáció során. Ha az alkalmazásnak egyéni hitelesítési állapotlogikát kell végrehajtania a navigáció során, használjon egy egyedi AuthenticationStateProvider.

Jegyzet

A cikkben szereplő példakódok null értékű referenciatípusokat (NRT-ket) és .NET-fordító nullállapotú statikus elemzésivezetnek be, amelyeket a .NET 6-os vagy újabb verziójú ASP.NET Core támogat. Ha ASP.NET Core 5.0-s vagy korábbi verziójára céloz, távolítsa el a null típusú megjelölést (?) a jelen cikkben szereplő példákból.

A beépített vagy egyéni AuthenticationStateProvider szolgáltatás az ASP.NET Core HttpContext.User-től szerzi meg a hitelesítési állapotadatokat. A hitelesítési állapot így integrálható a meglévő ASP.NET Core hitelesítési mechanizmusokkal.

További információ a kiszolgálóoldali hitelesítésről: ASP.NET Core Blazor hitelesítés és engedélyezés.

Megosztott állapot

A kiszolgálóoldali Blazor alkalmazások a kiszolgáló memóriájában élnek, és több alkalmazás-munkamenet is ugyanazon a folyamaton belül fut. Az egyes alkalmazás-munkamenetek során Blazor egy saját függőséginjektáló tárolóval indít el egy kört, így a hatókörön belüli szolgáltatások Blazor munkamenetenként egyediek.

Figyelmeztetés

Nem javasoljuk, hogy az azonos kiszolgálói megosztási állapotban lévő alkalmazások egyszeri szolgáltatásokat használjanak, kivéve, ha különös figyelmet igényelnek, mivel ez biztonsági réseket okozhat, például kiszivárogtathatja a felhasználói állapotot a kapcsolatcsoportok között.

Az állapotalapú egyszeri szolgáltatásokat Blazor alkalmazásokban is használhatja, ha kifejezetten erre tervezték őket. Az egytonos memóriagyorsítótár használata például elfogadható, mert a memória-gyorsítótárnak kulcsra van szüksége egy adott bejegyzés eléréséhez. Feltéve, hogy a felhasználók nem irányítják a gyorsítótárban használt gyorsítótárkulcsokat, a gyorsítótárban tárolt állapot nem szivárog ki a kapcsolatcsoportok között.

Az állapotkezeléssel kapcsolatos általános útmutatásért lásd: ASP.NET Core Blazor állapotkezelési.

Bizalmas adatok és hitelesítő adatok kiszolgálóoldali biztonsága

Tesztelési/előkészítési és éles környezetekben a kiszolgálóoldali Blazor kód- és webes API-knak biztonságos hitelesítési folyamatokat kell használniuk, amelyek nem őrzik meg a hitelesítő adatokat a projektkódban vagy a konfigurációs fájlokban. A helyi fejlesztési tesztelésen kívül javasoljuk, hogy kerülje a környezeti változók bizalmas adatok tárolására való használatát, mivel a környezeti változók nem a legbiztonságosabb megközelítések. A helyi fejlesztési teszteléshez a Secret Manager eszköz ajánlott bizalmas adatok védelméhez. További információ:

Ügyféloldali és kiszolgálóoldali helyi fejlesztéshez és teszteléshez használja a Secret Manager eszközt a bizalmas hitelesítő adatok védelméhez.

Projektsablon

Hozzon létre egy új kiszolgálóoldali Blazor alkalmazást az Tooling for ASP.NET Core Blazorcímű témakörben található útmutatást követve.

A kiszolgálóoldali alkalmazássablon kiválasztása és a projekt konfigurálása után válassza ki az alkalmazás hitelesítését Hitelesítési típus:

  • Nincs (alapértelmezett): Nincs hitelesítés.
  • egyéni fiókok: A felhasználói fiókok az alkalmazásban vannak tárolva a ASP.NET Core Identityhasználatával.
  • Nincs (alapértelmezett): Nincs hitelesítés.
  • egyéni fiókok: A felhasználói fiókok az alkalmazásban vannak tárolva a ASP.NET Core Identityhasználatával.
  • Microsoft identitásplatform: További információkért lásd: ASP.NET Core Blazor hitelesítés és engedélyezés.
  • Windows: Windows-hitelesítés használata.

Blazor Identity felhasználói felület (egyéni fiókok)

Blazor támogatja a teljes Blazoralapú Identity felhasználói felület létrehozását, amikor a egyéni fiókokhitelesítési lehetőséget választja.

A Blazor Web App sablon egy SQL Server-adatbázis Identity kódját tartalmazza. A parancssori verzió SQLite-t használ, és tartalmaz egy SQLite-adatbázist a(z) Identityszámára.

A sablon:

  • Támogatja az interaktív kiszolgálóoldali renderelést (interaktív SSR) és ügyféloldali renderelési (CSR) forgatókönyveket hitelesített felhasználókkal.
  • Hozzáadja IdentityRazor összetevőket és a kapcsolódó logikát a rutinhitelesítési feladatokhoz, például a felhasználók be- és kijelentkeztetéséhez. A Identity összetevők olyan speciális Identity funkciókat is támogatnak, mint például a fiók megerősítése és a jelszó-helyreállítási, valamint többtényezős hitelesítés külső alkalmazással. Vegye figyelembe, hogy maguk a Identity összetevők nem támogatják az interaktivitást.
  • Hozzáadja a Identitykapcsolódó csomagokat és függőségeket.
  • A Identity_Imports.razor csomagjaira hivatkozik.
  • Létrehoz egy egyéni felhasználói Identity osztályt (ApplicationUser).
  • Létrehoz és regisztrál egy EF Core adatbázis-környezetet (ApplicationDbContext).
  • A beépített Identity végpontok útválasztását konfigurálja.
  • Identity érvényesítési és üzleti logikát tartalmaz.

A keretrendszer összetevőinek vizsgálatához a projektsablon (referenciaforrás) mappájának és mappájában érheti el őket.

Amikor az Interaktív WebAssembly vagy az Interaktív automatikus renderelési módot választja, a kiszolgáló kezeli az összes hitelesítési és engedélyezési kérést, és a Identity összetevők statikusan jelennek meg a kiszolgálón a Blazor Web Appfő projektjében.

A keretrendszer egy egyéni AuthenticationStateProvider-t biztosít mind a kiszolgáló-, mind az ügyfélprojektekben (.Client), hogy továbbítja a felhasználó hitelesítési állapotát a böngészőbe. A kiszolgálóprojekt meghívja AddAuthenticationStateSerialization, míg az ügyfélprojekt AddAuthenticationStateDeserialization. Az ügyfél helyett a kiszolgálón történő hitelesítés lehetővé teszi az alkalmazás számára a hitelesítési állapot elérését az előrendelés során és a .NET WebAssembly futtatókörnyezet inicializálása előtt. Az egyéni AuthenticationStateProvider-implementációk az Állandó összetevő állapota szolgáltatás (PersistentComponentState) használatával szerializálják a hitelesítési állapotot HTML-megjegyzésekbe, majd a WebAssemblyből olvassák vissza egy új AuthenticationState-példány létrehozásához. További információ: Hitelesítési állapot kezelése Blazor Web App szakaszában.

Csak interaktív kiszolgálói megoldások esetén IdentityRevalidatingAuthenticationStateProvider (referenciaforrás) egy kiszolgálóoldali AuthenticationStateProvider, amely 30 percenként újraellenőrzi a csatlakoztatott felhasználó biztonsági pecsétjét, amikor egy interaktív kapcsolat van létrehozva.

Amikor az Interaktív WebAssembly vagy az Interaktív automatikus renderelési módot választja, a kiszolgáló kezeli az összes hitelesítési és engedélyezési kérést, és a Identity összetevők statikusan jelennek meg a kiszolgálón a Blazor Web Appfő projektjében. A projektsablon tartalmaz egy PersistentAuthenticationStateProvider osztályt (referenciaforrást) a .Client projektben a felhasználó hitelesítési állapotának szinkronizálásához a kiszolgáló és a böngésző között. Az osztály a AuthenticationStateProvideregyéni implementációja. A szolgáltató az Állandó összetevő állapota szolgáltatás (PersistentComponentState) használatával előrerendeli a hitelesítési állapotot, és megőrzi azt a lapon.

Egy Blazor Web Appfő projektjében a hitelesítési állapotszolgáltató neve IdentityRevalidatingAuthenticationStateProvider (referenciaforrás) (csak kiszolgáló interaktivitási megoldásai) vagy PersistingRevalidatingAuthenticationStateProvider (referenciaforrás) (WebAssembly vagy Automatikus interaktivitási megoldások).

az olyan példányoktól függ, amelyek nem a(z)gyártó által lettek létrehozva, ami szándékos, mert elegendő ahhoz, hogy a projektsablon összetevői statikusan, interaktivitás támogatása nélkül renderelődjenek.

A globális interaktív renderelési módok nemIdentity összetevőkre való alkalmazásáról, valamint a statikus SSR kényszerítéséről az Identity-összetevőkhöz, lásd ASP.NET Core Blazor renderelési módokat.

Az előrerendelt állapot megőrzéséről további információt Prerender ASP.NET Core Razor-összetevőkcímű cikkben talál.

Jegyzet

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék váltása legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

Hitelesítési állapot kezelése Blazor Web Apps-ben

Ez a szakasz a következő Blazor Web App-re vonatkozik:

  • Egyéni fiókok
  • ügyféloldali renderelés (CSR, WebAssembly-alapú interaktivitás).

Az ügyféloldali hitelesítési állapotszolgáltató csak a Blazor belül használható, és nem integrálva van a ASP.NET Core hitelesítési rendszerrel. Az előrendelés során Blazor tiszteletben tartja a lapon definiált metaadatokat, és a ASP.NET Core hitelesítési rendszer használatával állapítja meg, hogy a felhasználó hitelesítése megtörtént-e. Amikor egy felhasználó egyik oldalról a másikra navigál, a rendszer ügyféloldali hitelesítésszolgáltatót használ. Amikor a felhasználó frissíti a lapot (teljes oldal újrabetöltése), az ügyféloldali hitelesítési állapotszolgáltató nem vesz részt a kiszolgáló hitelesítési döntésében. Mivel a kiszolgáló nem őrzi meg a felhasználó állapotát, az ügyféloldalon tárolt hitelesítési állapot elveszik.

Ennek megoldásához a legjobb módszer a hitelesítés végrehajtása a ASP.NET Core hitelesítési rendszeren belül. Az ügyféloldali hitelesítési állapotszolgáltató csak a felhasználó hitelesítési állapotát tükrözi. A hitelesítési állapotszolgáltatókkal való végrehajtására vonatkozó példákat a Blazor Web App projektsablon szemlélteti, és az alábbiakban ismertetjük.

A kiszolgálóprojekt Program fájljában hívja meg a AddAuthenticationStateSerialization-t, amely szerializálja a kiszolgálóoldali AuthenticationState által visszaadott AuthenticationStateProvider-t az Állandó Összetevő Állapota szolgáltatás (PersistentComponentState) segítségével:

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization();

Az API csak a kiszolgálóoldali nevet és a szerepkör-jogcímeket szerializálja a böngészőben való hozzáféréshez. Az összes jogcím belefoglalásához állítsa SerializeAllClaims értékét true-re a AddAuthenticationStateSerializationkiszolgálóoldali hívásában.

builder.Services.AddRazorComponents()
    .AddInteractiveWebAssemblyComponents()
    .AddAuthenticationStateSerialization(
        options => options.SerializeAllClaims = true);

Az ügyfél (.Client) projektjének Program fájljában hívja meg a AddAuthenticationStateDeserialization-t, amely hozzáad egy AuthenticationStateProvider-at, ahol a AuthenticationState deszerializálódik a szerverről a AuthenticationStateData használatával és a Komponens Állapot Szolgáltatással (PersistentComponentState). A kiszolgálóprojektben megfelelő hívás van AddAuthenticationStateSerialization-ra.

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

Jegyzet

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék váltása legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

Állványzat Identity

További információért arról, hogyan alapozható meg a Identity egy kiszolgálóoldali Blazor alkalmazásban, lásd: Állománygenerálás az ASP.NET Core-projektekben Identity.

Állványzat Identity kiszolgálóoldali Blazor alkalmazásba:

További jogcímek és jogkivonatok külső szolgáltatóktól

A külső szolgáltatóktól származó további jogcímek tárolásához lásd: További jogcímek és jogkivonatok megőrzése külső szolgáltatóktól ASP.NET Core.

Azure App Service Linux-on Identity szerverrel

Adja meg kifejezetten a kiállítót, amikor az Azure App Service-et Linuxon telepíti a Identity Serverrel. További információ: Az Identity használata webes API-háttérrendszer biztonságossá tételéhez az SLA-khoz.

Szolgáltatások komponenshez kötött hatókörrel történő injektálása AuthenticationStateProvider használatával

Ne próbálja meg feloldani az egyéni hatókörön belüli AuthenticationStateProvider, mert az a AuthenticationStateProvider nem megfelelően inicializált új példányának létrehozását eredményezi.

A AuthenticationStateProvider egy összetevőhöz hatókörölt szolgáltatásban való eléréséhez fecskendezze be a AuthenticationStateProvider-et a @inject irányelv vagy a [Inject] attribútum segítségével, és adja át paraméterként a szolgáltatásnak. Ez a módszer biztosítja, hogy a AuthenticationStateProvider megfelelő inicializált példánya legyen használatban minden felhasználói alkalmazáspéldányhoz.

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

Regisztrálja a szolgáltatást hatókörként. A kiszolgálóoldali Blazor-alkalmazásokban a hatókörrel rendelkező szolgáltatások élettartama megegyezik az ügyfélkapcsolat kapcsolatcsoportidőtartamával.

A Program fájlban:

builder.Services.AddScoped<ExampleService>();

A(z) Startup.ConfigureServicesStartup.cs-ben:

services.AddScoped<ExampleService>();

Az alábbi InjectAuthStateProvider összetevőben:

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

További információért lásd a OwningComponentBase útmutatást az ASP.NET Core Blazor függőségi injektálásról.

Jogosulatlan tartalommegjelenítés egyéni AuthenticationStateProvider előkészítés közben

A jogosulatlan tartalom megjelenítésének elkerülése érdekében, például egy AuthorizeView-összetevőben lévő tartalom, miközben egy egyéni AuthenticationStateProviderelőrendelt, az alábbi módszerek :

  • A renderelés előzetes letiltása: A renderelési módot a prerender paraméter false-re állításával jelezze az alkalmazás összetevőhierarchiájának legfelső szintű összetevőjénél, amely nem gyökérösszetevő.

    Jegyzet

    A gyökérösszetevő interaktívvá tétele, például a App összetevő nem támogatott. Ezért a App összetevő nem tilthatja le közvetlenül az előzetes rendezést.

    A Blazor Web App projektsablonon alapuló alkalmazások esetében az előrendelés általában le van tiltva, ha a Routes összetevőt a App összetevőben (Components/App.razor) használják:

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

    Emellett tiltsa le az előbetöltést a HeadOutlet összetevőnél:

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

    A Routes összetevőpéldányra alkalmazott renderelési módot is szelektíven szabályozhatja. Lásd például ASP.NET Core Blazor renderelési módokat.

  • A prerendelés letiltása: Nyissa meg a _Host.cshtml fájlt, és módosítsa a render-mode attribútumát Server-re:

    <component type="typeof(App)" render-mode="Server" />
    
  • A felhasználó hitelesítése a kiszolgálón az alkalmazás indítása előtt: Ennek a módszernek a használatához az alkalmazásnak válaszolnia kell a felhasználó kezdeti kérésére a Identity-alapú bejelentkezési oldalon, vagy meg kell tekintenie, és meg kell akadályoznia az Blazor végpontokra irányuló kéréseket a hitelesítésükig. További információ: ASP.NET Core-alkalmazás létrehozása engedélyezésiáltal védett felhasználói adatokkal. A hitelesítés után az előre meghatározott Razor összetevőkben lévő jogosulatlan tartalom csak akkor jelenik meg, ha a felhasználó valóban jogosulatlanul tekinti meg a tartalmat.

Felhasználói állapotkezelés

Annak ellenére, hogy a névben az "állapot" szó szerepel, AuthenticationStateProvider nem általános felhasználói állapottárolásához van. AuthenticationStateProvider csak a felhasználó hitelesítési állapotát jelzi az alkalmazásnak, hogy be van-e jelentkezve az alkalmazásba, és hogy kiként van bejelentkezve.

A hitelesítés ugyanazt a ASP.NET Core Identity-hitelesítést használja, mint Razor Pages és MVC-alkalmazások. A ASP.NET Core Identity felhasználói állapota áramlik Blazor felé anélkül, hogy az alkalmazáshoz további kódot kellene hozzáadni. Kövesse az ASP.NET Core Identity cikkeit és oktatóanyagait, hogy a Identity funkciók érvénybe léphessenek az alkalmazás Blazor részeiben.

Általános állapotkezeléssel kapcsolatos útmutatásért, amely az ASP.NET Core Identitykívül esik, lásd: ASP.NET Core Blazor állapotkezelési.

További biztonsági absztrakciók

Két további absztrakció is részt vesz a hitelesítési állapot kezelésében:

Jegyzet

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék váltása legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

Hitelesítési állapotkezelés kijelentkezéskor

A kiszolgálóoldali Blazor a kapcsolatcsoport teljes élettartama alatt megőrzi a felhasználói hitelesítési állapotot, beleértve a böngészőlapokat is. Ahhoz, hogy egy felhasználót proaktívan kijelentkeztessen minden böngészőfülön, amikor ő kijelentkezik az egyik fülön, implementálnia kell egy rövid RevalidatingServerAuthenticationStateProvider-t egy -val (RevalidationInterval).

Jegyzet

A .NET referenciaforrásra mutató dokumentációs hivatkozások általában betöltik az adattár alapértelmezett ágát, amely a .NET következő kiadásának aktuális fejlesztését jelöli. Egy adott kiadás címkéjének kiválasztásához használja az Ágak vagy címkék váltása legördülő listát. További információ: A ASP.NET Core-forráskód (dotnet/AspNetCore.Docs #26205) verziócímkéjének kiválasztása.

Ideiglenes átirányítási URL-cím érvényességi időtartama

Ez a szakasz Blazor Web Apps.

A RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration opció segítségével lekérheti vagy beállíthatja az ASP.NET Core Data Protection érvényességi időtartamát a Blazor kiszolgálóoldali renderelés által kibocsátott ideiglenes átirányító URL-címekhez. Ezeket csak átmenetien használják, így az élettartamnak csak elég hosszúnak kell lennie ahhoz, hogy egy ügyfél megkapja az URL-címet, és navigálást kezdjen rajta. Azonban elég hosszúnak kell lennie ahhoz is, hogy az óraeltérés engedélyezhető legyen a kiszolgálók között. Az alapértelmezett érték öt perc.

Az alábbi példában az érték hét percre van kiterjesztve:

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

Ügyféloldali Blazor hitelesítés

Az ügyféloldali Blazor alkalmazásokban az ügyféloldali hitelesítési ellenőrzések megkerülhetők, mert az ügyféloldali kódokat a felhasználók módosíthatják. Ugyanez érvényes minden ügyféloldali alkalmazástechnológiára, beleértve a JavaScript SPA-keretrendszereket és a natív alkalmazásokat bármely operációs rendszerhez.

Adja hozzá a következőket:

A hitelesítés kezeléséhez használja a beépített vagy egyéni AuthenticationStateProvider szolgáltatást.

További információ az ügyféloldali hitelesítésről: Biztonságos ASP.NET Core Blazor WebAssembly.

AuthenticationStateProvider szolgáltatás

AuthenticationStateProvider a AuthorizeView összetevő és a kaszkádolt hitelesítési szolgáltatások által a felhasználó hitelesítési állapotának lekéréséhez használt mögöttes szolgáltatás.

AuthenticationStateProvider az AuthorizeView összetevő és CascadingAuthenticationState összetevő által a felhasználó hitelesítési állapotának lekéréséhez használt mögöttes szolgáltatás.

Általában nem szoktad közvetlenül használni a AuthenticationStateProvider-t. Használja a cikk későbbi részében ismertetett AuthorizeView összetevő vagy Task<AuthenticationState> megközelítéseit. A AuthenticationStateProvider közvetlen használatának fő hátránya, hogy a rendszer nem értesíti automatikusan az összetevőt, ha a mögöttes hitelesítési állapot adatai megváltoznak.

Egyéni AuthenticationStateProviderimplementálásához tekintse meg ASP.NET Core Blazor hitelesítési állapotcímű témakört, amely útmutatást tartalmaz a felhasználói hitelesítési állapot változásértesítések implementálásához.

Felhasználó jogcímeinek egyszerű adatainak beszerzése

A AuthenticationStateProvider szolgáltatás az aktuális felhasználó ClaimsPrincipal adatait is meg tudja adni az alábbi példában látható módon.

ClaimsPrincipalData.razor:

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

<h1>ClaimsPrincipal Data</h1>

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

<p>@authMessage</p>

@if (claims.Any())
{
    <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.";
        }
    }
}

Az előző példában:

  • ClaimsPrincipal.Claims visszaadja a felhasználó igényeit (claims) a felhasználói felületen való megjelenítés céljából.
  • A felhasználó vezetéknevét (surname) beolvasó sor meghívja a ClaimsPrincipal.FindAll-et egy predikátum használatával a felhasználó követeléseinek szűrésére.
@page "/claims-principal-data"
@using System.Security.Claims
@inject AuthenticationStateProvider AuthenticationStateProvider

<h1>ClaimsPrincipal Data</h1>

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

<p>@authMessage</p>

@if (claims.Any())
{
    <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.";
        }
    }
}

Ha user.Identity.IsAuthenticatedtrue, és mivel a felhasználó ClaimsPrincipal, a követelések számba vehetők, és a szerepkörök tagsága kiértékelhető.

A függőséginjektálással (DI) és a szolgáltatásokkal kapcsolatos további információkért lásd az alábbiakat: ASP.NET Core Blazor függőséginjektálásra és a függőséginjektálás ASP.NET Core-ban. Az egyéni AuthenticationStateProviderimplementálásáról további információt a ASP.NET Core Blazor hitelesítési állapotánakcímű témakörben talál.

A hitelesítési állapot kaszkádolt paraméterként való felfedése

Ha hitelesítési állapotadatokra van szükség a procedurális logikához, például a felhasználó által aktivált művelet végrehajtásakor, szerezze be a hitelesítési állapot adatait egy kaszkádolt paraméterTask<AuthenticationState>típus meghatározásával, ahogyan az alábbi példa is mutatja.

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

Ha user.Identity.IsAuthenticatedtrue, a jogcímek felsorolhatók, és kiértékelhető a szerepkörökhöz való tartozás.

Állítsa be a Task<AuthenticationState>kaszkádolt paramétert a AuthorizeRouteView és a kaszkádolt hitelesítési állapotszolgáltatások használatával.

Amikor egy Blazor alkalmazást hoz létre az egyik Blazor-projektsablonból, ahol a hitelesítés engedélyezve van, az alkalmazás az alábbi példában bemutatott AuthorizeRouteView-t és AddCascadingAuthenticationState hívását tartalmazza. Az ügyféloldali Blazor-alkalmazások tartalmazzák a szükséges szolgáltatásregisztrációkat is. További információt a Jogosulatlan tartalom testreszabása a Router összetevő szakaszában talál.

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

A Program fájlban regisztrálja a kaszkádolt hitelesítési állapotszolgáltatásokat:

builder.Services.AddCascadingAuthenticationState();

Állítsa be a Task<AuthenticationState>kaszkádolt paramétert a AuthorizeRouteView és CascadingAuthenticationState összetevők használatával.

Amikor Blazor alkalmazást hoz létre az egyik Blazor projektsablonból, amelyen engedélyezve van a hitelesítés, az alkalmazás tartalmazza az alábbi példában látható AuthorizeRouteView és CascadingAuthenticationState összetevőket. Az ügyféloldali Blazor-alkalmazások tartalmazzák a szükséges szolgáltatásregisztrációkat is. További információt a Jogosulatlan tartalom testreszabása a Router összetevő szakaszában talál.

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

Jegyzet

A ASP.NET Core 5.0.1 kiadásával és minden további 5.x kiadás esetén a Router összetevő tartalmazza a PreferExactMatches paramétert @true. További információért lásd: Az ASP.NET Core 3.1-ről 5.0-ra történő migrálás.

Ügyféloldali Blazor alkalmazásban adja hozzá az engedélyezési szolgáltatásokat a Program fájlhoz:

builder.Services.AddAuthorizationCore();

Ügyféloldali Blazor alkalmazásban adja hozzá a beállításokat és az engedélyezési szolgáltatásokat a Program fájlhoz:

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

A kiszolgálóoldali Blazor-alkalmazásokban már elérhetők a beállítások és az engedélyezés szolgáltatásai, ezért további lépésekre nincs szükség.

Felhatalmazás

A felhasználó hitelesítése után engedélyezési szabályok vonatkoznak a felhasználó által elvégezhető műveletek szabályozására.

A hozzáférés általában a következőtől függően adható meg vagy tagadható meg:

  • A rendszer hitelesíti a felhasználót (bejelentkezve).
  • A felhasználó szerepkörrel rendelkezik.
  • A felhasználónak jogcíme.
  • Egy szabályzat teljesül.

Ezek a fogalmak ugyanazok, mint egy ASP.NET Core MVC vagy Razor Pages alkalmazásban. Az ASP.NET Core-biztonságról további információt a ASP.NET Core Security és Identitycímű témakörben talál.

AuthorizeView összetevő

A AuthorizeView összetevő szelektíven jeleníti meg a felhasználói felület tartalmát attól függően, hogy a felhasználó jogosult-e rá. Ez a módszer akkor hasznos, ha csak kell megjelenítenie adatokat a felhasználó számára, és nem kell a felhasználó identitását eljárási logikában használnia.

Az összetevő egy context típusú AuthenticationState (@contextRazor szintaxisban) változót tesz elérhetővé, amellyel hozzáférhet a bejelentkezett felhasználó adataihoz:

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

Ha a felhasználó nem rendelkezik a Authorized és NotAuthorized paraméterek kombinációjával, különböző tartalmakat is megjeleníthet:

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

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

Bár a AuthorizeView összetevő a felhasználó engedélyezési állapota alapján szabályozza az elemek láthatóságát, maga az eseménykezelő biztonságát nem biztosítja. Az előző példában a HandleClick metódus csak a jogosult felhasználók számára látható gombhoz van társítva, de semmi sem akadályozza meg a metódus más helyekről való meghívását. A metódusszintű biztonság biztosítása érdekében implementáljon további engedélyezési logikát magában a kezelőben vagy a megfelelő API-ban.

Razor Blazor Web Appösszetevői soha nem jelenítik meg <NotAuthorized> tartalmat, ha az engedélyezés kiszolgálóoldalon meghiúsul a statikus kiszolgálóoldali renderelés (statikus SSR) során. A kiszolgálóoldali ASP.NET Core-folyamat a kiszolgálón dolgozza fel az engedélyezést. Használjon kiszolgálóoldali technikákat a jogosulatlan kérések kezeléséhez. További információ: ASP.NET Core Blazor renderelési módok.

Figyelmeztetés

Az ügyféloldali jelölőnyelv és a AuthorizeView-hoz társított metódusok csak a által megjelenített felhasználói felület az ügyféloldali Blazor-alkalmazásokban védettek a megtekintéstől és a végrehajtástól. Az ügyféloldali Blazorengedélyezett tartalmainak és biztonságos módszereinek védelme érdekében a tartalmat általában egy biztonságos, engedélyezett webes API-hívás biztosítja egy kiszolgálói API-hoz, és soha nem tárolja az alkalmazásban. További információ: Webes API meghívása egy ASP.NET Core Blazor-alkalmazásból és ASP.NET Core Blazor WebAssembly további biztonsági forgatókönyvek.

A Authorized és NotAuthorized tartalma tetszőleges elemeket tartalmazhat, például más interaktív összetevőket.

Az engedélyezési feltételekre, például a felhasználói felület beállításait vagy a hozzáférést vezérlő szerepkörökre vagy szabályzatra az Engedélyezési szakasz vonatkozik.

Ha nincsenek megadva engedélyezési feltételek, AuthorizeView egy alapértelmezett szabályzatot használ:

  • A hitelesített (bejelentkezett) felhasználók engedélyezettek.
  • A nem hitelesített (kijelentkezett) felhasználók nem engedélyezettek.

A AuthorizeView összetevő a NavMenu összetevőben (Shared/NavMenu.razor) használható egy NavLink összetevő (NavLink) megjelenítéséhez, de vegye figyelembe, hogy ez a módszer csak a listaelemet távolítja el a renderelt kimenetből. Ez nem akadályozza meg a felhasználót abban, hogy az összetevőre navigáljon. Az engedélyezést külön implementálja a célösszetevőben.

Szerepköralapú és szabályzatalapú engedélyezés

A AuthorizeView összetevő támogatja szerepköralapú vagy szabályzatalapú-engedélyezést.

Szerepköralapú engedélyezéshez használja a Roles paramétert. Az alábbi példában a felhasználónak rendelkeznie kell a Admin vagy Superuser szerepkörökhöz tartozó szerepkör-jogcímpel:

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

Ha azt szeretné, hogy egy felhasználó Admin és Superuser szerepkör-jogcímekkel is rendelkezzen, ágyazza be a(z) AuthorizeView összetevőket.

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

Az előző kód létrehoz egy Context-t a belső AuthorizeView összetevőhöz, hogy megakadályozza a AuthenticationState összefüggés ütközését. A AuthenticationState kontextus a külső AuthorizeView-ben érhető el a kontextus elérésének szabványos megközelítésével (@context.User). A környezet a belső AuthorizeView érhető el a nevesített innerContext környezettel (@innerContext.User).

További információért, a konfigurációról szóló útmutatást is beleértve, tekintse meg a szerepkör alapú engedélyezést az ASP.NET Core-ban .

Szabályzatalapú engedélyezéshez használja a Policy paramétert egyetlen házirendnévvel:

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

Annak az esetnek a kezeléséhez, amikor a felhasználónak meg kell felelnie a különböző szabályzatok egyikének, hozzon létre egy szabályzatot, amely megerősíti, hogy a felhasználó más szabályzatoknak is megfelel.

Ha azt az esetet szeretné kezelni, amikor a felhasználónak egyszerre több szabályzatot is teljesítenie kell, az alábbi módszerek:

  • Hozzon létre egy szabályzatot AuthorizeView, amely megerősíti, hogy a felhasználó több más szabályzatnak is megfelel.

  • A szabályzatok beágyazása több AuthorizeView összetevőbe:

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

A jogcímalapú engedélyezés a szabályzatalapú engedélyezés speciális esete. Meghatározhat például egy olyan szabályzatot, amely megköveteli, hogy a felhasználók rendelkezzenek egy adott jogcímre. További információkért lásd: Szabályzatalapú jogosultságkezelés az ASP.NET Core-ban.

Ha sem Roles, sem Policy nincs megadva, AuthorizeView az alapértelmezett házirendet használja:

  • A hitelesített (bejelentkezett) felhasználók engedélyezettek.
  • A nem hitelesített (kijelentkezett) felhasználók nem engedélyezettek.

Mivel a .NET-sztringek összehasonlítása megkülönbözteti a kis- és nagybetűket, az egyező szerepkör- és szabálynevek is megkülönböztetik a kis- és nagybetűket. A Admin (nagybetűs A) például nem ugyanaz a szerepkör, mint a admin (kisbetűs a).

A Pascal-esetet általában szerepkör- és szabályzatnevekhez (például BillingAdministrator) használják, de a Pascal-eset használata nem szigorú követelmény. Különböző elnevezési sémák, mint például a camel case, kebab case és snake case engedélyezettek. A szerepkör- és szabályzatnevekben lévő szóközök használata szokatlan, de a keretrendszer engedélyezi. A billing administrator például egy szokatlan szerepkör vagy szabályzatnév formátum a .NET-alkalmazásokban, de érvényes szerepkör vagy szabályzatnév.

Az aszinkron hitelesítés során megjelenített tartalom

Blazor lehetővé teszi, hogy a hitelesítési állapotot aszinkron módonmeghatározzák. Ennek a megközelítésnek az elsődleges forgatókönyve az ügyféloldali Blazor alkalmazásokban van, amelyek hitelesítés céljából külső végpontra kérnek kérelmet.

Amíg a hitelesítés folyamatban van, AuthorizeView nem jelenít meg tartalmat. Ha a hitelesítés során tartalmat szeretne megjeleníteni, rendeljen hozzá tartalmat a Authorizing paraméterhez:

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

Ez a megközelítés általában nem alkalmazható a kiszolgálóoldali Blazor-alkalmazásokra. A kiszolgálóoldali Blazor-alkalmazások az állapot létrehozása után azonnal ismerik a hitelesítési állapotot. Authorizing tartalmakat az alkalmazás AuthorizeView összetevőjében lehet megadni, de a tartalom soha nem jelenik meg.

[Authorize] attribútum

A [Authorize] attribútumRazor összetevőkben érhető el:

@page "/"
@attribute [Authorize]

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

Fontos

Csak a [Authorize] útválasztón keresztül elért @page összetevőkhöz használja a Blazor-t. Az engedélyezés csak az útválasztás szempontjából történik, és nem az oldalon megjelenített gyermekösszetevők esetében. Ha engedélyezni szeretné az egyes részek megjelenítését egy lapon, használja inkább a AuthorizeView.

A [Authorize] attribútum a szerepköralapú vagy szabályzatalapú engedélyezést is támogatja. Szerepköralapú engedélyezéshez használja a Roles paramétert:

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

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

Szabályzatalapú engedélyezéshez használja a Policy paramétert:

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

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

Ha sem Roles, sem Policy nincs megadva, [Authorize] az alapértelmezett házirendet használja:

  • A hitelesített (bejelentkezett) felhasználók engedélyezettek.
  • A nem hitelesített (kijelentkezett) felhasználók nem engedélyezettek.

Ha a felhasználónak nincs jogosultsága, és ha az alkalmazás nem testre szabja a nem engedélyezett tartalmat a Router összetevővel, a keretrendszer automatikusan megjeleníti a következő tartalék üzenetet:

Not authorized.

Erőforrás-engedélyezés

Ha engedélyezni szeretné a felhasználók számára az erőforrásokat, adja át a kérés útvonaladatait a ResourceAuthorizeRouteView paraméterének.

A kért útvonal Router.Found tartalma:

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

Az engedélyezési állapot adatainak átadásáról és a folyamatlogikában való használatáról a A hitelesítési állapot kaszkádolt paraméterként való felfedése szakaszban talál további információt.

Amikor a AuthorizeRouteView megkapja az erőforrás útvonaladatait, az autorizációs szabályzatok hozzáférhetnek RouteData.PageType-hez és RouteData.RouteValues-höz, ami lehetővé teszi az egyéni logika számára az engedélyezési döntések meghozatalát.

Az alábbi példában egy EditUser szabályzatot hoznak létre AuthorizationOptions az alkalmazás engedélyezési szolgáltatásának konfigurációjához (AddAuthorizationCore) a következő logikával:

  • Állapítsa meg, hogy létezik-e útvonalérték idkulccsal. Ha a kulcs létezik, az útvonalnak az értékét a valuetárolja.
  • Egy idnevű változóban tárolja a value sztringként, vagy állítson be egy üres sztringértéket (string.Empty).
  • Ha id nem üres karakterlánc, győződjünk meg arról, hogy a szabályzat teljesül, ha a karakterlánc értéke true-vel kezdődik (EMPvisszaadása). Ellenkező esetben érvényesítse, hogy a szabályzat meghiúsul (falsevisszaadása).

A Program fájlban:

  • Adja hozzá a névtereket: Microsoft.AspNetCore.Components és System.Linq.

    using Microsoft.AspNetCore.Components;
    using System.Linq;
    
  • Adja hozzá a szabályzatot:

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

Az előző példa egy túlsimított engedélyezési szabályzat, amely csupán egy működő példával szemlélteti a koncepciót. Az engedélyezési szabályzatok létrehozásával és konfigurálásával kapcsolatos további információkért lásd szabályzatalapú engedélyezést ASP.NET Core.

Az alábbi EditUser összetevőben az erőforrás /users/{id}/edit rendelkezik egy útvonalparaméterrel a felhasználó azonosítójára ({id}). Az összetevő az előzetes EditUser engedélyezési szabályzattal határozza meg, ha a id útvonalértéke a EMP-vel kezdődik. Ha idEMPkezdődik, a szabályzat sikeres lesz, és az összetevőhöz való hozzáférés engedélyezve van. Ha id nem EMP értékkel kezdődik, vagy ha id üres sztring, a szabályzat meghiúsul, és az összetevő nem töltődik be.

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

Jogosulatlan tartalom testreszabása a Router összetevővel

A Router összetevő a AuthorizeRouteView összetevővel együtt lehetővé teszi, hogy az alkalmazás egyéni tartalmat adjon meg, ha:

  • A felhasználó nem tud [Authorize] feltételt alkalmazni az összetevőre. Megjelenik a <NotAuthorized> elem jelölése. A [Authorize] attribútumot az [Authorize] attribútum szakasz ismerteti.
  • Az aszinkron engedélyezés folyamatban van, ami általában azt jelenti, hogy a felhasználó hitelesítésének folyamata folyamatban van. Megjelenik a <Authorizing> elem jelölése.

Fontos

Blazor <NotAuthorized> és <NotFound> tartalmat megjelenítő útválasztó-funkciók nem működnek a statikus kiszolgálóoldali renderelés (statikus SSR) során, mert a kérésfeldolgozást teljes egészében a ASP.NET Core köztes szoftverfolyamat-kérések feldolgozása kezeli, és a Razor összetevők egyáltalán nem jelennek meg jogosulatlan vagy rossz kérések esetén. Kiszolgálóoldali technikákkal kezelheti a statikus SSR során felmerülő jogosulatlan és rossz kéréseket. További információ: ASP.NET Core Blazor renderelési módok.

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

A Authorized és NotAuthorized tartalma tetszőleges elemeket tartalmazhat, például más interaktív összetevőket.

Jegyzet

Az előzőhöz kaszkádolt hitelesítési állapotszolgáltatások regisztrációja szükséges az alkalmazás Program fájljában:

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

A NotFound, Authorizedés NotAuthorized tartalma tetszőleges elemeket tartalmazhat, például más interaktív összetevőket.

Ha nincs megadva NotAuthorized tartalom, a AuthorizeRouteView a következő tartalék üzenetet használja:

Not authorized.

A Blazor WebAssembly projektsablonból létrehozott, engedélyezett hitelesítéssel rendelkező alkalmazás tartalmaz egy RedirectToLogin összetevőt, amely a <NotAuthorized> összetevő Router tartalmában van elhelyezve. Ha egy felhasználó nincs hitelesítve (context.User.Identity?.IsAuthenticated != true), a RedirectToLogin összetevő átirányítja a böngészőt a authentication/login végpontra hitelesítés céljából. A rendszer az identitásszolgáltatóval való hitelesítés után visszaadja a felhasználót a kért URL-címre.

Eljárási logika

Ha az alkalmazásnak az eljárási logika részeként ellenőriznie kell az engedélyezési szabályokat, használjon Task<AuthenticationState> típusú kaszkádolt paramétert a felhasználó ClaimsPrincipalbeszerzéséhez. Task< AuthenticationState > más szolgáltatásokkal, például IAuthorizationServicekombinálhatók a szabályzatok kiértékeléséhez.

Az alábbi példában:

  • A user.Identity.IsAuthenticated végrehajtja a hitelesített (bejelentkezett) felhasználók kódját.
  • A user.IsInRole("admin") végrehajtja a "Rendszergazda" szerepkörben lévő felhasználók kódját.
  • A (await AuthorizationService.AuthorizeAsync(user, "content-editor")).Succeeded a tartalomszerkesztő szabályzatnak megfelelő felhasználók kódját hajtja végre.

A kiszolgálóoldali Blazor-alkalmazások tartalmazzák a projektsablonból létrehozott megfelelő névtereket. Ügyféloldali Blazor alkalmazásban erősítse meg a Microsoft.AspNetCore.Authorization és Microsoft.AspNetCore.Components.Authorization névterek jelenlétét az összetevőben vagy az alkalmazás _Imports.razor fájljában:

@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)
                {
                    // ...
                }
            }
        }
    }
}

Hibák elhárítása

Gyakori hibák:

  • Az engedélyezéshez Task<AuthenticationState>típusú kaszkádolt paraméter szükséges. Fontolja meg a CascadingAuthenticationState használatát ennek biztosításához.

  • anull értéket kapja a authenticationStateTask-hoz

Valószínű, hogy a projektet nem kiszolgálóoldali Blazor sablonnal hozták létre, amelyen engedélyezve van a hitelesítés.

.NET 7-es vagy korábbi verziókban csomagolja a <CascadingAuthenticationState>-t a felhasználói felületi fa egy része köré, például a Blazor router köré:

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

A .NET 8 vagy újabb verzióiban ne használja a CascadingAuthenticationState összetevőt:

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

Ehelyett adjon hozzá kaszkádolt hitelesítési állapotszolgáltatásokat a szolgáltatásgyűjteményhez a Program fájlban:

builder.Services.AddCascadingAuthenticationState();

A CascadingAuthenticationState összetevő (.NET 7 vagy korábbi) vagy a AddCascadingAuthenticationState (.NET 8 vagy újabb) által nyújtott szolgáltatások biztosítják a Task<AuthenticationState> kaszkádolt paramétert, amelyet a mögöttes AuthenticationStateProvider függőséginjektáló szolgáltatástól kap.

Személyazonosításra alkalmas adatok (PII)

A Microsoft a GDPR definícióját használja a "személyes adatok" (GDPR 4.1), amikor a dokumentáció a személyazonosításra alkalmas adatokat (PII) tárgyalja.

A PII bármely azonosított vagy azonosítható természetes személyre vonatkozó információt tartalmaz. Azonosítható természetes személy az, aki közvetlenül vagy közvetve az alábbiak bármelyikével azonosítható:

  • Név
  • Azonosító szám
  • Helyszín koordinátái
  • Online azonosító
  • Egyéb konkrét tényezők
    • Fizikai
    • Fiziológiai
    • Genetika
    • Mentális (pszichológiai)
    • Gazdasági
    • Kulturális
    • Közösségi identitás

További erőforrások