Bagikan melalui


Mengamankan aplikasi sisi Blazor server ASP.NET Core

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Peringatan

Versi ASP.NET Core ini tidak lagi didukung. Untuk informasi selengkapnya, lihat Kebijakan Dukungan .NET dan .NET Core. Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Penting

Informasi ini berkaitan dengan produk pra-rilis yang mungkin dimodifikasi secara substansial sebelum dirilis secara komersial. Microsoft tidak memberikan jaminan, tersirat maupun tersurat, sehubungan dengan informasi yang diberikan di sini.

Untuk rilis saat ini, lihat versi .NET 8 dari artikel ini.

Artikel ini menjelaskan cara mengamankan aplikasi sisi Blazor server sebagai aplikasi ASP.NET Core.

Aplikasi sisi Blazor server dikonfigurasi untuk keamanan dengan cara yang sama seperti aplikasi ASP.NET Core. Untuk informasi lebih lanjut, lihat artikel di bawah topik keamanan ASP.NET Core.

Konteks autentikasi hanya dibuat saat aplikasi dimulai, yaitu ketika aplikasi pertama kali terhubung ke WebSocket. Konteks autentikasi dipertahankan selama masa pakai sirkuit. Aplikasi secara berkala memvalidasi ulang status autentikasi pengguna, saat ini setiap 30 menit secara default.

Jika aplikasi harus menangkap pengguna untuk layanan kustom atau bereaksi terhadap pembaruan kepada pengguna, lihat Skenario keamanan tambahan sisi server ASP.NET CoreBlazor.

Blazor berbeda dari aplikasi web tradisional yang dirender server yang membuat permintaan HTTP baru dengan cookiedi setiap navigasi halaman. Autentikasi diperiksa selama peristiwa navigasi. Namun, cookietidak terlibat. Cookies hanya dikirim saat membuat permintaan HTTP ke server, yang bukan apa yang terjadi ketika pengguna menavigasi di aplikasi Blazor . Selama navigasi, status autentikasi pengguna diperiksa dalam Blazor sirkuit, yang dapat Anda perbarui kapan saja di server menggunakan RevalidatingAuthenticationStateProvider abstraksi.

Penting

Menerapkan kustom NavigationManager untuk mencapai validasi autentikasi selama navigasi tidak disarankan. Jika aplikasi harus menjalankan logika status autentikasi kustom selama navigasi, gunakan kustom AuthenticationStateProvider.

Catatan

Contoh kode dalam artikel ini mengadopsi jenis referensi nullable (NRTs) dan .NET compiler null-state static analysis, yang didukung di ASP.NET Core di .NET 6 atau yang lebih baru. Saat menargetkan ASP.NET Core 5.0 atau yang lebih lama, hapus penunjukan jenis null (?) dari contoh dalam artikel ini.

Templat proyek

Buat aplikasi sisi Blazor server baru dengan mengikuti panduan di Tooling for ASP.NET Core Blazor.

Setelah memilih templat aplikasi sisi server dan mengonfigurasi proyek, pilih autentikasi aplikasi di bawah Jenis autentikasi:

  • Tidak ada (default): Tidak ada autentikasi.
  • Akun Individual: Akun pengguna disimpan dalam aplikasi menggunakan ASP.NET Core Identity.
  • Tidak ada (default): Tidak ada autentikasi.
  • Akun Individual: Akun pengguna disimpan dalam aplikasi menggunakan ASP.NET Core Identity.
  • platform identitas Microsoft: Untuk informasi selengkapnya, lihat autentikasi dan otorisasi ASP.NET CoreBlazor.
  • Windows: Gunakan Autentikasi Windows.

BlazorIdentity UI (Akun Individu)

Blazormendukung pembuatan UI berbasis Identity penuh Blazorsaat Anda memilih opsi autentikasi untuk Akun Individual.

Templat Blazor Web App membuat perancah Identity kode untuk database SQL Server. Versi baris perintah menggunakan SQLite secara default dan menyertakan database SQLite untuk Identity.

Templat menangani hal berikut:

  • IdentityRazor Menambahkan komponen dan logika terkait untuk tugas autentikasi rutin, seperti memasukkan dan mengeluarkan pengguna.
    • Komponen juga Identity mendukung fitur lanjutan Identity , seperti konfirmasi akun dan pemulihan kata sandi dan autentikasi multifaktor menggunakan aplikasi pihak ketiga.
    • Skenario penyajian sisi server interaktif (SSR interaktif) dan penyajian sisi klien (CSR) didukung.
  • IdentityMenambahkan paket dan dependensi terkait.
  • Mereferensikan Identity paket di _Imports.razor.
  • Membuat kelas pengguna Identity kustom (ApplicationUser).
  • Membuat dan mendaftarkan EF Core konteks database (ApplicationDbContext).
  • Mengonfigurasi perutean untuk titik akhir bawaan Identity .
  • Termasuk Identity validasi dan logika bisnis.

Untuk memeriksa Blazor komponen kerangka kerjaIdentity, akses di Pages folder Account dan Shared folder di Blazor templat proyek Aplikasi Web (sumber referensi).

Saat Anda memilih mode render Interactive WebAssembly atau Interactive Auto, server menangani semua permintaan autentikasi dan otorisasi, dan Identity komponen dirender secara statis di server di Blazor proyek utama Aplikasi Web.

Kerangka kerja menyediakan kustom AuthenticationStateProvider dalam proyek server dan klien (.Client) untuk mengalirkan status autentikasi pengguna ke browser. Proyek server memanggil AddAuthenticationStateSerialization, sementara proyek klien memanggil AddAuthenticationStateDeserialization. Mengautentikasi di server daripada klien memungkinkan aplikasi mengakses status autentikasi selama pra-penyajian Blazor WebAssembly dan sebelum runtime diinisialisasi. Implementasi kustom menggunakan layanan Status Komponen Persisten (PersistentComponentState) untuk menserialisasikan status autentikasi ke dalam komentar HTML lalu membacanya kembali dari WebAssembly untuk membuat instans baruAuthenticationState.AuthenticationStateProvider Untuk informasi selengkapnya, lihat bagian Mengelola status autentikasi di Blazor Web Apps .

Hanya untuk solusi Interactive Server, IdentityRevalidatingAuthenticationStateProvider (sumber referensi) adalah sisi AuthenticationStateProvider server yang menvalidasi ulang stempel keamanan untuk pengguna yang terhubung setiap 30 menit sirkuit interaktif tersambung.

Saat Anda memilih mode render Interactive WebAssembly atau Interactive Auto, server menangani semua permintaan autentikasi dan otorisasi, dan Identity komponen dirender secara statis di server di Blazor proyek utama Aplikasi Web. Templat proyek menyertakan PersistentAuthenticationStateProvider kelas (sumber referensi) dalam .Client proyek untuk menyinkronkan status autentikasi pengguna antara server dan browser. Kelas adalah implementasi kustom dari AuthenticationStateProvider. Penyedia menggunakan layanan Status Komponen Persisten (PersistentComponentState) untuk merender status autentikasi dan mempertahankannya ke halaman.

Dalam proyek Blazor utama Aplikasi Web, penyedia status autentikasi diberi nama ( IdentityRevalidatingAuthenticationStateProvider sumber referensi) (Solusi interaktivitas server saja) atau PersistingRevalidatingAuthenticationStateProvider (sumber referensi) (WebAssembly atau Solusi interaktivitas otomatis).

BlazorIdentity tergantung pada DbContext instans yang tidak dibuat oleh pabrik, yang disengaja karena DbContext cukup bagi komponen templat Identity proyek untuk dirender secara statis tanpa mendukung interaktivitas.

Untuk deskripsi tentang bagaimana mode render interaktif global diterapkan ke non-komponenIdentity sementara pada saat yang sama memberlakukan SSR statis untuk Identity komponen, lihat mode render ASP.NET CoreBlazor.

Untuk informasi selengkapnya tentang mempertahankan status yang telah dirender sebelumnya, lihat Prarender komponen ASP.NET CoreRazor.

Untuk informasi selengkapnya tentang BlazorIdentity UI dan panduan tentang mengintegrasikan login eksternal melalui situs web sosial, lihat Apa yang baru dengan identitas di .NET 8.

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Mengelola status autentikasi di Blazor Web Apps

Bagian ini berlaku untuk Blazor Web Apps yang mengadopsi:

  • Akun Individual
  • Penyajian sisi klien (CSR, interaktivitas berbasis WebAssembly).

Penyedia status autentikasi sisi klien hanya digunakan dalam Blazor dan tidak terintegrasi dengan sistem autentikasi ASP.NET Core. Selama pra-penyajian, Blazor menghormati metadata yang ditentukan pada halaman dan menggunakan sistem autentikasi ASP.NET Core untuk menentukan apakah pengguna diautentikasi. Saat pengguna menavigasi dari satu halaman ke halaman lain, penyedia autentikasi sisi klien digunakan. Saat pengguna me-refresh halaman (pemuatan ulang halaman penuh), penyedia status autentikasi sisi klien tidak terlibat dalam keputusan autentikasi di server. Karena status pengguna tidak dipertahankan oleh server, status autentikasi apa pun yang dipertahankan sisi klien hilang.

Untuk mengatasi hal ini, pendekatan terbaik adalah melakukan autentikasi dalam sistem autentikasi ASP.NET Core. Penyedia status autentikasi sisi klien hanya mengurus mencerminkan status autentikasi pengguna. Contoh cara menyelesaikan ini dengan penyedia status autentikasi ditunjukkan oleh Blazor templat proyek Aplikasi Web dan dijelaskan di bawah ini.

Dalam file proyek Program server, panggil AddAuthenticationStateSerialization, yang menserialisasikan AuthenticationState yang dikembalikan oleh sisi AuthenticationStateProvider server menggunakan layanan Status Komponen Persisten (PersistentComponentState):

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

Secara default, API hanya menserialisasikan nama sisi server dan klaim peran untuk akses di browser. Untuk menyertakan semua klaim, atur SerializeAllClaims ke true dalam panggilan sisi server ke AddAuthenticationStateSerialization:

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

Dalam file proyek klien (.Client), panggil AddAuthenticationStateDeserialization, yang menambahkan AuthenticationStateProvider tempat AuthenticationState dideserialisasi dari server menggunakan AuthenticationStateData dan layanan Status Komponen Persisten (PersistentComponentState).Program Harus ada panggilan yang sesuai ke AddAuthenticationStateSerialization dalam proyek server.

builder.Services.AddAuthorizationCore();
builder.Services.AddCascadingAuthenticationState();
builder.Services.AddAuthenticationStateDeserialization();
  • PersistingRevalidatingAuthenticationStateProvider (sumber referensi): Untuk Blazor Web Apps yang mengadopsi penyajian sisi server interaktif (SSR interaktif) dan penyajian sisi klien (CSR). Ini adalah sisi AuthenticationStateProvider server yang memvalidasi ulang stempel keamanan untuk pengguna yang terhubung setiap 30 menit sirkuit interaktif tersambung. Ini juga menggunakan layanan Status Komponen Persisten untuk mengalirkan status autentikasi ke klien, yang kemudian diperbaiki selama masa pakai CSR.

  • PersistingServerAuthenticationStateProvider (sumber referensi): Untuk Blazor Web Apps yang hanya mengadopsi CSR. Ini adalah sisi AuthenticationStateProvider server yang menggunakan layanan Status Komponen Persisten untuk mengalirkan status autentikasi ke klien, yang kemudian diperbaiki selama masa pakai CSR.

  • PersistentAuthenticationStateProvider (sumber referensi): Untuk Blazor Web Apps yang mengadopsi CSR. Ini adalah sisi AuthenticationStateProvider klien yang menentukan status autentikasi pengguna dengan mencari data yang bertahan di halaman ketika dirender di server. Status autentikasi ini diperbaiki untuk masa pakai CSR. Jika pengguna perlu masuk atau keluar, diperlukan pemuatan ulang halaman penuh. Ini hanya menyediakan nama pengguna dan email untuk tujuan tampilan. Ini tidak termasuk token yang mengautentikasi ke server saat membuat permintaan berikutnya, yang ditangani secara terpisah menggunakan cookie yang disertakan pada HttpClient permintaan ke server.

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Merancah Identity

Untuk informasi selengkapnya tentang perancah Identity ke aplikasi sisi Blazor server, lihat Perancah Identity dalam proyek ASP.NET Core.

Perancah Identity ke dalam aplikasi sisi Blazor server:

Klaim dan token tambahan dari penyedia eksternal

Untuk menyimpan klaim tambahan dari penyedia eksternal, lihat Mempertahankan klaim dan token tambahan dari penyedia eksternal di ASP.NET Core.

Azure App Service di Linux dengan Server Identity

Tentukan penerbit secara eksplisit saat menyebarkan Azure App Service di Linux dengan Server Identity. Untuk informasi selengkapnya, lihat Menggunakan Identity untuk mengamankan backend API Web untuk SPAs.

Mengimplementasikan AuthenticationStateProvider kustom

Jika aplikasi memerlukan penyedia kustom, terapkan AuthenticationStateProvider dan ambil alih GetAuthenticationStateAsync.

Dalam contoh berikut, semua pengguna diautentikasi dengan nama mrfibulipengguna .

CustomAuthStateProvider.cs:

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

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

        var user = new ClaimsPrincipal(identity);

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

Layanan CustomAuthStateProvider ini terdaftar dalam Program file:

using Microsoft.AspNetCore.Components.Authorization;

...

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

Layanan CustomAuthStateProvider terdaftar dalam Program file setelah panggilan ke AddServerSideBlazor:

using Microsoft.AspNetCore.Components.Authorization;

...

builder.Services.AddServerSideBlazor();

...

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

Layanan CustomAuthStateProvider ini terdaftar setelahStartup.ConfigureServicesStartup.cs panggilan ke :AddServerSideBlazor

using Microsoft.AspNetCore.Components.Authorization;

...

services.AddServerSideBlazor();

...

services.AddScoped<AuthenticationStateProvider, CustomAuthStateProvider>();

Konfirmasi atau tambahkan AuthorizeRouteView ke Router komponen.

Dalam komponen Routes (Components/Routes.razor):

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

Tambahkan layanan status autentikasi berskala ke kumpulan layanan dalam Program file:

builder.Services.AddCascadingAuthenticationState();

Catatan

Saat Anda membuat Blazor aplikasi dari salah Blazor satu templat proyek dengan autentikasi diaktifkan, aplikasi menyertakan AuthorizeRouteView dan memanggil ke AddCascadingAuthenticationState. Untuk informasi selengkapnya, lihat ASP.NET autentikasi dan otorisasi Core Blazor dengan informasi tambahan yang disajikan dalam artikel Menyesuaikan konten yang tidak sah dengan bagian komponen Router.

Konfirmasi atau tambahkan AuthorizeRouteView dan CascadingAuthenticationState ke Router komponen:

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

Catatan

Saat Anda membuat Blazor aplikasi dari salah Blazor satu templat proyek dengan autentikasi diaktifkan, aplikasi menyertakan komponen dan CascadingAuthenticationState yang AuthorizeRouteView ditampilkan dalam contoh sebelumnya. Untuk informasi selengkapnya, lihat ASP.NET autentikasi dan otorisasi Core Blazor dengan informasi tambahan yang disajikan dalam artikel Menyesuaikan konten yang tidak sah dengan bagian komponen Router.

Menunjukkan AuthorizeView nama pengguna yang diautentikasi dalam komponen apa pun:

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

Untuk panduan tentang penggunaan AuthorizeView, lihat ASP.NET autentikasi dan otorisasi CoreBlazor.

Pemberitahuan tentang perubahan status autentikasi

Kustom AuthenticationStateProvider dapat memanggil NotifyAuthenticationStateChanged pada AuthenticationStateProvider kelas dasar untuk memberi tahu konsumen tentang perubahan status autentikasi untuk dirender.

Contoh berikut didasarkan pada penerapan kustom AuthenticationStateProvider dengan mengikuti panduan di bagian Terapkan kustom AuthenticationStateProvider .

Implementasi berikut CustomAuthStateProvider mengekspos metode kustom, AuthenticateUser, untuk memasukkan pengguna dan memberi tahu konsumen tentang perubahan status autentikasi.

CustomAuthStateProvider.cs:

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

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    public override Task<AuthenticationState> GetAuthenticationStateAsync()
    {
        var identity = new ClaimsIdentity();
        var user = new ClaimsPrincipal(identity);

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

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

        var user = new ClaimsPrincipal(identity);

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

Dalam komponen:

@inject AuthenticationStateProvider AuthenticationStateProvider

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

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

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        ((CustomAuthStateProvider)AuthenticationStateProvider)
            .AuthenticateUser(userIdentifier);
    }
}
@inject AuthenticationStateProvider AuthenticationStateProvider

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

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

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        ((CustomAuthStateProvider)AuthenticationStateProvider)
            .AuthenticateUser(userIdentifier);
    }
}

Pendekatan sebelumnya dapat ditingkatkan untuk memicu pemberitahuan perubahan status autentikasi melalui layanan kustom. Berikut ini AuthenticationService mempertahankan prinsipal klaim pengguna saat ini di bidang dukungan (currentUser) dengan peristiwa (UserChanged) yang AuthenticationStateProvider dapat berlangganan, tempat peristiwa memanggil NotifyAuthenticationStateChanged. Dengan konfigurasi tambahan nanti di bagian ini, AuthenticationService dapat disuntikkan ke dalam komponen dengan logika yang mengatur CurrentUser untuk memicu UserChanged peristiwa.

using System.Security.Claims;

public class AuthenticationService
{
    public event Action<ClaimsPrincipal>? UserChanged;
    private ClaimsPrincipal? currentUser;

    public ClaimsPrincipal CurrentUser
    {
        get { return currentUser ?? new(); }
        set
        {
            currentUser = value;

            if (UserChanged is not null)
            {
                UserChanged(currentUser);
            }
        }
    }
}

Program Dalam file, daftarkan AuthenticationService dalam kontainer injeksi dependensi:

builder.Services.AddScoped<AuthenticationService>();

Di Startup.ConfigureServices dari Startup.cs, daftarkan AuthenticationService dalam kontainer injeksi dependensi:

services.AddScoped<AuthenticationService>();

Berikut ini CustomAuthStateProvider berlangganan acara AuthenticationService.UserChanged . GetAuthenticationStateAsync mengembalikan status autentikasi pengguna. Awalnya, status autentikasi didasarkan pada nilai AuthenticationService.CurrentUser. Saat ada perubahan pengguna, status autentikasi baru dibuat dengan pengguna baru (new AuthenticationState(newUser)) untuk panggilan ke GetAuthenticationStateAsync:

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

public class CustomAuthStateProvider : AuthenticationStateProvider
{
    private AuthenticationState authenticationState;

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

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

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

    public override Task<AuthenticationState> GetAuthenticationStateAsync() =>
        Task.FromResult(authenticationState);
}

Metode komponen SignIn berikut membuat prinsip klaim untuk pengidentifikasi pengguna untuk diatur pada AuthenticationService.CurrentUser:

@inject AuthenticationService AuthenticationService

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

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

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        var currentUser = AuthenticationService.CurrentUser;

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

        var newUser = new ClaimsPrincipal(identity);

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

<input @bind="userIdentifier" />
<button @onclick="SignIn">Sign in</button>

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

@code {
    public string userIdentifier = string.Empty;

    private void SignIn()
    {
        var currentUser = AuthenticationService.CurrentUser;

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

        var newUser = new ClaimsPrincipal(identity);

        AuthenticationService.CurrentUser = newUser;
    }
}

Menyuntikkan AuthenticationStateProvider untuk layanan yang dilingkup ke komponen

Jangan mencoba mengatasi AuthenticationStateProvider dalam cakupan kustom karena menghasilkan pembuatan instans AuthenticationStateProvider baru yang tidak diinisialisasi dengan benar.

Untuk mengakses AuthenticationStateProvider dalam layanan yang terlingkup ke komponen, masukkan AuthenticationStateProvider dengan direktif@injectatau [Inject] atribut dan teruskan ke layanan sebagai parameter. Pendekatan ini memastikan bahwa instans AuthenticationStateProvider yang benar dan diinisialisasi digunakan untuk setiap instans aplikasi pengguna.

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

Daftarkan layanan sebagai cakupan. Dalam aplikasi sisi Blazor server, layanan tercakup memiliki masa pakai yang sama dengan durasi sirkuit koneksi klien.

Dalam file Program:

builder.Services.AddScoped<ExampleService>();

Dalam Startup.ConfigureServices dari Startup.cs:

services.AddScoped<ExampleService>();

Dalam komponen InjectAuthStateProvider berikut:

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

Untuk informasi selengkapnya, lihat panduan tentang OwningComponentBase injeksi dependensi inti Blazor ASP.NET.

Tampilan konten tidak sah saat melakukan pra-penyajian dengan kustom AuthenticationStateProvider

Untuk menghindari menampilkan konten yang tidak sah, misalnya konten dalam komponen, saat melakukan prarender dengan kustomAuthenticationStateProvider , adopsi salah satu pendekatan berikut:AuthorizeView

  • Nonaktifkan pra-penyajian: Menunjukkan mode render dengan parameter yang prerender diatur ke false pada komponen tingkat tertinggi dalam hierarki komponen aplikasi yang bukan komponen akar.

    Catatan

    Membuat komponen akar interaktif, seperti App komponen, tidak didukung. Oleh karena itu, pra-penyajian tidak dapat dinonaktifkan secara langsung oleh App komponen.

    Untuk aplikasi berdasarkan Blazor templat proyek Aplikasi Web, pra-penyajian biasanya dinonaktifkan di mana Routes komponen digunakan dalam App komponen (Components/App.razor) :

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

    Selain itu, nonaktifkan pra-penyajian HeadOutlet untuk komponen:

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

    Anda juga dapat secara selektif mengontrol mode render yang diterapkan ke Routes instans komponen. Misalnya, lihat mode render ASP.NET CoreBlazor.

  • Nonaktifkan pra-penyajian_Host.cshtml: Buka file dan ubah render-mode atribut Pembantu Tag Komponen menjadi Server:

    <component type="typeof(App)" render-mode="Server" />
    
  • Autentikasi pengguna di server sebelum aplikasi dimulai: Untuk mengadopsi pendekatan ini, aplikasi harus menanggapi permintaan awal pengguna dengan Identityhalaman masuk berbasis atau melihat dan mencegah permintaan apa pun ke Blazor titik akhir hingga diautentikasi. Untuk informasi selengkapnya, lihat Membuat aplikasi ASP.NET Core dengan data pengguna yang dilindungi oleh otorisasi. Setelah autentikasi, konten yang tidak sah dalam komponen yang telah Razor dirender hanya ditampilkan ketika pengguna benar-benar tidak sah untuk melihat konten.

Manajemen status pengguna

Terlepas dari kata "state" dalam nama, AuthenticationStateProvider bukan untuk menyimpan status pengguna umum. AuthenticationStateProvider hanya menunjukkan status autentikasi pengguna ke aplikasi, apakah mereka masuk ke aplikasi dan siapa mereka masuk.

Autentikasi menggunakan autentikasi ASP.NET Core Identity yang sama dengan Razor aplikasi Pages dan MVC. Status pengguna yang disimpan untuk alur Blazor ASP.NET Core Identity tanpa menambahkan kode tambahan ke aplikasi. Ikuti panduan dalam artikel dan tutorial ASP.NET Core Identity agar Identity fitur diterapkan di Blazor bagian aplikasi.

Untuk panduan tentang manajemen status umum di luar ASP.NET Core Identity, lihat manajemen status inti Blazor ASP.NET.

Abstraksi keamanan tambahan

Dua abstraksi tambahan berpartisipasi dalam mengelola status autentikasi:

Catatan

Tautan dokumentasi ke sumber referensi .NET biasanya memuat cabang default repositori, yang mewakili pengembangan saat ini untuk rilis .NET berikutnya. Untuk memilih tag rilis tertentu, gunakan daftar dropdown Beralih cabang atau tag. Untuk informasi lebih lanjut, lihat Cara memilih tag versi kode sumber ASP.NET Core (dotnet/AspNetCore.Docs #26205).

Durasi validitas URL pengalihan sementara

Bagian ini berlaku untuk Blazor Web Apps.

RazorComponentsServiceOptions.TemporaryRedirectionUrlValidityDuration Gunakan opsi untuk mendapatkan atau mengatur masa pakai validitas perlindungan data untuk URL pengalihan sementara yang dipancarkan oleh Blazor penyajian sisi server. Ini hanya digunakan secara sementara, sehingga masa pakai hanya perlu cukup lama bagi klien untuk menerima URL dan mulai navigasi ke dalamnya. Namun, itu juga harus cukup lama untuk memungkinkan ke condong jam di seluruh server. Nilai defaultnya adalah lima menit.

Dalam contoh berikut, nilai diperpanjang hingga tujuh menit:

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

Sumber Daya Tambahan: