Bagikan melalui


Mengamankan ASP.NET Core Blazor Web App dengan OpenID Connect (OIDC)

Artikel ini menjelaskan cara mengamankan Blazor Aplikasi Web dengan OpenID Connect (OIDC) menggunakan aplikasi sampel didotnet/blazor-samples repositori GitHub (.NET 8 atau yang lebih baru) (cara mengunduh).

Versi artikel ini mencakup penerapan OIDC tanpa mengadopsi pola Backend for Frontend (BFF). Pola BFF berguna untuk membuat permintaan terautentikasi ke layanan eksternal. Ubah pemilih versi artikel ke OIDC dengan pola BFF jika spesifikasi aplikasi memanggil untuk mengadopsi pola BFF.

Spesifikasi berikut tercakup:

  • Blazor Aplikasi Web menggunakan mode Render otomatis dengan interaktivitas global.
  • Layanan penyedia status autentikasi kustom digunakan oleh server dan aplikasi klien untuk menangkap status autentikasi pengguna dan mengalirkannya antara server dan klien.
  • Aplikasi ini adalah titik awal untuk alur autentikasi OIDC apa pun. OIDC dikonfigurasi secara manual di aplikasi dan tidak mengandalkan ID Microsoft Entra atau paket Web MicrosoftIdentity, aplikasi sampel juga tidak memerlukan hosting Microsoft Azure. Namun, aplikasi sampel dapat digunakan dengan Entra, Microsoft Identity Web, dan dihosting di Azure.
  • Refresh token non-interaktif otomatis.
  • Memanggil API (web) dengan aman di proyek server untuk data.

Aplikasi sampel

Aplikasi sampel terdiri dari dua proyek:

  • BlazorWebAppOidc: Proyek sisi server Aplikasi Blazor Web, berisi contoh titik akhir API Minimal untuk data cuaca.
  • BlazorWebAppOidc.Client: Proyek sisi klien Aplikasi Blazor Web.

Akses aplikasi sampel melalui folder versi terbaru dari akar repositori dengan tautan berikut. Proyek berada di BlazorWebAppOidc folder untuk .NET 8 atau yang lebih baru.

Melihat atau mengunduh kode sampel (cara mengunduh)

Proyek Aplikasi Web sisi Blazor server (BlazorWebAppOidc)

Proyek BlazorWebAppOidc ini adalah proyek sisi server dari Blazor Aplikasi Web.

File BlazorWebAppOidc.http dapat digunakan untuk menguji permintaan data cuaca. Perhatikan bahwa BlazorWebAppOidc proyek harus berjalan untuk menguji titik akhir, dan titik akhir dikodekan secara permanen ke dalam file. Untuk informasi selengkapnya, lihat Menggunakan file .http di Visual Studio 2022.

Catatan

Proyek server menggunakan IHttpContextAccessor/HttpContext, tetapi tidak pernah untuk komponen yang dirender secara interaktif. Untuk informasi selengkapnya, lihat Panduan mitigasi ancaman untuk penyajian sisi server interaktif ASP.NET CoreBlazor.

Konfigurasi

Bagian ini menjelaskan cara mengonfigurasi aplikasi sampel.

Catatan

Untuk MICROSOFT Entra ID dan Azure AD B2C, Anda dapat menggunakan AddMicrosoftIdentityWebApp dari Microsoft Identity Web (Microsoft.Identity.Web paket NuGet, dokumentasi API), yang menambahkan penangan OIDC dan Cookie autentikasi dengan default yang sesuai. Aplikasi sampel dan panduan di bagian ini tidak menggunakan Microsoft Identity Web. Panduan ini menunjukkan cara mengonfigurasi handler OIDC secara manual untuk penyedia OIDC apa pun. Untuk informasi selengkapnya tentang menerapkan Microsoft Identity Web, lihat sumber daya tertaut.

Konfigurasi berikut OpenIdConnectOptions ditemukan dalam file proyek Program pada panggilan ke AddOpenIdConnect:

  • SignInScheme: Mengatur skema autentikasi yang sesuai dengan middleware yang bertanggung jawab untuk mempertahankan identitas pengguna setelah autentikasi berhasil. Handler OIDC perlu menggunakan skema masuk yang mampu mempertahankan kredensial pengguna di seluruh permintaan. Baris berikut hadir hanya untuk tujuan demonstrasi. Jika dihilangkan, DefaultSignInScheme digunakan sebagai nilai fallback.

    oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    
  • Cakupan untuk openid dan profile (Scope) (Opsional): Cakupan openid dan profile juga dikonfigurasi secara default karena diperlukan agar handler OIDC berfungsi, tetapi ini mungkin perlu ditambahkan kembali jika cakupan disertakan dalam Authentication:Schemes:MicrosoftOidc:Scope konfigurasi. Untuk panduan konfigurasi umum, lihat Konfigurasi dalam konfigurasi ASP.NET Core dan ASP.NET CoreBlazor.

    oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
    
  • SaveTokens: Menentukan apakah akses dan token refresh harus disimpan setelah AuthenticationProperties otorisasi berhasil. Properti ini diatur ke false secara default untuk mengurangi ukuran autentikasi cookieakhir .

    oidcOptions.SaveTokens = false;
    
  • Cakupan untuk akses offline (Scope): Cakupan offline_access diperlukan untuk token refresh.

    oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
    
  • Authority dan ClientId: Mengatur Otoritas dan ID Klien untuk panggilan OIDC.

    oidcOptions.Authority = "{AUTHORITY}";
    oidcOptions.ClientId = "{CLIENT ID}";
    

    Contoh:

    • Otoritas ({AUTHORITY}): https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ (menggunakan ID a3942615-d115-4eb7-bc84-9974abcf5064Penyewa )
    • Id Klien ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    oidcOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    oidcOptions.ClientId = "4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    Contoh untuk otoritas "umum" Microsoft Azure:

    Otoritas "umum" harus digunakan untuk aplikasi multi-penyewa. Anda juga dapat menggunakan otoritas "umum" untuk aplikasi penyewa tunggal, tetapi kustom IssuerValidator diperlukan, seperti yang ditunjukkan nanti di bagian ini.

    oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0/";
    
  • ClientSecret: Rahasia klien OIDC.

    Contoh berikut hanya untuk tujuan pengujian dan demonstrasi. Jangan simpan rahasia klien di rakitan aplikasi atau periksa rahasia ke kontrol sumber. Simpan rahasia klien di Rahasia Pengguna, Azure Key Vault, atau variabel lingkungan.

    Konfigurasi skema autentikasi secara otomatis dibaca dari builder.Configuration["Authentication:Schemes:{SCHEME NAME}:{PropertyName}"], di mana {SCHEME NAME} tempat penampung adalah skema, yang secara MicrosoftOidc default. Karena konfigurasi telah dikonfigurasi sebelumnya, rahasia klien dapat secara otomatis dibaca melalui Authentication:Schemes:MicrosoftOidc:ClientSecret kunci konfigurasi. Di server menggunakan variabel lingkungan, beri nama variabel Authentication__Schemes__MicrosoftOidc__ClientSecretlingkungan :

    set Authentication__Schemes__MicrosoftOidc__ClientSecret={CLIENT SECRET}
    

    Untuk demonstrasi dan pengujian saja, ClientSecret dapat diatur secara langsung. Jangan atur nilai secara langsung untuk aplikasi produksi yang disebarkan. Untuk keamanan yang sedikit ditingkatkan, kompilasi garis secara kondisional dengan DEBUG simbol :

    #if DEBUG
    oidcOptions.ClientSecret = "{CLIENT SECRET}";
    #endif
    

    Contoh:

    Rahasia klien ({CLIENT SECRET}): 463471c8c4...f90d674bc9 (dipersingkat untuk ditampilkan)

    #if DEBUG
    oidcOptions.ClientSecret = "463471c8c4...137f90d674bc9";
    #endif
    
  • ResponseType: Mengonfigurasi handler OIDC untuk hanya melakukan alur kode otorisasi. Pemberian implisit dan aliran hibrid tidak perlu dalam mode ini.

    Dalam konfigurasi pendaftaran aplikasi pemberian implisit dan alur hibrid Entra atau portal Azure, jangan pilih kotak centang untuk titik akhir otorisasi untuk mengembalikan token Akses atau token ID. Handler OIDC secara otomatis meminta token yang sesuai menggunakan kode yang dikembalikan dari titik akhir otorisasi.

    oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
    
  • MapInboundClaims dan konfigurasi dan NameClaimType RoleClaimType: Banyak server OIDC menggunakan "name" dan "role" daripada default SOAP/WS-Fed di ClaimTypes. Ketika MapInboundClaims diatur ke false, handler tidak melakukan pemetaan klaim dan nama klaim dari JWT digunakan langsung oleh aplikasi. Contoh berikut secara manual memetakan nama dan klaim peran:

Catatan

MapInboundClaims harus diatur ke false untuk sebagian besar penyedia OIDC, yang mencegah penggantian nama klaim.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = JwtRegisteredClaimNames.Name;
oidcOptions.TokenValidationParameters.RoleClaimType = "role";
  • Konfigurasi jalur: Jalur harus cocok dengan jalur URI pengalihan (jalur panggilan balik masuk) dan pengalihan pasca keluar (jalur panggilan balik keluar) yang dikonfigurasi saat mendaftarkan aplikasi dengan penyedia OIDC. Di portal Azure, jalur dikonfigurasi di bilah Autentikasi pendaftaran aplikasi. Jalur masuk dan keluar harus didaftarkan sebagai URI pengalihan. Nilai defaultnya adalah /signin-oidc dan /signout-callback-oidc.

    • CallbackPath: Jalur permintaan dalam jalur dasar aplikasi tempat agen pengguna dikembalikan.

      Di Entra atau portal Azure, atur jalur di URI Pengalihan konfigurasi platform Web:

      https://localhost/signin-oidc

      Catatan

      Port tidak diperlukan untuk localhost alamat saat menggunakan ID Microsoft Entra. Sebagian besar penyedia OIDC lainnya memerlukan port yang benar.

    • SignedOutCallbackPath: Jalur permintaan dalam jalur dasar aplikasi tempat agen pengguna dikembalikan setelah keluar dari penyedia identitas.

      Di Entra atau portal Azure, atur jalur di URI Pengalihan konfigurasi platform Web:

      https://localhost/signout-callback-oidc

      Catatan

      Port tidak diperlukan untuk localhost alamat saat menggunakan ID Microsoft Entra. Sebagian besar penyedia OIDC lainnya memerlukan port yang benar.

      Catatan

      Jika menggunakan Microsoft Identity Web, penyedia saat ini hanya mengalihkan kembali ke SignedOutCallbackPath jika microsoftonline.com Otoritas (https://login.microsoftonline.com/{TENANT ID}/v2.0/) digunakan. Batasan ini tidak ada jika Anda dapat menggunakan Otoritas "umum" dengan Microsoft Identity Web. Untuk informasi selengkapnya, lihat postLogoutRedirectUri tidak berfungsi saat url otoritas berisi ID penyewa (AzureAD/microsoft-authentication-library-for-js #5783).

    • RemoteSignOutPath: Permintaan yang diterima pada jalur ini menyebabkan handler memanggil keluar menggunakan skema keluar.

      Di Entra atau portal Azure, atur URL keluar saluran Depan:

      https://localhost/signout-oidc

      Catatan

      Port tidak diperlukan untuk localhost alamat saat menggunakan ID Microsoft Entra. Sebagian besar penyedia OIDC lainnya memerlukan port yang benar.

    oidcOptions.CallbackPath = new PathString("{PATH}");
    oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
    oidcOptions.RemoteSignOutPath = new PathString("{PATH}");
    

    Contoh (nilai default):

    oidcOptions.CallbackPath = new PathString("/signin-oidc");
    oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
    oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");
    
  • (Microsoft Azure hanya dengan titik akhir "umum") TokenValidationParameters.IssuerValidator: Banyak penyedia OIDC bekerja dengan validator penerbit default, tetapi kita perlu memperhitungkan pengeluar sertifikat yang diparameterkan dengan ID Penyewa ({TENANT ID}) yang dikembalikan oleh https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration. Untuk informasi selengkapnya, lihat SecurityTokenInvalidIssuerException dengan OpenID Connect dan titik akhir "umum" Microsoft Azure AD (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

    Hanya untuk aplikasi yang menggunakan ID Microsoft Entra atau Azure AD B2C dengan titik akhir "umum":

    var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
    oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;
    

Contoh kode aplikasi

Periksa aplikasi sampel untuk fitur berikut:

  • Refresh token non-interaktif otomatis dengan bantuan penyegaran kustom cookie (CookieOidcRefresher.cs).
  • Kelas PersistingAuthenticationStateProvider (PersistingAuthenticationStateProvider.cs) adalah sisi AuthenticationStateProvider server yang menggunakan PersistentComponentState untuk mengalirkan status autentikasi ke klien, yang kemudian diperbaiki selama masa pakai aplikasi WebAssembly.
  • Contoh permintaan ke Blazor Aplikasi Web untuk data cuaca ditangani oleh titik akhir API Minimal (/weather-forecast) dalam Program file (Program.cs). Titik akhir memerlukan otorisasi dengan memanggil RequireAuthorization. Untuk pengontrol apa pun yang Anda tambahkan ke proyek, tambahkan [Authorize] atribut ke pengontrol atau tindakan.
  • Aplikasi ini dengan aman memanggil API (web) di proyek server untuk data cuaca:
    • Saat merender Weather komponen di server, komponen menggunakan ServerWeatherForecaster di server untuk mendapatkan data cuaca secara langsung (bukan melalui panggilan API web).
    • Ketika komponen dirender pada klien, komponen menggunakan ClientWeatherForecaster implementasi layanan, yang menggunakan yang telah dikonfigurasi HttpClient sebelumnya (dalam file proyek Program klien) untuk melakukan panggilan API web ke proyek server. Titik akhir API Minimal (/weather-forecast) yang ditentukan dalam file proyek Program server mendapatkan data cuaca dari ServerWeatherForecaster dan mengembalikan data ke klien.

Untuk informasi selengkapnya tentang panggilan API (web) menggunakan abstraksi layanan di Blazor Web Apps, lihat Memanggil API web dari aplikasi ASP.NET CoreBlazor.

Proyek Aplikasi Web sisi Blazor klien (BlazorWebAppOidc.Client)

Proyek BlazorWebAppOidc.Client ini adalah proyek sisi klien dari Blazor Aplikasi Web.

Kelas PersistentAuthenticationStateProvider (PersistentAuthenticationStateProvider.cs) adalah sisi AuthenticationStateProvider klien yang menentukan status autentikasi pengguna dengan mencari data yang bertahan di halaman ketika dirender di server. Status autentikasi diperbaiki untuk masa pakai aplikasi WebAssembly.

Jika pengguna perlu masuk atau keluar, diperlukan pemuatan ulang halaman lengkap.

Aplikasi sampel hanya menyediakan nama pengguna dan email untuk tujuan tampilan. Ini tidak termasuk token yang mengautentikasi ke server saat membuat permintaan berikutnya, yang berfungsi secara terpisah menggunakan cookie yang disertakan pada HttpClient permintaan ke server.

Versi artikel ini mencakup penerapan OIDC dengan pola Backend for Frontend (BFF). Ubah pemilih versi artikel ke OIDC tanpa pola BFF jika spesifikasi aplikasi tidak memanggil untuk mengadopsi pola BFF.

Spesifikasi berikut tercakup:

  • Blazor Aplikasi Web menggunakan mode Render otomatis dengan interaktivitas global.
  • Layanan penyedia status autentikasi kustom digunakan oleh server dan aplikasi klien untuk menangkap status autentikasi pengguna dan mengalirkannya antara server dan klien.
  • Aplikasi ini adalah titik awal untuk alur autentikasi OIDC apa pun. OIDC dikonfigurasi secara manual di aplikasi dan tidak mengandalkan ID Microsoft Entra atau paket Web MicrosoftIdentity, aplikasi sampel juga tidak memerlukan hosting Microsoft Azure. Namun, aplikasi sampel dapat digunakan dengan Entra, Microsoft Identity Web, dan dihosting di Azure.
  • Refresh token non-interaktif otomatis.
  • Pola Backend for Frontend (BFF) diadopsi menggunakan .NET Aspire untuk penemuan layanan dan YARP untuk mem-proksi permintaan ke titik akhir prakiraan cuaca pada aplikasi backend.
    • API web backend menggunakan autentikasi pembawa JWT untuk memvalidasi token JWT yang disimpan oleh Blazor Aplikasi Web dalam rincian cookiemasuk .
    • Aspire meningkatkan pengalaman membangun aplikasi cloud-native .NET. Ini menyediakan serangkaian alat dan pola yang konsisten dan berpendapat untuk membangun dan menjalankan aplikasi terdistribusi.
    • YARP (Namun Proksi Terbalik Lainnya) adalah pustaka yang digunakan untuk membuat server proksi terbalik.

Untuk informasi selengkapnya tentang .NET Aspire, lihat Ketersediaan Umum .NET Aspire: Menyederhanakan .NET Cloud-Native Development (Mei 2024).

Prasyarat

.NET Aspire memerlukan Visual Studio versi 17.10 atau yang lebih baru.

Aplikasi sampel

Aplikasi sampel terdiri dari lima proyek:

  • .NET Aspire:
    • Aspire.AppHost: Digunakan untuk mengelola masalah orkestrasi tingkat tinggi aplikasi.
    • Aspire.ServiceDefaults: Berisi konfigurasi aplikasi .NET Aspire default yang dapat diperluas dan disesuaikan sesuai kebutuhan.
  • MinimalApiJwt: API web backend, berisi contoh titik akhir API Minimal untuk data cuaca.
  • BlazorWebAppOidc: Proyek sisi server Aplikasi Blazor Web.
  • BlazorWebAppOidc.Client: Proyek sisi klien Aplikasi Blazor Web.

Akses aplikasi sampel melalui folder versi terbaru dari akar repositori dengan tautan berikut. Proyek berada di BlazorWebAppOidcBff folder untuk .NET 8 atau yang lebih baru.

Melihat atau mengunduh kode sampel (cara mengunduh)

Proyek .NET Aspire

Untuk informasi selengkapnya tentang menggunakan .NET Aspire dan detail tentang .AppHost proyek dan .ServiceDefaults aplikasi sampel, lihat dokumentasi .NET Aspire.

Konfirmasikan bahwa Anda telah memenuhi prasyarat untuk .NET Aspire. Untuk informasi selengkapnya, lihat bagian Prasyarat mulai cepat: Membangun aplikasi .NET Aspire pertama Anda.

Aplikasi sampel hanya mengonfigurasi profil peluncuran HTTP yang tidak aman (http) untuk digunakan selama pengujian pengembangan. Untuk informasi selengkapnya, termasuk contoh profil pengaturan peluncuran yang tidak aman dan aman, lihat Mengizinkan transportasi yang tidak aman di .NET Aspire (dokumentasi.NET Aspire).

Proyek Aplikasi Web sisi Blazor server (BlazorWebAppOidc)

Proyek BlazorWebAppOidc ini adalah proyek sisi server dari Blazor Aplikasi Web. Proyek ini menggunakan YARP untuk memproksi permintaan ke titik akhir prakiraan cuaca di proyek API web backend (MinimalApiJwt) dengan access_token yang disimpan dalam autentikasi cookie.

File BlazorWebAppOidc.http dapat digunakan untuk menguji permintaan data cuaca. Perhatikan bahwa BlazorWebAppOidc proyek harus berjalan untuk menguji titik akhir, dan titik akhir dikodekan secara permanen ke dalam file. Untuk informasi selengkapnya, lihat Menggunakan file .http di Visual Studio 2022.

Catatan

Proyek server menggunakan IHttpContextAccessor/HttpContext, tetapi tidak pernah untuk komponen yang dirender secara interaktif. Untuk informasi selengkapnya, lihat Panduan mitigasi ancaman untuk penyajian sisi server interaktif ASP.NET CoreBlazor.

Konfigurasi

Bagian ini menjelaskan cara mengonfigurasi aplikasi sampel.

Catatan

Untuk MICROSOFT Entra ID dan Azure AD B2C, Anda dapat menggunakan AddMicrosoftIdentityWebApp dari Microsoft Identity Web (Microsoft.Identity.Web paket NuGet, dokumentasi API), yang menambahkan penangan OIDC dan Cookie autentikasi dengan default yang sesuai. Aplikasi sampel dan panduan di bagian ini tidak menggunakan Microsoft Identity Web. Panduan ini menunjukkan cara mengonfigurasi handler OIDC secara manual untuk penyedia OIDC apa pun. Untuk informasi selengkapnya tentang menerapkan Microsoft Identity Web, lihat sumber daya tertaut.

Konfigurasi berikut OpenIdConnectOptions ditemukan dalam file proyek Program pada panggilan ke AddOpenIdConnect:

  • SignInScheme: Mengatur skema autentikasi yang sesuai dengan middleware yang bertanggung jawab untuk mempertahankan identitas pengguna setelah autentikasi berhasil. Handler OIDC perlu menggunakan skema masuk yang mampu mempertahankan kredensial pengguna di seluruh permintaan. Baris berikut hadir hanya untuk tujuan demonstrasi. Jika dihilangkan, DefaultSignInScheme digunakan sebagai nilai fallback.

    oidcOptions.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    
  • Cakupan untuk openid dan profile (Scope) (Opsional): Cakupan openid dan profile juga dikonfigurasi secara default karena diperlukan agar handler OIDC berfungsi, tetapi ini mungkin perlu ditambahkan kembali jika cakupan disertakan dalam Authentication:Schemes:MicrosoftOidc:Scope konfigurasi. Untuk panduan konfigurasi umum, lihat Konfigurasi dalam konfigurasi ASP.NET Core dan ASP.NET CoreBlazor.

    oidcOptions.Scope.Add(OpenIdConnectScope.OpenIdProfile);
    
  • SaveTokens: Menentukan apakah akses dan token refresh harus disimpan setelah AuthenticationProperties otorisasi berhasil. Nilai diatur ke true untuk mengautentikasi permintaan data cuaca dari proyek API web backend (MinimalApiJwt).

    oidcOptions.SaveTokens = true;
    
  • Cakupan untuk akses offline (Scope): Cakupan offline_access diperlukan untuk token refresh.

    oidcOptions.Scope.Add(OpenIdConnectScope.OfflineAccess);
    
  • Cakupan untuk mendapatkan data cuaca dari API web (Scope): Cakupan Weather.Get dikonfigurasi di portal Azure atau Entra di bawah Mengekspos API. Ini diperlukan untuk proyek API web backend (MinimalApiJwt) untuk memvalidasi token akses dengan pembawa JWT.

    oidcOptions.Scope.Add("{APP ID URI}/{API NAME}");
    

    Contoh:

    • URI ID Aplikasi ({APP ID URI}): https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}
      • Nama Direktori ({DIRECTORY NAME}): contoso
      • Id Aplikasi (Klien) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    • Cakupan yang dikonfigurasi untuk data cuaca dari MinimalApiJwt ({API NAME}): Weather.Get
    oidcOptions.Scope.Add("https://contoso.onmicrosoft.com/4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f/Weather.Get");
    

    Contoh sebelumnya berkaitan dengan aplikasi yang terdaftar di penyewa dengan jenis penyewa AAD B2C. Jika aplikasi terdaftar di penyewa ME-ID, URI ID Aplikasi berbeda, sehingga cakupannya berbeda.

    Contoh:

    • URI ID Aplikasi ({APP ID URI}): api://{CLIENT ID} dengan Id Aplikasi (Klien) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    • Cakupan yang dikonfigurasi untuk data cuaca dari MinimalApiJwt ({API NAME}): Weather.Get
    oidcOptions.Scope.Add("api://4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f/Weather.Get");
    
  • Authority dan ClientId: Mengatur Otoritas dan ID Klien untuk panggilan OIDC.

    oidcOptions.Authority = "{AUTHORITY}";
    oidcOptions.ClientId = "{CLIENT ID}";
    

    Contoh:

    • Otoritas ({AUTHORITY}): https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ (menggunakan ID a3942615-d115-4eb7-bc84-9974abcf5064Penyewa )
    • Id Klien ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    oidcOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    oidcOptions.ClientId = "4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    Contoh untuk otoritas "umum" Microsoft Azure:

    Otoritas "umum" harus digunakan untuk aplikasi multi-penyewa. Anda juga dapat menggunakan otoritas "umum" untuk aplikasi penyewa tunggal, tetapi kustom IssuerValidator diperlukan, seperti yang ditunjukkan nanti di bagian ini.

    oidcOptions.Authority = "https://login.microsoftonline.com/common/v2.0/";
    
  • ClientSecret: Rahasia klien OIDC.

    Contoh berikut hanya untuk tujuan pengujian dan demonstrasi. Jangan simpan rahasia klien di rakitan aplikasi atau periksa rahasia ke kontrol sumber. Simpan rahasia klien di Rahasia Pengguna, Azure Key Vault, atau variabel lingkungan.

    Konfigurasi skema autentikasi secara otomatis dibaca dari builder.Configuration["Authentication:Schemes:{SCHEME NAME}:{PropertyName}"], di mana {SCHEME NAME} tempat penampung adalah skema, yang secara MicrosoftOidc default. Karena konfigurasi telah dikonfigurasi sebelumnya, rahasia klien dapat secara otomatis dibaca melalui Authentication:Schemes:MicrosoftOidc:ClientSecret kunci konfigurasi. Di server menggunakan variabel lingkungan, beri nama variabel Authentication__Schemes__MicrosoftOidc__ClientSecretlingkungan :

    set Authentication__Schemes__MicrosoftOidc__ClientSecret={CLIENT SECRET}
    

    Untuk demonstrasi dan pengujian saja, ClientSecret dapat diatur secara langsung. Jangan atur nilai secara langsung untuk aplikasi produksi yang disebarkan. Untuk keamanan yang sedikit ditingkatkan, kompilasi garis secara kondisional dengan DEBUG simbol :

    #if DEBUG
    oidcOptions.ClientSecret = "{CLIENT SECRET}";
    #endif
    

    Contoh:

    Rahasia klien ({CLIENT SECRET}): 463471c8c4...f90d674bc9 (dipersingkat untuk ditampilkan)

    #if DEBUG
    oidcOptions.ClientSecret = "463471c8c4...137f90d674bc9";
    #endif
    
  • ResponseType: Mengonfigurasi handler OIDC untuk hanya melakukan alur kode otorisasi. Pemberian implisit dan aliran hibrid tidak perlu dalam mode ini.

    Dalam konfigurasi pendaftaran aplikasi pemberian implisit dan alur hibrid Entra atau portal Azure, jangan pilih kotak centang untuk titik akhir otorisasi untuk mengembalikan token Akses atau token ID. Handler OIDC secara otomatis meminta token yang sesuai menggunakan kode yang dikembalikan dari titik akhir otorisasi.

    oidcOptions.ResponseType = OpenIdConnectResponseType.Code;
    
  • MapInboundClaims dan konfigurasi dan NameClaimType RoleClaimType: Banyak server OIDC menggunakan "name" dan "role" daripada default SOAP/WS-Fed di ClaimTypes. Ketika MapInboundClaims diatur ke false, handler tidak melakukan pemetaan klaim dan nama klaim dari JWT digunakan langsung oleh aplikasi. Contoh berikut secara manual memetakan nama dan klaim peran:

Catatan

MapInboundClaims harus diatur ke false untuk sebagian besar penyedia OIDC, yang mencegah penggantian nama klaim.

oidcOptions.MapInboundClaims = false;
oidcOptions.TokenValidationParameters.NameClaimType = JwtRegisteredClaimNames.Name;
oidcOptions.TokenValidationParameters.RoleClaimType = "role";
  • Konfigurasi jalur: Jalur harus cocok dengan jalur URI pengalihan (jalur panggilan balik masuk) dan pengalihan pasca keluar (jalur panggilan balik keluar) yang dikonfigurasi saat mendaftarkan aplikasi dengan penyedia OIDC. Di portal Azure, jalur dikonfigurasi di bilah Autentikasi pendaftaran aplikasi. Jalur masuk dan keluar harus didaftarkan sebagai URI pengalihan. Nilai defaultnya adalah /signin-oidc dan /signout-callback-oidc.

    • CallbackPath: Jalur permintaan dalam jalur dasar aplikasi tempat agen pengguna dikembalikan.

      Di Entra atau portal Azure, atur jalur di URI Pengalihan konfigurasi platform Web:

      https://localhost/signin-oidc

      Catatan

      Port tidak diperlukan untuk localhost alamat.

    • SignedOutCallbackPath: Jalur permintaan dalam jalur dasar aplikasi tempat agen pengguna dikembalikan setelah keluar dari penyedia identitas.

      Di Entra atau portal Azure, atur jalur di URI Pengalihan konfigurasi platform Web:

      https://localhost/signout-callback-oidc

      Catatan

      Port tidak diperlukan untuk localhost alamat.

      Catatan

      Jika menggunakan Microsoft Identity Web, penyedia saat ini hanya mengalihkan kembali ke SignedOutCallbackPath jika microsoftonline.com Otoritas (https://login.microsoftonline.com/{TENANT ID}/v2.0/) digunakan. Batasan ini tidak ada jika Anda dapat menggunakan Otoritas "umum" dengan Microsoft Identity Web. Untuk informasi selengkapnya, lihat postLogoutRedirectUri tidak berfungsi saat url otoritas berisi ID penyewa (AzureAD/microsoft-authentication-library-for-js #5783).

    • RemoteSignOutPath: Permintaan yang diterima pada jalur ini menyebabkan handler memanggil keluar menggunakan skema keluar.

      Di Entra atau portal Azure, atur URL keluar saluran Depan:

      https://localhost/signout-oidc

      Catatan

      Port tidak diperlukan untuk localhost alamat.

    oidcOptions.CallbackPath = new PathString("{PATH}");
    oidcOptions.SignedOutCallbackPath = new PathString("{PATH}");
    oidcOptions.RemoteSignOutPath = new PathString("{PATH}");
    

    Contoh (nilai default):

    oidcOptions.CallbackPath = new PathString("/signin-oidc");
    oidcOptions.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
    oidcOptions.RemoteSignOutPath = new PathString("/signout-oidc");
    
  • (Microsoft Azure hanya dengan titik akhir "umum") TokenValidationParameters.IssuerValidator: Banyak penyedia OIDC bekerja dengan validator penerbit default, tetapi kita perlu memperhitungkan pengeluar sertifikat yang diparameterkan dengan ID Penyewa ({TENANT ID}) yang dikembalikan oleh https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration. Untuk informasi selengkapnya, lihat SecurityTokenInvalidIssuerException dengan OpenID Connect dan titik akhir "umum" Microsoft Azure AD (AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet #1731).

    Hanya untuk aplikasi yang menggunakan ID Microsoft Entra atau Azure AD B2C dengan titik akhir "umum":

    var microsoftIssuerValidator = AadIssuerValidator.GetAadIssuerValidator(oidcOptions.Authority);
    oidcOptions.TokenValidationParameters.IssuerValidator = microsoftIssuerValidator.Validate;
    

Contoh kode aplikasi

Periksa aplikasi sampel untuk fitur berikut:

  • Refresh token non-interaktif otomatis dengan bantuan penyegaran kustom cookie (CookieOidcRefresher.cs).
  • Kelas PersistingAuthenticationStateProvider (PersistingAuthenticationStateProvider.cs) adalah sisi AuthenticationStateProvider server yang menggunakan PersistentComponentState untuk mengalirkan status autentikasi ke klien, yang kemudian diperbaiki selama masa pakai aplikasi WebAssembly.
  • Permintaan ke Blazor Aplikasi Web diproksikan ke proyek API web backend (MinimalApiJwt). MapForwarderProgram dalam file menambahkan penerusan langsung permintaan HTTP yang cocok dengan pola yang ditentukan ke tujuan tertentu menggunakan konfigurasi default untuk permintaan keluar, transformasi yang disesuaikan, dan klien HTTP default:
    • Saat merender Weather komponen di server, komponen menggunakan ServerWeatherForecaster untuk mem-proksi permintaan data cuaca dengan token akses pengguna.
    • Ketika komponen dirender pada klien, komponen menggunakan ClientWeatherForecaster implementasi layanan, yang menggunakan yang telah dikonfigurasi HttpClient sebelumnya (dalam file proyek Program klien) untuk melakukan panggilan API web ke proyek server. Titik akhir API Minimal (/weather-forecast) yang ditentukan dalam file proyek Program server mengubah permintaan dengan token akses pengguna untuk mendapatkan data cuaca.

Untuk informasi selengkapnya tentang panggilan API (web) menggunakan abstraksi layanan di Blazor Web Apps, lihat Memanggil API web dari aplikasi ASP.NET CoreBlazor.

Proyek Aplikasi Web sisi Blazor klien (BlazorWebAppOidc.Client)

Proyek BlazorWebAppOidc.Client ini adalah proyek sisi klien dari Blazor Aplikasi Web.

Kelas PersistentAuthenticationStateProvider (PersistentAuthenticationStateProvider.cs) adalah sisi AuthenticationStateProvider klien yang menentukan status autentikasi pengguna dengan mencari data yang bertahan di halaman ketika dirender di server. Status autentikasi diperbaiki untuk masa pakai aplikasi WebAssembly.

Jika pengguna perlu masuk atau keluar, diperlukan pemuatan ulang halaman lengkap.

Aplikasi sampel hanya menyediakan nama pengguna dan email untuk tujuan tampilan. Ini tidak termasuk token yang mengautentikasi ke server saat membuat permintaan berikutnya, yang berfungsi secara terpisah menggunakan cookie yang disertakan pada HttpClient permintaan ke server.

Proyek API web backend (MinimalApiJwt)

Proyek MinimalApiJwt ini adalah API web backend untuk beberapa proyek frontend. Proyek mengonfigurasi titik akhir API Minimal untuk data cuaca. Permintaan dari Blazor proyek sisi server Aplikasi Web (BlazorWebAppOidc) diproksikan ke MinimalApiJwt proyek.

Konfigurasi

Konfigurasikan proyek dalam JwtBearerOptions AddJwtBearer panggilan dalam file proyek Program :

  • Audience: Mengatur Audiens untuk setiap token OpenID Connect yang diterima.

    Di portal Azure atau Entra: Cocokkan nilai hanya dengan jalur URI ID Aplikasi yang dikonfigurasi saat menambahkan Weather.Get cakupan di bawah Ekspos API:

    jwtOptions.Audience = "{APP ID URI}";
    

    Contoh:

    URI ID Aplikasi ({APP ID URI}): https://{DIRECTORY NAME}.onmicrosoft.com/{CLIENT ID}:

    • Nama Direktori ({DIRECTORY NAME}): contoso
    • Id Aplikasi (Klien) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f
    jwtOptions.Audience = "https://contoso.onmicrosoft.com/4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    

    Contoh sebelumnya berkaitan dengan aplikasi yang terdaftar di penyewa dengan jenis penyewa AAD B2C. Jika aplikasi terdaftar di penyewa ME-ID, URI ID Aplikasi berbeda, sehingga audiens berbeda.

    Contoh:

    URI ID Aplikasi ({APP ID URI}): api://{CLIENT ID} dengan Id Aplikasi (Klien) ({CLIENT ID}): 4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f

    jwtOptions.Audience = "api://4ba4de56-9cef-45d9-83fa-a4c18f9f5f0f";
    
  • Authority: Mengatur Otoritas untuk melakukan panggilan OpenID Connect. Cocokkan nilai dengan Otoritas yang dikonfigurasi untuk handler OIDC di BlazorWebAppOidc/Program.cs:

    jwtOptions.Authority = "{AUTHORITY}";
    

    Contoh:

    Otoritas ({AUTHORITY}): https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/ (menggunakan ID a3942615-d115-4eb7-bc84-9974abcf5064Penyewa )

    jwtOptions.Authority = "https://login.microsoftonline.com/a3942615-d115-4eb7-bc84-9974abcf5064/v2.0/";
    

    Contoh sebelumnya berkaitan dengan aplikasi yang terdaftar di penyewa dengan jenis penyewa AAD B2C. Jika aplikasi terdaftar di penyewa ME-ID, otoritas harus cocok dengan issurer (iss) JWT yang dikembalikan oleh penyedia identitas:

    jwtOptions.Authority = "https://sts.windows.net/a3942615-d115-4eb7-bc84-9974abcf5064/";
    

API minimal untuk data cuaca

Titik akhir data prakiraan cuaca yang aman dalam file proyek Program :

app.MapGet("/weather-forecast", () =>
{
    var forecast = Enumerable.Range(1, 5).Select(index =>
        new WeatherForecast
        (
            DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
            Random.Shared.Next(-20, 55),
            summaries[Random.Shared.Next(summaries.Length)]
        ))
        .ToArray();
    return forecast;
}).RequireAuthorization();

Metode RequireAuthorization ekstensi memerlukan otorisasi untuk definisi rute. Untuk pengontrol apa pun yang Anda tambahkan ke proyek, tambahkan [Authorize] atribut ke pengontrol atau tindakan.

Menambahkan komponen yang mengadopsi penyajian sisi server interaktif

Karena aplikasi menggunakan rendering Otomatis Interaktif global melalui Routes komponen, komponen individual yang menentukan penyajian sisi server interaktif (SSR interaktif, @rendermode InteractiveServer) dalam file definisi komponen mereka (.razor) ditempatkan di .Client folder proyekPages.

Menempatkan komponen SSR interaktif dalam .Client proyek bersifat kontra-intuitif karena komponen tersebut hanya dirender di server.

Jika Anda menempatkan komponen SSR interaktif di folder proyek Components/Pages server, komponen akan dirender secara normal dan singkat ditampilkan di browser pengguna. Namun, router sisi klien tidak dapat menemukan komponen, pada akhirnya menghasilkan 404 - Tidak Ditemukan di browser.

Oleh karena itu, tempatkan komponen SSR interaktif di .Client folder proyek Pages .

Mengalihkan ke halaman beranda saat keluar

Saat pengguna menavigasi di sekitar aplikasi, LogInOrOut komponen (Layout/LogInOrOut.razor) mengatur bidang tersembunyi untuk URL pengembalian (ReturnUrl) ke nilai URL saat ini (currentURL). Saat pengguna keluar dari aplikasi, IdP mengembalikannya ke halaman tempat mereka keluar.

Jika pengguna keluar dari halaman aman, mereka dikembalikan ke halaman aman yang sama setelah keluar hanya untuk dikirim kembali melalui proses autentikasi. Perilaku ini baik-baik saja ketika pengguna perlu sering beralih akun. Namun, spesifikasi aplikasi alternatif dapat meminta pengguna untuk dikembalikan ke halaman beranda aplikasi atau beberapa halaman lain setelah keluar. Contoh berikut menunjukkan cara mengatur beranda aplikasi sebagai URL pengembalian untuk operasi signout.

Perubahan penting pada LogInOrOut komponen ditunjukkan dalam contoh berikut. Bidang value tersembunyi untuk ReturnUrl diatur ke halaman beranda di /. IDisposable tidak lagi diimplementasikan. NavigationManager tidak lagi disuntikkan. Seluruh @code blok dihapus.

Layout/LogInOrOut.razor:

@using Microsoft.AspNetCore.Authorization

<div class="nav-item px-3">
    <AuthorizeView>
        <Authorized>
            <form action="authentication/logout" method="post">
                <AntiforgeryToken />
                <input type="hidden" name="ReturnUrl" value="/" />
                <button type="submit" class="nav-link">
                    <span class="bi bi-arrow-bar-left-nav-menu" aria-hidden="true">
                    </span> Logout @context.User.Identity?.Name
                </button>
            </form>
        </Authorized>
        <NotAuthorized>
            <a class="nav-link" href="authentication/login">
                <span class="bi bi-person-badge-nav-menu" aria-hidden="true"></span> 
                Login
            </a>
        </NotAuthorized>
    </AuthorizeView>
</div>

Nonce kriptografi

Nonce adalah nilai string yang mengaitkan sesi klien dengan token ID untuk mengurangi serangan pemutaran ulang.

Jika Anda menerima kesalahan nonce selama pengembangan dan pengujian autentikasi, gunakan sesi browser InPrivate/incognito baru untuk setiap eksekusi pengujian, tidak peduli seberapa kecil perubahan yang dilakukan pada aplikasi atau pengguna uji karena data kedaluarsa cookie dapat menyebabkan kesalahan nonce. Untuk informasi selengkapnya, lihat bagian Cookies dan data situs.

Nonce tidak diperlukan atau digunakan saat token refresh ditukar dengan token akses baru. Di aplikasi sampel, CookieOidcRefresher (CookieOidcRefresher.cs) sengaja diatur OpenIdConnectProtocolValidator.RequireNonce ke false.

Pecahkan masalah

Pencatatan

Aplikasi server adalah aplikasi ASP.NET Core standar. Lihat panduan pengelogan ASP.NET Core untuk mengaktifkan tingkat pengelogan yang lebih rendah di aplikasi server.

Untuk mengaktifkan pencatatan log debug atau pelacakan untuk Blazor WebAssembly autentikasi, lihat bagian Pengelogan autentikasi sisi klien ASP.NET Pengelogan core Blazor dengan pemilih versi artikel diatur ke ASP.NET Core 7.0 atau yang lebih baru.

Kesalahan umum

  • Kesalahan konfigurasi aplikasi atau Identity Penyedia (IP)

    Kesalahan yang paling umum disebabkan oleh konfigurasi yang salah. Berikut ini adalah beberapa contohnya:

    • Bergantung pada persyaratan skenario, Otoritas, Instans, ID Penyewa, DOMAIN Penyewa, ID Klien, atau URI Pengalihan yang hilang atau salah mencegah aplikasi mengautentikasi klien.
    • Cakupan permintaan yang salah mencegah klien mengakses titik akhir API web server.
    • Izin API server yang salah atau hilang mencegah klien mengakses titik akhir API web server.
    • Menjalankan aplikasi di port yang berbeda dari yang dikonfigurasi di URI Pengalihan pendaftaran aplikasi IP. Perhatikan bahwa port tidak diperlukan untuk ID Microsoft Entra dan aplikasi yang berjalan di localhost alamat pengujian pengembangan, tetapi konfigurasi port aplikasi dan port tempat aplikasi berjalan harus cocok untuk non-alamatlocalhost .

    Cakupan konfigurasi dalam artikel ini menunjukkan contoh konfigurasi yang benar. Periksa konfigurasi dengan hati-hati mencari kesalahan konfigurasi aplikasi dan IP.

    Jika konfigurasi muncul dengan benar:

    • Menganalisis log aplikasi.

    • Periksa lalu lintas jaringan antara aplikasi klien dan IP atau aplikasi server dengan alat pengembang browser. Seringkali, pesan kesalahan yang tepat atau pesan dengan petunjuk tentang apa yang menyebabkan masalah dikembalikan ke klien oleh IP atau aplikasi server setelah membuat permintaan. Alat pengembang panduan ditemukan dalam artikel berikut:

    Tim dokumentasi menanggapi umpan balik dokumen dan bug dalam artikel (buka masalah dari bagian Umpan balik halaman ini) tetapi tidak dapat memberikan dukungan produk. Beberapa forum dukungan publik tersedia untuk membantu memecahkan masalah aplikasi. Kami merekomendasikan hal-hal berikut:

    Forum sebelumnya tidak dimiliki atau dikendalikan oleh Microsoft.

    Untuk laporan bug kerangka kerja non-keamanan, non-sensitif, dan non-rahasia yang dapat direproduksi, buka masalah dengan unit produk ASP.NET Core. Jangan buka masalah dengan unit produk sampai Anda menyelidiki penyebab masalah secara menyeluruh dan tidak dapat menyelesaikannya sendiri dan dengan bantuan komunitas di forum dukungan publik. Unit produk tidak dapat memecahkan masalah aplikasi individual yang rusak karena kesalahan konfigurasi sederhana atau kasus penggunaan yang melibatkan layanan pihak ketiga. Jika laporan bersifat sensitif atau rahasia atau menggambarkan potensi kelemahan keamanan dalam produk yang dapat dieksploitasi penyerang, lihat Melaporkan masalah keamanan dan bug (dotnet/aspnetcore repositori GitHub).

  • Klien yang tidak sah untuk ME-ID

    info: Otorisasi Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2] gagal. Persyaratan ini tidak terpenuhi: DenyAnonymousAuthorizationRequirement: Memerlukan pengguna yang diautentikasi.

    Kesalahan panggilan balik masuk dari ME-ID:

    • Kesalahan: unauthorized_client
    • Deskripsi: AADB2C90058: The provided application is not configured to allow public clients.

    Untuk mengatasi masalah ini:

    1. Di portal Azure, akses manifes aplikasi.
    2. Atur atribut ke null allowPublicClient atau true.

Cookies dan data situs

Cookiedata s dan situs dapat bertahan di seluruh pembaruan aplikasi dan mengganggu pengujian dan pemecahan masalah. Hapus hal berikut saat membuat perubahan kode aplikasi, perubahan akun pengguna dengan penyedia, atau perubahan konfigurasi aplikasi penyedia:

  • Rincian masuk cookiepengguna
  • Aplikasi cookies
  • Data situs yang di-cache dan disimpan

Salah satu pendekatan untuk mencegah cookiedata situs dan yang masih ada mengganggu pengujian dan pemecahan masalah adalah dengan:

  • Mengonfigurasi browser
    • Gunakan browser untuk pengujian yang dapat Anda konfigurasi untuk menghapus semua cookie dan data situs setiap kali browser ditutup.
    • Pastikan browser ditutup secara manual atau oleh IDE untuk setiap perubahan pada aplikasi, pengguna uji, atau konfigurasi penyedia.
  • Gunakan perintah kustom untuk membuka browser dalam mode InPrivate atau Penyamaran di Visual Studio:
    • Buka kotak dialog Telusuri Dengan dari tombol Jalankan Visual Studio.
    • Pilih tombol Tambahkan.
    • Berikan jalur ke browser Anda di bidang Program . Jalur yang dapat dieksekusi berikut adalah lokasi penginstalan umum untuk Windows 10. Jika browser Anda diinstal di lokasi yang berbeda atau Anda tidak menggunakan Windows 10, berikan jalur ke browser yang dapat dieksekusi.
      • Microsoft Edge: C:\Program Files (x86)\Microsoft\Edge\Application\msedge.exe
      • Google Chrome: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
      • Mozilla Firefox: C:\Program Files\Mozilla Firefox\firefox.exe
    • Di bidang Argumen, berikan opsi baris perintah yang digunakan browser untuk membuka dalam mode InPrivate atau Penyamaran. Beberapa browser memerlukan URL aplikasi.
      • Microsoft Edge: Gunakan -inprivate.
      • Google Chrome: Gunakan --incognito --new-window {URL}, di mana {URL} tempat penampung adalah URL untuk dibuka (misalnya, https://localhost:5001).
      • Mozilla Firefox: Gunakan -private -url {URL}, di mana {URL} tempat penampung adalah URL untuk dibuka (misalnya, https://localhost:5001).
    • Berikan nama di bidang Nama yang mudah diingat. Contohnya,Firefox Auth Testing.
    • Pilih tombol OK.
    • Untuk menghindari harus memilih profil browser untuk setiap iterasi pengujian dengan aplikasi, atur profil sebagai default dengan tombol Atur sebagai Default .
    • Pastikan bahwa browser ditutup oleh IDE untuk setiap perubahan pada aplikasi, pengguna uji, atau konfigurasi penyedia.

Peningkatan aplikasi

Aplikasi yang berfungsi mungkin gagal segera setelah meningkatkan .NET Core SDK pada komputer pengembangan atau mengubah versi paket dalam aplikasi. Dalam beberapa kasus, paket yang tidak melekat dapat merusak aplikasi saat melakukan peningkatan besar. Sebagian besar masalah ini dapat diperbaiki dengan mengikuti instruksi berikut:

  1. Hapus cache paket NuGet sistem lokal dengan mengeksekusi dotnet nuget locals all --clear dari shell perintah.
  2. Hapus folder dan obj proyekbin.
  3. Pulihkan dan bangun ulang proyek.
  4. Hapus semua file di folder penyebaran di server sebelum menyebarkan ulang aplikasi.

Catatan

Penggunaan versi paket yang tidak kompatibel dengan kerangka kerja target aplikasi tidak didukung. Untuk informasi tentang paket, gunakan Galeri NuGet atau Penjelajah Paket FuGet.

Menjalankan aplikasi server

Saat menguji dan memecahkan masalah Blazor Aplikasi Web, pastikan Anda menjalankan aplikasi dari proyek server.

Memeriksa pengguna

Komponen berikut UserClaims dapat digunakan langsung di aplikasi atau berfungsi sebagai dasar untuk penyesuaian lebih lanjut.

UserClaims.razor:

@page "/user-claims"
@using System.Security.Claims
@using Microsoft.AspNetCore.Authorization
@attribute [Authorize]

<PageTitle>User Claims</PageTitle>

<h1>User Claims</h1>

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

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

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

    protected override async Task OnInitializedAsync()
    {
        if (AuthState == null)
        {
            return;
        }

        var authState = await AuthState;
        claims = authState.User.Claims;
    }
}

Sumber Daya Tambahan: