Bagikan melalui


Autentikasi dan otorisasi ASP.NET Core Blazor

Catatan

Ini bukan versi terbaru dari artikel ini. Untuk rilis saat ini, lihat versi .NET 9 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 9 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 9 dari artikel ini.

Artikel ini menjelaskan dukungan ASP.NET Core untuk konfigurasi dan manajemen keamanan di Blazor aplikasi.

Blazor menggunakan mekanisme autentikasi ASP.NET Core yang ada untuk menetapkan identitas pengguna. Mekanisme yang tepat tergantung pada bagaimana aplikasi dihosting Blazor , sisi server, atau sisi klien.

Skenario keamanan berbeda antara kode otorisasi yang menjalankan sisi server dan sisi klien di Blazor aplikasi. Untuk kode otorisasi yang berjalan di server, pemeriksaan otorisasi dapat menerapkan aturan akses untuk area aplikasi dan komponen. Karena eksekusi kode sisi klien dapat dirusak, kode otorisasi yang dijalankan pada klien tidak dapat dipercaya untuk benar-benar menerapkan aturan akses atau mengontrol tampilan konten sisi klien.

Jika penegakan aturan otorisasi harus dijamin, jangan terapkan pemeriksaan otorisasi dalam kode sisi klien. Blazor Web App Bangun yang hanya bergantung pada penyajian sisi server (SSR) untuk pemeriksaan otorisasi dan penegakan aturan.

Jika penegakan aturan otorisasi dan keamanan data dan kode harus dijamin, jangan kembangkan aplikasi sisi klien. Buat Blazor Server aplikasi.

Razor Konvensi otorisasi halaman tidak berlaku untuk komponen Razor yang dapat dirutekan. Jika komponen Razor yang tidak dapat dirutekan disematkan di halaman Razor aplikasi Pages, konvensi otorisasi halaman secara tidak langsung memengaruhi komponen Razor bersama dengan konten halaman lainnya.

ASP.NET Core Identity dirancang untuk bekerja dalam konteks permintaan HTTP dan komunikasi respons, yang umumnya bukan Blazor model komunikasi klien-server aplikasi. Aplikasi ASP.NET Core yang menggunakan ASP.NET Core Identity untuk manajemen pengguna harus menggunakan Halaman Razor, bukan komponen Razor untuk UI terkait Identity, seperti pendaftaran pengguna, masuk, keluar, dan tugas manajemen pengguna lainnya. Komponen bangunan Razor yang menangani Identity tugas secara langsung dimungkinkan untuk beberapa skenario tetapi tidak direkomendasikan atau didukung oleh Microsoft.

Abstraksi ASP.NET Core, seperti SignInManager<TUser> dan UserManager<TUser>, tidak didukung dalam komponen Razor. Untuk informasi selengkapnya tentang menggunakan ASP.NET Core Identity dengan , lihat Blazor sisi Identity server.Blazor

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.

Pertahankan data dan kredensial sensitif dengan aman

Jangan menyimpan rahasia aplikasi, string koneksi, kredensial, kata sandi, nomor identifikasi pribadi (PIN), kode .NET/C# privat, atau kunci/token privat dalam kode sisi klien, yang selalu tidak aman. Kode sisi Blazor klien harus mengakses layanan dan database yang aman melalui API web aman yang Anda kontrol.

Di lingkungan pengujian/penahapan dan produksi, kode sisi Blazor server dan API web harus menggunakan alur autentikasi aman yang menghindari mempertahankan kredensial dalam kode proyek atau file konfigurasi. Di luar pengujian pengembangan lokal, sebaiknya hindari penggunaan variabel lingkungan untuk menyimpan data sensitif, karena variabel lingkungan bukanlah pendekatan yang paling aman. Untuk pengujian pengembangan lokal, alat Secret Manager direkomendasikan untuk mengamankan data sensitif. Untuk informasi selengkapnya, lihat sumber daya berikut:

Untuk pengembangan dan pengujian lokal sisi klien dan sisi server, gunakan alat Secret Manager untuk mengamankan kredensial sensitif.

Identitas terkelola untuk layanan Microsoft Azure

Untuk layanan Microsoft Azure, sebaiknya gunakan identitas terkelola. Identitas terkelola mengautentikasi dengan aman ke layanan Azure tanpa menyimpan kredensial dalam kode aplikasi. Untuk informasi selengkapnya, lihat sumber daya berikut:

Dukungan antiforgery

Templat Blazor :

Komponen AntiforgeryToken merender token antiforgery sebagai bidang tersembunyi, dan komponen ini secara otomatis ditambahkan ke instans formulir (EditForm). Untuk informasi selengkapnya, lihat Blazor formulir ASP.NET Core.

Layanan ini AntiforgeryStateProvider menyediakan akses ke token antiforgery yang terkait dengan sesi saat ini. Masukkan layanan dan panggil metodenya GetAntiforgeryToken() untuk mendapatkan .AntiforgeryRequestToken Untuk informasi selengkapnya, lihat Blazor ASP.NET Core.

Blazor menyimpan token permintaan dalam status komponen, yang menjamin bahwa token antiforgery tersedia untuk komponen interaktif, bahkan ketika mereka tidak memiliki akses ke permintaan.

Catatan

Mitigasi antiforgery hanya diperlukan saat mengirimkan data formulir ke server yang dikodekan sebagai application/x-www-form-urlencoded, multipart/form-data, atau text/plain karena ini adalah satu-satunya enctype formulir yang valid.

Untuk informasi selengkapnya, lihat sumber daya berikut:

Autentikasi sisi server Blazor

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 melalui SignalR koneksi dengan klien. Autentikasi dapat didasarkan pada cookie atau beberapa token pembawa lainnya, tetapi autentikasi dikelola melalui SignalR hub dan sepenuhnya dalam sirkuit. Konteks autentikasi dipertahankan selama masa pakai sirkuit. Aplikasi secara berkala memvalidasi ulang status autentikasi pengguna setiap 30 menit.

Jika aplikasi harus menangkap pengguna untuk layanan kustom atau bereaksi terhadap pembaruan kepada pengguna, lihat ASP.NET sisi server Core dan Blazor Web App skenario keamanan tambahan.

Blazor berbeda dari aplikasi web tradisional yang dirender server yang membuat permintaan HTTP baru dengan cookie di setiap navigasi halaman. Autentikasi diperiksa selama peristiwa navigasi. Namun, cookie tidak terlibat. Cookie 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.

Layanan bawaan atau kustom AuthenticationStateProvider mendapatkan data status autentikasi dari ASP.NET Core HttpContext.User. Ini adalah cara status autentikasi terintegrasi dengan mekanisme autentikasi ASP.NET Core yang ada.

Untuk informasi selengkapnya tentang autentikasi sisi server, lihat Blazor ASP.NET Core.

Status bersama

Aplikasi sisi Blazor server berada di memori server, dan beberapa sesi aplikasi dihosting dalam proses yang sama. Untuk setiap sesi aplikasi, Blazor memulai sirkuit dengan cakupan kontainer injeksi dependensinya sendiri, sehingga layanan terlingkup unik per Blazor sesi.

Peringatan

Kami tidak merekomendasikan aplikasi pada status berbagi server yang sama menggunakan layanan singleton kecuali perawatan ekstrem diambil, karena ini dapat memperkenalkan kerentanan keamanan, seperti membocorkan status pengguna di seluruh sirkuit.

Anda dapat menggunakan layanan singleton stateful di Blazor aplikasi jika dirancang khusus untuk itu. Misalnya, penggunaan cache memori singleton dapat diterima karena cache memori memerlukan kunci untuk mengakses entri tertentu. Dengan asumsi pengguna tidak memiliki kontrol atas kunci cache yang digunakan dengan cache, status yang disimpan di cache tidak bocor di seluruh sirkuit.

Untuk panduan umum tentang manajemen status, lihat Blazor status ASP.NET Core.

Keamanan sisi server dari data sensitif dan kredensial

Di lingkungan pengujian/penahapan dan produksi, kode sisi Blazor server dan API web harus menggunakan alur autentikasi aman yang menghindari mempertahankan kredensial dalam kode proyek atau file konfigurasi. Di luar pengujian pengembangan lokal, sebaiknya hindari penggunaan variabel lingkungan untuk menyimpan data sensitif, karena variabel lingkungan bukanlah pendekatan yang paling aman. Untuk pengujian pengembangan lokal, alat Secret Manager direkomendasikan untuk mengamankan data sensitif. Untuk informasi selengkapnya, lihat sumber daya berikut:

Untuk pengembangan dan pengujian lokal sisi klien dan sisi server, gunakan alat Secret Manager untuk mengamankan kredensial sensitif.

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, lihatautentikasi dan otorisasi ASP.NET Core .
  • Windows: Gunakan Autentikasi Windows.

Blazor Identity UI (Akun Individu)

Blazormendukung pembuatan UI berbasis Blazor penuh Identitysaat Anda memilih opsi autentikasi untuk Akun Individual.

Perancah Blazor Web AppIdentity templat kode untuk database SQL Server. Versi baris perintah menggunakan SQLite dan menyertakan database SQLite untuk Identity.

Templat:

  • Mendukung skenario penyajian sisi server interaktif (SSR interaktif) dan penyajian sisi klien (CSR) dengan pengguna yang diautentikasi.
  • Identity Razor Menambahkan komponen dan logika terkait untuk tugas autentikasi rutin, seperti memasukkan dan mengeluarkan pengguna. Komponen juga Identity mendukung fitur lanjutanIdentity, seperti konfirmasi akun dan pemulihan kata sandi dan autentikasi multifaktor menggunakan aplikasi pihak ketiga. Perhatikan bahwa komponen itu Identity sendiri tidak mendukung interaktivitas.
  • 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 Shared dan Account folder dalam Blazor Web App templat proyek (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 Web Appproyek utama.

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 dan sebelum runtime .NET WebAssembly diinisialisasi. Implementasi kustom menggunakan layanan Status Komponen Persisten (AuthenticationStateProvider) untuk menserialisasikan status autentikasi ke dalam komentar HTML lalu membacanya kembali dari WebAssembly untuk membuat instans baru.PersistentComponentStateAuthenticationState 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 Web Appproyek utama. 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 Web Apputama , penyedia status autentikasi diberi nama ( IdentityRevalidatingAuthenticationStateProvider sumber referensi) (Hanya solusi interaktivitas server) atau PersistingRevalidatingAuthenticationStateProvider (sumber referensi) (Solusi interaktivitas WebAssembly atau Otomatis).

Blazor Identity 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 Blazor render ASP.NET Core.

Untuk informasi selengkapnya tentang mempertahankan status yang telah dirender sebelumnya, lihat Razor ASP.NET Core.

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 dalam 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 Web App templat proyek 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();

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 Program, yang menambahkan AddAuthenticationStateDeserialization tempat AuthenticationStateProvider dideserialisasi dari server menggunakan AuthenticationState dan AuthenticationStateData Status Komponen Persisten ().PersistentComponentState 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 Appmengadopsi 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 Appitu 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 Appmengadopsi 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.

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 Blazordependensi inti 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 AuthorizeView , adopsi AuthenticationStateProvider pendekatan berikut:

  • 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 Web App templat proyek, 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 Blazor render ASP.NET Core.

  • 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 Identity ASP.NET Core Blazor 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 Blazor status inti 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).

Manajemen status autentikasi saat keluar

Sisi Blazor server mempertahankan status autentikasi pengguna selama masa pakai sirkuit, termasuk di seluruh tab browser. Untuk secara proaktif menandatangani pengguna di seluruh tab browser saat pengguna keluar pada satu tab, Anda harus menerapkan RevalidatingServerAuthenticationStateProvider (sumber referensi) dengan singkat RevalidationInterval.

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 Inti ASP.NET 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));

Autentikasi sisi Blazor klien

Di aplikasi sisi Blazor klien, pemeriksaan autentikasi sisi klien dapat dilewati karena semua kode sisi klien dapat dimodifikasi oleh pengguna. Hal yang sama berlaku untuk semua teknologi aplikasi sisi klien, termasuk kerangka kerja JavaScript SPA dan aplikasi asli untuk sistem operasi apa pun.

Tambahkan berikut ini:

Untuk menangani autentikasi, gunakan layanan bawaan atau kustom AuthenticationStateProvider .

Untuk informasi selengkapnya tentang autentikasi sisi klien, lihat Mengamankan ASP.NET Core Blazor WebAssembly.

Layanan AuthenticationStateProvider

AuthenticationStateProvider adalah layanan yang mendasari yang digunakan oleh AuthorizeView komponen dan layanan autentikasi berkala untuk mendapatkan status autentikasi bagi pengguna.

AuthenticationStateProvider adalah layanan yang mendasar yang digunakan oleh AuthorizeView komponen dan CascadingAuthenticationState komponen untuk mendapatkan status autentikasi bagi pengguna.

Anda biasanya tidak menggunakan AuthenticationStateProvider secara langsung. Gunakan pendekatan komponen AuthorizeView atau Task<AuthenticationState> yang dijelaskan nanti dalam artikel ini. Kelemahan utama menggunakan AuthenticationStateProvider secara langsung adalah komponen tidak diberi tahu secara otomatis jika data status autentikasi yang mendasarinya berubah.

Untuk menerapkan kustom AuthenticationStateProvider, lihat Blazor ASP.NET Core, yang mencakup panduan tentang menerapkan pemberitahuan perubahan status autentikasi pengguna.

Mendapatkan data utama klaim pengguna

Layanan AuthenticationStateProvider ini dapat memberikan data pengguna ClaimsPrincipal saat ini, seperti yang ditunjukkan dalam contoh berikut.

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

Dalam contoh sebelumnya:

  • ClaimsPrincipal.Claims mengembalikan klaim pengguna (claims) untuk ditampilkan di UI.
  • Baris yang mendapatkan panggilan surname nama keluarga (ClaimsPrincipal.FindAll) pengguna dengan predikat untuk memfilter klaim pengguna.
@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.";
        }
    }
}

Jika user.Identity.IsAuthenticated adalah true dan karena pengguna adalah ClaimsPrincipal, klaim dapat dihitung dan keanggotaan dalam peran dievaluasi.

Untuk informasi lebih lanjut tentang injeksi dependensi (DI) dan layanan, lihat injeksi dependensi Blazor ASP.NET Core dan Injeksi dependensi di ASP.NET Core. Untuk informasi tentang cara menerapkan kustom AuthenticationStateProvider, lihat Blazor autentikasi ASP.NET Core.

Mengekspos status autentikasi sebagai parameter berskala

Jika data status autentikasi diperlukan untuk logika prosedural, seperti saat melakukan tindakan yang dipicu oleh pengguna, dapatkan data status autentikasi dengan menentukan parameter jenis Task<AuthenticationState>berjendela , seperti yang ditunjukkan contoh berikut.

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

Jika user.Identity.IsAuthenticated adalah true, klaim dapat dihitung dan keanggotaan dalam peran dievaluasi.

Siapkan Task<AuthenticationState> parameter bertingkat menggunakan AuthorizeRouteView layanan status autentikasi dan bertingkat.

Saat Anda membuat Blazor aplikasi dari salah Blazor satu templat proyek dengan autentikasi diaktifkan, aplikasi menyertakan AuthorizeRouteView dan panggilan untuk AddCascadingAuthenticationState ditampilkan dalam contoh berikut. Aplikasi sisi Blazor klien juga menyertakan pendaftaran layanan yang diperlukan. Informasi tambahan disajikan di bagian Kustomisasi konten yang tidak sah dengan Router komponen .

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

Program Dalam file, daftarkan layanan status autentikasi berkala:

builder.Services.AddCascadingAuthenticationState();

Siapkan Task<AuthenticationState>parameter bertingkat menggunakan AuthorizeRouteView komponen dan .CascadingAuthenticationState

Saat Anda membuat Blazor aplikasi dari salah Blazor satu templat proyek dengan autentikasi diaktifkan, aplikasi menyertakan komponen dan AuthorizeRouteView yang CascadingAuthenticationState ditampilkan dalam contoh berikut. Aplikasi sisi Blazor klien juga menyertakan pendaftaran layanan yang diperlukan. Informasi tambahan disajikan di bagian Kustomisasi konten yang tidak sah dengan Router komponen .

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

Catatan

Dengan rilis ASP.NET Core 5.0.1 dan untuk rilis 5.x tambahan, komponen Router menyertakan parameter PreferExactMatches yang diatur ke @true. Untuk informasi lebih lanjut, lihat Migrasi dari ASP.NET Core 3.1 ke 5.0.

Di aplikasi sisi Blazor klien, tambahkan layanan otorisasi ke Program file:

builder.Services.AddAuthorizationCore();

Di aplikasi sisi Blazor klien, tambahkan opsi dan layanan otorisasi ke Program file:

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

Di aplikasi sisi Blazor server, layanan untuk opsi dan otorisasi sudah ada, jadi tidak ada langkah lebih lanjut yang diperlukan.

Authorization

Setelah pengguna diautentikasi, aturan otorisasi diterapkan untuk mengontrol apa yang dapat dilakukan pengguna.

Akses biasanya diberikan atau ditolak berdasarkan apakah:

  • Pengguna diautentikasi (masuk).
  • Pengguna berada dalam peran.
  • Pengguna memiliki klaim.
  • Kebijakan terpenuhi.

Masing-masing konsep ini sama seperti di ASP.NET Core MVC atau aplikasi Halaman Razor. Untuk informasi lebih lanjut tentang keamanan ASP.NET Core, lihat artikel di bagian Keamanan ASP.NET Core dan Identity.

AuthorizeView komponen

Komponen AuthorizeView secara selektif menampilkan konten UI bergantung pada apakah pengguna diotorisasi. Pendekatan ini berguna ketika Anda hanya perlu menampilkan data untuk pengguna dan tidak perlu menggunakan identitas pengguna dalam logika prosedural.

Komponen mengekspos context variabel jenis AuthenticationState (@context dalam Razor sintaksis), yang dapat Anda gunakan untuk mengakses informasi tentang pengguna yang masuk:

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

Anda juga dapat menyediakan konten yang berbeda untuk ditampilkan jika pengguna tidak diotorisasi dengan kombinasi Authorized parameter dan NotAuthorized :

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

AuthorizeView Meskipun komponen mengontrol visibilitas elemen berdasarkan status otorisasi pengguna, komponen tersebut tidak memberlakukan keamanan pada penanganan aktivitas itu sendiri. Dalam contoh sebelumnya, HandleClick metode ini hanya dikaitkan dengan tombol yang terlihat oleh pengguna yang berwenang, tetapi tidak ada yang mencegah pemanggilan metode ini dari tempat lain. Untuk memastikan keamanan tingkat metode, terapkan logika otorisasi tambahan dalam handler itu sendiri atau di API yang relevan.

Razor komponen Blazor Web Apps tidak pernah menampilkan <NotAuthorized> konten ketika otorisasi gagal di sisi server selama penyajian sisi server statis (SSR statis). Alur sisi server ASP.NET Core memproses otorisasi di server. Gunakan teknik sisi server untuk menangani permintaan yang tidak sah. Untuk informasi selengkapnya, lihat Blazor render ASP.NET Core.

Peringatan

Markup sisi klien dan metode yang AuthorizeView terkait dengan hanya dilindungi dari tampilan dan eksekusi di UI yang dirender di aplikasi sisi Blazor klien. Untuk melindungi konten resmi dan metode aman di sisi Blazorklien, konten biasanya disediakan oleh panggilan API web yang aman dan resmi ke API server dan tidak pernah disimpan di aplikasi. Untuk informasi selengkapnya, lihat Blazor ASP.NET Core dan Blazor WebAssembly tambahan ASP.NET Core.

Authorized Konten dan NotAuthorized dapat mencakup item arbitrer, seperti komponen interaktif lainnya.

Kondisi otorisasi, seperti peran atau kebijakan yang mengontrol opsi atau akses UI, dibahas di bagian Otorisasi.

Jika kondisi otorisasi tidak ditentukan, AuthorizeView gunakan kebijakan default:

  • Pengguna yang diautentikasi (masuk) diotorisasi.
  • Pengguna yang tidak diautentikasi (keluar) tidak sah.

Komponen AuthorizeView dapat digunakan dalamNavMenu komponen (Shared/NavMenu.razor) untuk menampilkanNavLink komponen (NavLink), tetapi perhatikan bahwa pendekatan ini hanya menghapus item daftar dari output yang diberikan. Pendekatan ini tidak mencegah pengguna menavigasi ke komponen. Terapkan otorisasi secara terpisah di komponen tujuan.

Otorisasi berbasis peran dan berbasis kebijakan

Komponen AuthorizeView mendukung otorisasi berbasis peran atau berbasis kebijakan.

Untuk otorisasi berbasis peran, gunakan Roles parameter . Dalam contoh berikut, pengguna harus memiliki klaim peran untuk Admin peran atau Superuser :

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

Untuk mengharuskan pengguna memiliki Admin klaim peran dan Superuser , komponen sarang AuthorizeView :

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

Kode sebelumnya menetapkan Context untuk komponen dalam AuthorizeView untuk mencegah AuthenticationState tabrakan konteks. Konteks AuthenticationState diakses di luar AuthorizeView dengan pendekatan standar untuk mengakses konteks (@context.User). Konteks diakses di dalam AuthorizeView dengan konteks bernama innerContext (@innerContext.User).

Untuk informasi lebih lanjut, termasuk panduan konfigurasi, lihat Otorisasi berbasis peran di ASP.NET Core.

Untuk otorisasi berbasis kebijakan, gunakan Policy parameter dengan satu nama kebijakan:

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

Untuk menangani kasus di mana pengguna harus memenuhi salah satu dari beberapa kebijakan, buat kebijakan yang mengonfirmasi bahwa pengguna memenuhi kebijakan lain.

Untuk menangani kasus di mana pengguna harus memenuhi beberapa kebijakan secara bersamaan, lakukan salah satu pendekatan berikut:

  • Buat kebijakan untuk AuthorizeView yang mengonfirmasi bahwa pengguna memenuhi beberapa kebijakan lain.

  • Menumpuk kebijakan dalam beberapa AuthorizeView komponen:

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

Otorisasi berbasis klaim adalah kasus khusus dari otorisasi berbasis kebijakan. Misalnya, Anda dapat menentukan kebijakan yang mengharuskan pengguna memiliki klaim tertentu. Untuk informasi lebih lanjut, lihat Otorisasi berbasis kebijakan di ASP.NET Core.

Jika tidak atau RolesPolicy ditentukan, AuthorizeView gunakan kebijakan default:

  • Pengguna yang diautentikasi (masuk) diotorisasi.
  • Pengguna yang tidak diautentikasi (keluar) tidak sah.

Karena perbandingan string .NET peka huruf besar/kecil, peran yang cocok dan nama kebijakan juga peka huruf besar/kecil. Misalnya, Admin (huruf Abesar ) tidak diperlakukan sebagai peran yang sama dengan admin (huruf akecil ).

Kasus Pascal biasanya digunakan untuk nama peran dan kebijakan (misalnya, BillingAdministrator), tetapi penggunaan kasus Pascal bukan persyaratan yang ketat. Skema casing yang berbeda, seperti camel case, kebab case, dan snake case, diizinkan. Menggunakan spasi dalam peran dan nama kebijakan tidak biasa tetapi diizinkan oleh kerangka kerja. Misalnya, billing administrator adalah format peran atau nama kebijakan yang tidak biasa di aplikasi .NET, tetapi ini adalah peran atau nama kebijakan yang valid.

Konten ditampilkan selama autentikasi asinkron

Blazor memungkinkan status autentikasi ditentukan secara asinkron. Skenario utama untuk pendekatan ini ada di aplikasi sisi Blazor klien yang membuat permintaan ke titik akhir eksternal untuk autentikasi.

Saat autentikasi sedang berlangsung, AuthorizeView tidak menampilkan konten. Untuk menampilkan konten saat autentikasi terjadi, tetapkan konten ke Authorizing parameter:

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

Pendekatan ini biasanya tidak berlaku untuk aplikasi sisi Blazor server. Aplikasi sisi Blazor server mengetahui status autentikasi segera setelah status ditetapkan. Authorizing konten dapat disediakan dalam komponen aplikasi AuthorizeView , tetapi konten tidak pernah ditampilkan.

atribut [Authorize]

Atribut [Authorize] tersedia dalam Razor komponen:

@page "/"
@attribute [Authorize]

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

Penting

Hanya gunakan [Authorize] pada @page komponen yang dicapai melalui Blazor router. Otorisasi hanya dilakukan sebagai aspek perutean dan bukan untuk komponen turunan yang dirender dalam halaman. Untuk mengotorisasi tampilan bagian tertentu dalam halaman, gunakan AuthorizeView sebagai gantinya.

Atribut [Authorize] juga mendukung otorisasi berbasis peran atau berbasis kebijakan. Untuk otorisasi berbasis peran, gunakan parameter Roles:

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

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

Untuk otorisasi berbasis kebijakan, gunakan parameter Policy:

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

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

Jika tidak atau RolesPolicy ditentukan, [Authorize] gunakan kebijakan default:

  • Pengguna yang diautentikasi (masuk) diotorisasi.
  • Pengguna yang tidak diautentikasi (keluar) tidak sah.

Saat pengguna tidak diotorisasi dan jika aplikasi tidak menyesuaikan konten yang tidak sah dengan Router komponen, kerangka kerja secara otomatis menampilkan pesan fallback berikut:

Not authorized.

Otorisasi sumber daya

Untuk mengotorisasi pengguna atas sumber daya, teruskan data rute permintaan ke parameter Resource dari AuthorizeRouteView.

Router.Found Dalam konten untuk rute yang diminta:

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

Untuk informasi lebih lanjut tentang bagaimana data status otorisasi diteruskan dan digunakan dalam logika prosedural, lihat bagian Mengekspos status autentikasi sebagai parameter berskala.

Saat AuthorizeRouteView menerima data rute untuk sumber daya, kebijakan otorisasi memiliki akses ke RouteData.PageType dan RouteData.RouteValues yang mengizinkan logika kustom untuk membuat keputusan otorisasi.

Dalam contoh berikut, kebijakan EditUser dibuat di AuthorizationOptions untuk konfigurasi layanan otorisasi aplikasi (AddAuthorizationCore) dengan logika berikut:

  • Tentukan apakah ada nilai rute dengan kunci id. Jika kunci ada, nilai rute disimpan di value.
  • Dalam variabel bernama id, simpan value sebagai string atau tetapkan nilai string kosong (string.Empty).
  • Jika id bukan string kosong, tegaskan bahwa kebijakan terpenuhi (kembalikan true) jika nilai string dimulai dengan EMP. Jika tidak, nyatakan bahwa kebijakan tersebut gagal (kembalikan false).

Dalam file Program:

  • Tambahkan namespace untuk Microsoft.AspNetCore.Components dan System.Linq:

    using Microsoft.AspNetCore.Components;
    using System.Linq;
    
  • Tambahkan kebijakan:

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

Contoh sebelumnya adalah kebijakan otorisasi yang terlalu disederhanakan, hanya digunakan untuk menunjukkan konsep dengan contoh kerja. Untuk informasi lebih lanjut tentang membuat dan mengonfigurasi kebijakan otorisasi, lihat Otorisasi berbasis kebijakan di ASP.NET Core.

Dalam komponen EditUser berikut, sumber daya di /users/{id}/edit memiliki parameter rute untuk pengidentifikasi pengguna ({id}). Komponen menggunakan kebijakan otorisasi EditUser sebelumnya untuk menentukan apakah nilai rute untuk id dimulai dengan EMP. Jika id dimulai dengan EMP, kebijakan berhasil dan akses ke komponen diotorisasi. Jika id dimulai dengan nilai selain EMP atau jika id adalah string kosong, kebijakan gagal, dan komponen tidak dimuat.

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

Menyesuaikan konten yang tidak sah dengan Router komponen

Komponen Router, bersama dengan komponen AuthorizeRouteView, memungkinkan aplikasi menentukan konten khusus jika:

Penting

Blazor Fitur router yang menampilkan <NotAuthorized> dan <NotFound> konten tidak beroperasi selama penyajian sisi server statis (SSR statis) karena pemrosesan permintaan sepenuhnya ditangani oleh pemrosesan dan Razor komponen permintaan alur middleware core ASP.NET tidak dirender sama sekali untuk permintaan yang tidak sah atau buruk. Gunakan teknik sisi server untuk menangani permintaan yang tidak sah dan buruk selama SSR statis. Untuk informasi selengkapnya, lihat Blazor render ASP.NET Core.

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

Authorized Konten dan NotAuthorized dapat mencakup item arbitrer, seperti komponen interaktif lainnya.

Catatan

Sebelumnya memerlukan pendaftaran layanan status autentikasi berskala dalam file aplikasi Program :

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

NotFoundKonten , Authorized, dan NotAuthorized dapat mencakup item arbitrer, seperti komponen interaktif lainnya.

Jika NotAuthorized konten tidak ditentukan, AuthorizeRouteView gunakan pesan fallback berikut:

Not authorized.

Aplikasi yang dibuat dari Blazor WebAssembly templat proyek dengan autentikasi diaktifkan menyertakan RedirectToLogin komponen, yang diposisikan dalam <NotAuthorized> konten Router komponen. Saat pengguna tidak diautentikasi (context.User.Identity?.IsAuthenticated != true), RedirectToLogin komponen mengalihkan browser ke authentication/login titik akhir untuk autentikasi. Pengguna dikembalikan ke URL yang diminta setelah mengautentikasi dengan penyedia identitas.

Logika prosedural

Jika aplikasi diperlukan untuk memeriksa aturan otorisasi sebagai bagian dari logika prosedural, gunakan parameter berskala dari jenis Task<AuthenticationState> untuk mendapatkan ClaimsPrincipal pengguna. Task< AuthenticationState > dapat digabungkan dengan layanan lain, seperti IAuthorizationService, untuk mengevaluasi kebijakan.

Dalam contoh berikut:

  • Kode user.Identity.IsAuthenticated eksekusi untuk pengguna yang diautentikasi (masuk).
  • Kode user.IsInRole("admin") eksekusi untuk pengguna dalam peran 'Admin'.
  • Kode (await AuthorizationService.AuthorizeAsync(user, "content-editor")).Succeeded eksekusi untuk pengguna yang memenuhi kebijakan 'content-editor'.

Aplikasi sisi Blazor server menyertakan namespace yang sesuai saat dibuat dari templat proyek. Di aplikasi sisi Blazor klien, konfirmasikan keberadaan Microsoft.AspNetCore.Authorization namespace layanan dan Microsoft.AspNetCore.Components.Authorization baik di komponen atau di file aplikasi _Imports.razor :

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

Memecahkan masalah kesalahan

Kesalahan umum:

  • Otorisasi memerlukan parameter berskala dari jenis Task<AuthenticationState>. Pertimbangkan untuk menggunakan CascadingAuthenticationState guna menyediakan ini.

  • null nilai diterima untuk authenticationStateTask

Kemungkinan proyek tidak dibuat menggunakan templat sisi Blazor server dengan autentikasi diaktifkan.

Di .NET 7 atau yang lebih lama, bungkus <CascadingAuthenticationState> beberapa bagian pohon UI, misalnya di Blazor sekitar router:

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

Di .NET 8 atau yang lebih baru, jangan gunakan CascadingAuthenticationState komponen:

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

Sebagai gantinya, tambahkan layanan status autentikasi berkala ke kumpulan layanan dalam Program file:

builder.Services.AddCascadingAuthenticationState();

Komponen CascadingAuthenticationState (.NET 7 atau yang lebih lama) atau layanan yang disediakan oleh AddCascadingAuthenticationState (.NET 8 atau yang lebih baru) memasok parameter kaskadingTask<AuthenticationState>, yang pada gilirannya menerima dari layanan injeksi dependensi yang mendasarinya.AuthenticationStateProvider

Informasi Pengidentifikasi Pribadi (PII)

Microsoft menggunakan definisi GDPR untuk 'data pribadi' (GDPR 4.1) saat dokumentasi membahas Informasi Pengidentifikasi Pribadi (PII).

PII merujuk informasi apa pun yang berkaitan dengan orang alami yang diidentifikasi atau dapat diidentifikasi. Orang alami yang dapat diidentifikasi adalah orang yang dapat diidentifikasi, secara langsung atau tidak langsung, dengan salah satu hal berikut:

  • Nama
  • Nomor identifikasi
  • Koordinat lokasi
  • Pengidentifikasi online
  • Faktor spesifik lainnya
    • Fisik
    • Fisiologis
    • Genetik
    • Mental (psikologis)
    • Ekonomi
    • Budaya
    • Identitas sosial

Sumber Daya Tambahan: