Bagikan melalui


Mengamankan ASP.NET Core Blazor WebAssembly

Catatan

Ini bukan versi terbaru dari artikel ini. 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.

Aplikasi Blazor WebAssembly diamankan dengan cara yang sama seperti aplikasi satu halaman (SPA). Ada beberapa pendekatan untuk mengautentikasi pengguna ke SPA, tetapi pendekatan yang paling umum dan komprehensif adalah menggunakan penerapan berdasarkan protokol OAuth 2.0, seperti OpenID Connect (OIDC).

Dokumentasi Blazor WebAssembly keamanan terutama berfokus pada cara menyelesaikan tugas autentikasi dan otorisasi pengguna. Untuk cakupan konsep umum OAuth 2.0/OIDC, lihat sumber daya di bagian Gambaran umum utama Sumber daya tambahan.

Keamanan sisi klien/SPA

Basis Blazor WebAssembly kode .NET/C# aplikasi disajikan kepada klien, dan kode aplikasi tidak dapat dilindungi dari inspeksi dan perubahan oleh pengguna. Jangan pernah menempatkan sesuatu yang bersifat rahasia ke dalam Blazor WebAssembly aplikasi, seperti kode .NET/C# privat, kunci keamanan, kata sandi, atau jenis informasi sensitif lainnya.

Untuk melindungi kode .NET/C# dan menggunakan fitur Perlindungan Data Inti ASP.NET untuk mengamankan data, gunakan API web ASP.NET Core sisi server. Minta aplikasi sisi Blazor WebAssembly klien memanggil API web sisi server untuk fitur aplikasi yang aman dan pemrosesan data. Untuk informasi selengkapnya, lihat Memanggil API web dari aplikasi ASP.NET Core Blazor dan artikel di simpul ini.

Pustaka autentikasi

Blazor WebAssemblymendukung autentikasi dan otorisasi aplikasi menggunakan OIDC melalui Microsoft.AspNetCore.Components.WebAssembly.Authentication pustaka menggunakan Platform MicrosoftIdentity. Pustaka menyediakan satu set primitif untuk mengautentikasi backend ASP.NET Core dengan lancar. Pustaka dapat mengautentikasi Penyedia (IP) pihak ketiga Identity mana pun yang mendukung OIDC, yang disebut Penyedia OpenID (OP).

Dukungan autentikasi di Blazor WebAssembly Pustaka (Authentication.js) dibangun di atas Microsoft Authentication Library (MSAL, msal.js), yang digunakan untuk menangani detail protokol autentikasi yang mendasar. Blazor WebAssembly Pustaka hanya mendukung alur kode otorisasi Proof Key for Code Exchange (PKCE). Pemberian implisit tidak didukung.

Anda dapat menggunakan opsi lain untuk mengautentikasi SPA, seperti menggunakan SameSite cookie. Namun, desain Blazor WebAssembly rekayasa menggunakan OAuth dan OIDC sebagai opsi terbaik untuk autentikasi di Blazor WebAssembly aplikasi. Autentikasi berbasis token berdasarkan JSON Web Tokens (JWTs) lebih banyak dipilih cookiedaripada autentikasi berbasis karena alasan fungsional dan keamanan:

  • Menggunakan protokol berbasis token menawarkan area permukaan serangan yang lebih kecil, karena token tidak dikirim di semua permintaan.
  • Titik akhir server tidak memerlukan perlindungan terhadap Pemalsuan Permintaan Antar Situs (CSRF) karena token dikirim secara eksplisit. Hal ini memungkinkan Anda menghosting aplikasi Blazor WebAssembly bersama MVC atau aplikasi halaman Razor.
  • Token memiliki izin yang lebih sedikit dari cookie. Misalnya, token tidak dapat digunakan untuk mengelola akun pengguna atau mengubah kata sandi pengguna kecuali fungsi tersebut diterapkan secara eksplisit.
  • Token memiliki masa pakai yang singkat, satu jam secara default, yang membatasi jendela serangan. Token juga dapat dicabut kapan saja.
  • JWT mandiri menawarkan jaminan kepada klien dan server tentang proses autentikasi. Misalnya, klien memiliki sarana untuk mendeteksi dan memvalidasi bahwa token yang diterimanya sah dan dikeluarkan sebagai bagian dari proses autentikasi yang diberikan. Jika pihak ketiga mencoba untuk mengganti token di tengah proses autentikasi, klien dapat mendeteksi token yang dialihkan dan menghindari menggunakannya.
  • Token dengan OAuth dan OIDC tidak bergantung pada agen pengguna yang berperilaku benar untuk memastikan bahwa aplikasi tersebut aman.
  • Protokol berbasis token, seperti OAuth dan OIDC, memungkinkan untuk mengautentikasi dan mengotorisasi pengguna di aplikasi Webassembly mandiri Blazor dengan serangkaian karakteristik keamanan yang sama.
  • Menggunakan protokol berbasis token menawarkan area permukaan serangan yang lebih kecil, karena token tidak dikirim di semua permintaan.
  • Titik akhir server tidak memerlukan perlindungan terhadap Pemalsuan Permintaan Antar Situs (CSRF) karena token dikirim secara eksplisit. Hal ini memungkinkan Anda menghosting aplikasi Blazor WebAssembly bersama MVC atau aplikasi halaman Razor.
  • Token memiliki izin yang lebih sedikit dari cookie. Misalnya, token tidak dapat digunakan untuk mengelola akun pengguna atau mengubah kata sandi pengguna kecuali fungsi tersebut diterapkan secara eksplisit.
  • Token memiliki masa pakai yang singkat, satu jam secara default, yang membatasi jendela serangan. Token juga dapat dicabut kapan saja.
  • JWT mandiri menawarkan jaminan kepada klien dan server tentang proses autentikasi. Misalnya, klien memiliki sarana untuk mendeteksi dan memvalidasi bahwa token yang diterimanya sah dan dikeluarkan sebagai bagian dari proses autentikasi yang diberikan. Jika pihak ketiga mencoba untuk mengganti token di tengah proses autentikasi, klien dapat mendeteksi token yang dialihkan dan menghindari menggunakannya.
  • Token dengan OAuth dan OIDC tidak bergantung pada agen pengguna yang berperilaku benar untuk memastikan bahwa aplikasi tersebut aman.
  • Protokol berbasis token, seperti OAuth dan OIDC, memungkinkan untuk mengautentikasi dan mengotorisasi pengguna klien solusi yang dihosting Blazor WebAssembly dan aplikasi Webassembly mandiri Blazor dengan serangkaian karakteristik keamanan yang sama.

Penting

Untuk versi ASP.NET Core yang mengadopsi Duende Identity Server dalam Blazor templat proyek, Duende Software mungkin mengharuskan Anda membayar biaya lisensi untuk penggunaan produksi Duende Identity Server. Untuk informasi lebih lanjut, lihat Bermigrasi dari ASP.NET Core 5.0 ke 6.0.

Proses autentikasi dengan OIDC

Pustaka Microsoft.AspNetCore.Components.WebAssembly.Authentication menawarkan beberapa primitif untuk menerapkan autentikasi dan otorisasi menggunakan OIDC. Secara umum, autentikasi berfungsi sebagai berikut:

  • Saat pengguna anonim memilih tombol masuk atau meminta Razor komponen atau halaman dengan [Authorize] atribut yang diterapkan, pengguna dialihkan ke halaman masuk aplikasi (/authentication/login).
  • Di halaman masuk, pustaka autentikasi mempersiapkan pengalihan ke titik akhir otorisasi. Titik akhir otorisasi berada di luar aplikasi Blazor WebAssembly dan dapat dihosting di asal yang terpisah. Titik akhir bertanggung jawab untuk menentukan apakah pengguna diautentikasi dan untuk mengeluarkan satu atau beberapa token sebagai respons. Pustaka autentikasi menyediakan panggilan balik masuk untuk menerima respons autentikasi.
    • Jika pengguna tidak diautentikasi, pengguna akan diarahkan ke sistem autentikasi yang mendasarinya, yang biasanya adalah ASP.NET Core Identity.
    • Jika pengguna telah diautentikasi, titik akhir otorisasi akan menghasilkan token yang sesuai dan mengalihkan browser kembali ke titik akhir panggilan balik masuk (/authentication/login-callback).
  • Saat aplikasi Blazor WebAssembly memuat titik akhir panggilan balik masuk (/authentication/login-callback), respons autentikasi diproses.
    • Jika proses autentikasi berhasil diselesaikan, pengguna diautentikasi dan secara opsional dikirim kembali ke URL asli yang dilindungi yang diminta pengguna.
    • Jika proses autentikasi gagal karena alasan apa pun, pengguna dikirim ke halaman gagal masuk (/authentication/login-failed), tempat kesalahan ditampilkan.

Authentication komponen

Komponen Authentication (Authentication.razor) menangani operasi autentikasi jarak jauh dan mengizinkan aplikasi untuk:

  • Mengonfigurasi rute aplikasi untuk status autentikasi.
  • Mengatur konten UI untuk status autentikasi.
  • Mengelola status autentikasi.

Tindakan autentikasi, seperti mendaftarkan atau memasukkan pengguna, diteruskan ke komponen RemoteAuthenticatorViewCore<TAuthenticationState> kerangka kerja Blazor, yang tetap ada dan mengontrol status di seluruh operasi autentikasi.

Untuk informasi dan contoh selengkapnya, lihat skenario keamanan tambahan Blazor WebAssembly ASP.NET Core.

Authorization

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

Selalu lakukan pemeriksaan otorisasi pada server dalam setiap titik akhir API yang diakses oleh aplikasi sisi klien Anda.

Menyesuaikan autentikasi

Blazor WebAssembly menyediakan metode untuk menambahkan dan mengambil parameter tambahan pustaka Autentikasi yang mendasari guna melakukan operasi autentikasi jarak jauh dengan penyedia identitas eksternal.

Untuk meneruskan parameter tambahan, NavigationManager mendukung melewati dan mengambil status entri riwayat saat melakukan perubahan lokasi eksternal. Untuk informasi selengkapnya, lihat sumber daya berikut:

Status yang disimpan oleh API Riwayat memberikan manfaat berikut untuk autentikasi jarak jauh:

  • Status yang diteruskan ke titik akhir aplikasi yang diamankan terkait dengan navigasi yang dilakukan untuk mengautentikasi pengguna di titik akhir authentication/login.
  • Pengodean dan pendekodean data kerja tambahan dihindari.
  • Area permukaan serangan berkurang. Tidak seperti menggunakan string kueri untuk menyimpan status navigasi, navigasi tingkat atas atau pengaruh dari asal yang berbeda tidak dapat mengatur status yang disimpan oleh API Riwayat.
  • Entri riwayat diganti setelah autentikasi berhasil, sehingga status yang dilampirkan ke entri riwayat dihapus dan tidak memerlukan pembersihan.

InteractiveRequestOptions mewakili permintaan kepada Penyedia Identitas untuk masuk atau menyediakan token akses.

NavigationManagerExtensions menyediakan metode NavigateToLogin untuk operasi masuk dan NavigateToLogout untuk operasi keluar. Metode memanggil NavigationManager.NavigateTo, mengatur status entri riwayat dengan InteractiveRequestOptions yang diteruskan atau instans InteractiveRequestOptions baru yang dibuat oleh metode untuk:

Skenario autentikasi berikut dibahas dalam artikel Blazor WebAssemblyskenario keamanan tambahan ASP.NET Core:

  • Menyesuaikan proses masuk
  • Keluar dengan URL pengembalian kustom
  • Menyesuaikan opsi sebelum mendapatkan token secara interaktif
  • Menyesuaikan opsi saat menggunakan IAccessTokenProvider
  • Mendapatkan jalur masuk dari opsi autentikasi

Memerlukan otorisasi untuk seluruh aplikasi

Terapkan atribut (dokumentasi API) ke setiap Razor komponen aplikasi menggunakan salah satu pendekatan berikut:[Authorize]

  • Dalam file Impor aplikasi, tambahkan arahan @using untuk namespace Microsoft.AspNetCore.Authorization dengan arahan @attribute untuk atribut [Authorize].

    _Imports.razor:

    @using Microsoft.AspNetCore.Authorization
    @attribute [Authorize]
    

    Izinkan akses anonim ke Authentication komponen untuk mengizinkan pengalihan ke Penyedia Identitas. Tambahkan kode Razor berikut ke komponen Authentication di bagian arahan @page-nya.

    Authentication.razor:

    @using Microsoft.AspNetCore.Components.WebAssembly.Authentication
    @attribute [AllowAnonymous]
    
  • Tambahkan atribut ke setiap Razor komponen di bawah arahan @page :

    @using Microsoft.AspNetCore.Authorization
    @attribute [Authorize]
    

Catatan

Mengatur AuthorizationOptions.FallbackPolicy ke kebijakan dengan RequireAuthenticatedUsertidak didukung.

Menggunakan satu pendaftaran aplikasi penyedia identitas per aplikasi

Beberapa artikel di bawah Gambaran Umum ini berkaitan dengan Blazor skenario hosting yang melibatkan dua aplikasi atau lebih. Aplikasi mandiri Blazor WebAssembly menggunakan API web dengan pengguna terautentikasi untuk mengakses sumber daya server dan data yang disediakan oleh aplikasi server.

Ketika skenario ini diterapkan dalam contoh dokumentasi, dua pendaftaran penyedia identitas digunakan, satu untuk aplikasi klien dan satu untuk aplikasi server. Menggunakan pendaftaran terpisah, misalnya di ID Microsoft Entra, tidak diperlukan secara ketat. Namun, menggunakan dua pendaftaran adalah praktik terbaik keamanan karena mengisolasi pendaftaran berdasarkan aplikasi. Menggunakan pendaftaran terpisah juga memungkinkan konfigurasi independen pendaftaran klien dan server.

Beberapa artikel di bawah Gambaran Umum ini berkaitan dengan salah satu skenario hosting berikut Blazor yang melibatkan dua aplikasi atau lebih:

  • Solusi yang dihosting Blazor WebAssembly , yang terdiri dari dua aplikasi: aplikasi sisi Blazor WebAssembly klien dan aplikasi host ASP.NET Core sisi server. Pengguna terautentikasi ke sumber daya server akses aplikasi klien dan data yang disediakan oleh aplikasi server.
  • Aplikasi mandiri Blazor WebAssembly yang menggunakan API web dengan pengguna terautentikasi untuk mengakses sumber daya server dan data yang disediakan oleh aplikasi server. Skenario ini mirip dengan menggunakan solusi yang dihosting Blazor WebAssembly ; tetapi dalam hal ini, aplikasi klien tidak dihosting oleh aplikasi server.

Ketika skenario ini diterapkan dalam contoh dokumentasi, dua pendaftaran penyedia identitas digunakan, satu untuk aplikasi klien dan satu untuk aplikasi server. Menggunakan pendaftaran terpisah, misalnya di ID Microsoft Entra, tidak diperlukan secara ketat. Namun, menggunakan dua pendaftaran adalah praktik terbaik keamanan karena mengisolasi pendaftaran berdasarkan aplikasi. Menggunakan pendaftaran terpisah juga memungkinkan konfigurasi independen pendaftaran klien dan server.

Token refresh

Meskipun token refresh tidak dapat diamankan di Blazor WebAssembly aplikasi, token tersebut dapat digunakan jika Anda menerapkannya dengan strategi keamanan yang sesuai.

Untuk aplikasi mandiri Blazor WebAssembly di ASP.NET Core di .NET 6 atau yang lebih baru, sebaiknya gunakan:

Untuk solusi yang dihosting Blazor WebAssembly , token refresh dapat dipertahankan dan digunakan oleh aplikasi sisi server untuk mengakses API pihak ketiga. Untuk informasi lebih lanjut, lihat skenario keamanan tambahan Blazor WebAssembly ASP.NET Core.

Untuk informasi selengkapnya, lihat sumber daya berikut:

Menetapkan klaim untuk pengguna

Aplikasi sering memerlukan klaim untuk pengguna berdasarkan panggilan API web ke server. Misalnya, klaim sering digunakan untuk membuat otorisasi dalam aplikasi. Dalam skenario ini, aplikasi meminta token akses untuk mengakses layanan dan menggunakan token untuk mendapatkan data pengguna untuk membuat klaim.

Sebagai contoh, lihat sumber daya berikut:

Dukungan pra-penyajian

Prarendering tidak didukung untuk titik akhir autentikasi (segmen jalur /authentication/).

Prarendering tidak didukung untuk titik akhir autentikasi (segmen jalur /authentication/).

Untuk informasi lebih lanjut, lihat skenario keamanan tambahan Blazor WebAssembly 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.

Otentikasi Windows

Kami tidak menyarankan menggunakan Autentikasi Windows dengan Webassembly Blazor atau dengan kerangka kerja SPA lainnya. Sebaiknya gunakan protokol berbasis token, bukan Autentikasi Windows, seperti OIDC dengan Active Directory Federation Services (ADFS).

Jika Autentikasi Windows digunakan dengan Webassembly Blazor atau dengan kerangka kerja SPA lainnya, tindakan tambahan diperlukan untuk melindungi aplikasi dari token pemalsuan permintaan antar situs (CSRF). Masalah yang sama yang berlaku untuk cookieberlaku untuk Autentikasi Windows dengan penambahan bahwa Autentikasi Windows tidak menawarkan mekanisme untuk mencegah berbagi konteks autentikasi di seluruh asal. Aplikasi yang menggunakan Autentikasi Windows tanpa perlindungan tambahan dari CSRF setidaknya harus dibatasi untuk intranet organisasi dan tidak digunakan di Internet terbuka.

Untuk informasi selengkapnya, lihat Mencegah serangan Pemalsuan Permintaan Antar Situs (XSRF/CSRF) di ASP.NET Core.

Mengamankan hub SignalR

Untuk mengamankan SignalR hub dalam proyek API server, terapkan [Authorize] atribut ke kelas hub atau ke metode kelas hub.

Dalam proyek klien dengan pra-penyajian, seperti yang dihosting Blazor WebAssembly (ASP.NET Core di .NET 7 atau yang lebih lama) atau Blazor Aplikasi Web (ASP.NET Core di .NET 8 atau yang lebih baru), lihat panduan dalam panduan ASP.NET CoreBlazorSignalR.

Dalam komponen proyek klien tanpa prarender, seperti aplikasi mandiri Blazor WebAssembly, atau non-browser, berikan token akses ke koneksi hub, seperti yang ditunjukkan contoh berikut. Untuk informasi selengkapnya, lihat Autentikasi dan otorisasi di ASP.NET Core SignalR.

@using Microsoft.AspNetCore.Components.WebAssembly.Authentication
@inject IAccessTokenProvider TokenProvider
@inject NavigationManager Navigation

...

var tokenResult = await TokenProvider.RequestAccessToken();

if (tokenResult.TryGetToken(out var token))
{
    hubConnection = new HubConnectionBuilder()
        .WithUrl(Navigation.ToAbsoluteUri("/chathub"), 
            options => { options.AccessTokenProvider = () => Task.FromResult(token?.Value); })
        .Build();

  ...
}

Pencatatan

Bagian ini berlaku untuk Blazor WebAssembly aplikasi di ASP.NET Core di .NET 7 atau yang lebih baru.

Untuk mengaktifkan pembuatan log debug atau pelacakan, lihat bagian Pengelogan autentikasi (Blazor WebAssembly) di artikel pembuatan log ASP.NET Core Blazor versi 7.0 atau yang lebih baru.

Kotak pasir WebAssembly

Kotak pasir WebAssembly membatasi akses ke lingkungan sistem yang menjalankan kode WebAssembly, termasuk akses ke subsistem I/O, penyimpanan sistem dan sumber daya, dan sistem operasi. Isolasi antara kode WebAssembly dan sistem yang menjalankan kode menjadikan WebAssembly kerangka kerja pengkodean yang aman untuk sistem. Namun, WebAssembly rentan terhadap serangan saluran samping di tingkat perangkat keras. Tindakan pencegahan normal dan uji tanggap dalam sumber perangkat keras dan menempatkan batasan dalam mengakses perangkat keras berlaku.

WebAssembly tidak dimiliki atau dikelola oleh Microsoft.

Untuk informasi selengkapnya, lihat sumber daya W3C berikut ini:

  • WebAssembly: Keamanan
  • Spesifikasi WebAssembly: Pertimbangan Keamanan
  • W3C WebAssembly Community Group: Umpan balik dan masalah: Tautan Grup Komunitas W3C WebAssembly hanya disediakan untuk referensi, sehingga jelas bahwa kerentanan dan bug keamanan WebAssembly di-patch secara berkelanjutan, sering dilaporkan dan ditangani oleh browser. Jangan mengirim umpan balik atau laporan bug ke Grup Komunitas W3C WebAssembly.Blazor umpan balik harus dilaporkan Blazor ke unit produk Microsoft ASP.NET Core. Jika unit produk Microsoft menentukan bahwa masalah yang mendasar dengan WebAssembly ada, mereka mengambil langkah-langkah yang sesuai untuk melaporkan masalah ke Grup Komunitas W3C WebAssembly.

Panduan implementasi

Artikel di bagian Ringkasan ini memberikan informasi tentang mengautentikasi pengguna di aplikasi Blazor WebAssembly terhadap penyedia tertentu.

Aplikasi Blazor WebAssembly mandiri:

Panduan konfigurasi lebih lanjut dapat ditemukan di artikel berikut:

Menggunakan alur Kode Otorisasi dengan PKCE

platform identitas MicrosoftPustaka Autentikasi Microsoft untuk JavaScript (MSAL) v2.0 atau yang lebih baru menyediakan dukungan untuk alur Kode Otorisasi dengan Proof Key for Code Exchange (PKCE) dan Cross-Origin Resource Sharing (CORS) untuk aplikasi satu halaman, termasuk Blazor.

Microsoft tidak merekomendasikan penggunaan pemberian implisit.

Untuk informasi selengkapnya, lihat sumber daya berikut:

Sumber Daya Tambahan: