Berbagi autentikasi cookiedi antara aplikasi ASP.NET
Oleh Rick Anderson
Situs web sering terdiri dari masing-masing aplikasi web yang bekerja sama. Untuk memberikan pengalaman akses menyeluruh (SSO), aplikasi web dalam situs harus berbagi autentikasi cookie. Untuk mendukung skenario ini, tumpukan perlindungan data memungkinkan berbagi autentikasi Katana cookie dan tiket autentikasi ASP.NET Core cookie .
Dalam contoh berikut:
- Nama autentikasi cookie diatur ke nilai umum .
.AspNet.SharedCookie
AuthenticationType
diatur keIdentity.Application
secara eksplisit atau secara default.- Nama aplikasi umum,
SharedCookieApp
, digunakan untuk mengaktifkan sistem perlindungan data untuk berbagi kunci perlindungan data. Identity.Application
digunakan sebagai skema autentikasi. Skema apa pun yang digunakan, skema tersebut harus digunakan secara konsisten di dalam dan di seluruh aplikasi bersama cookie baik sebagai skema default atau dengan mengaturnya secara eksplisit. Skema ini digunakan saat mengenkripsi dan mendekripsi cookies, sehingga skema yang konsisten harus digunakan di seluruh aplikasi.- Lokasi penyimpanan kunci perlindungan data umum digunakan.
- Di aplikasi ASP.NET Core, PersistKeysToFileSystem digunakan untuk mengatur lokasi penyimpanan utama.
- Di aplikasi .NET Framework, Cookie Middleware Autentikasi menggunakan implementasi DataProtectionProvider.
DataProtectionProvider
menyediakan layanan perlindungan data untuk enkripsi dan dekripsi data payload autentikasi cookie .DataProtectionProvider
Instans diisolasi dari sistem perlindungan data yang digunakan oleh bagian lain dari aplikasi. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>) menerima DirectoryInfo untuk menentukan lokasi penyimpanan kunci perlindungan data.
DataProtectionProvider
memerlukan paket NuGet Microsoft.AspNetCore.DataProtection.Extensions:- Di aplikasi .NET Framework, tambahkan referensi paket ke Microsoft.AspNetCore.DataProtection.Extensions.
- SetApplicationName mengatur nama aplikasi umum.
Bagikan autentikasi cookiedengan ASP.NET Core Identity
Saat menggunakan ASP.NET Core Identity:
- Kunci perlindungan data dan nama aplikasi harus dibagikan di antara aplikasi. Lokasi penyimpanan kunci umum disediakan untuk PersistKeysToFileSystem metode dalam contoh berikut. Gunakan SetApplicationName untuk mengonfigurasi nama aplikasi bersama umum (
SharedCookieApp
dalam contoh berikut). Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Core Data Protection. - ConfigureApplicationCookie Gunakan metode ekstensi untuk menyiapkan layanan perlindungan data untuk cookies.
- Jenis autentikasi default adalah
Identity.Application
.
Di Program.cs
:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"))
.SetApplicationName("SharedCookieApp");
builder.Services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
});
var app = builder.Build();
Catatan: Instruksi sebelumnya tidak berfungsi dengan ITicketStore
(CookieAuthenticationOptions.SessionStore
). Untuk informasi lebih lanjut, lihat masalah GitHub ini.
Demi keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang ada. Cukup informasi klaim yang diperlukan saja.
Bagikan autentikasi cookietanpa ASP.NET Core Identity
Saat menggunakan cookies secara langsung tanpa ASP.NET Core Identity, konfigurasikan perlindungan dan autentikasi data. Dalam contoh berikut, jenis autentikasi diatur ke Identity.Application
:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"))
.SetApplicationName("SharedCookieApp");
builder.Services.AddAuthentication("Identity.Application")
.AddCookie("Identity.Application", options =>
{
options.Cookie.Name = ".AspNet.SharedCookie";
});
var app = builder.Build();
Demi keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang ada. Cukup informasi klaim yang diperlukan saja.
Berbagi cookiedi berbagai jalur dasar
Autentikasi cookie menggunakan HttpRequest.PathBase sebagai defaultnyaCookie. Jalur. Jika aplikasi cookie harus dibagikan di berbagai jalur dasar, Path
harus ditimpa:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.PersistKeysToFileSystem(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"))
.SetApplicationName("SharedCookieApp");
builder.Services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Path = "/";
});
var app = builder.Build();
Bagikan cookiedi seluruh subdomain
Saat menghosting aplikasi yang berbagi cookiedi seluruh subdomain, tentukan domain umum di Cookie. Properti domain . Untuk berbagi cookiedi seluruh aplikasi di contoso.com
, seperti first_subdomain.contoso.com
dan second_subdomain.contoso.com
, tentukan Cookie.Domain
sebagai .contoso.com
:
options.Cookie.Domain = ".contoso.com";
Mengenkripsi kunci perlindungan data saat tidak aktif
Untuk penyebaran produksi, konfigurasikan DataProtectionProvider
untuk mengenkripsi kunci tidak aktif dengan DPAPI atau X509Certificate. Untuk informasi selengkapnya, lihat Enkripsi kunci saat tidak aktif di Windows dan Azure menggunakan ASP.NET Core. Dalam contoh berikut, thumbprint sertifikat disediakan untuk ProtectKeysWithCertificate:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
Menggunakan database pengguna umum
Saat aplikasi menggunakan skema yang sama Identity (versi Identityyang sama ), konfirmasikan bahwa Identity sistem untuk setiap aplikasi diacu pada database pengguna yang sama. Jika tidak, sistem identitas menghasilkan kegagalan pada runtime ketika mencoba mencocokkan informasi dalam autentikasi cookie terhadap informasi dalam databasenya.
Identity Ketika skema berbeda di antara aplikasi, biasanya karena aplikasi menggunakan versi yang berbedaIdentity, berbagi database umum berdasarkan versi Identity terbaru tidak dimungkinkan tanpa memulihkan dan menambahkan kolom di skema Identity aplikasi lain. Seringkali lebih efisien untuk meningkatkan aplikasi lain untuk menggunakan versi terbaru Identity sehingga database umum dapat dibagikan oleh aplikasi.
Perubahan nama aplikasi
Di .NET 6, WebApplicationBuilder menormalkan jalur akar konten ke akhir dengan DirectorySeparatorChar. Sebagian besar aplikasi yang bermigrasi dari HostBuilder atau WebHostBuilder tidak akan memiliki nama aplikasi yang sama karena tidak dinormalisasi. Untuk informasi selengkapnya, lihat SetApplicationName
Berbagi autentikasi cookieantara aplikasi ASP.NET 4.x dan ASP.NET Core
ASP.NET aplikasi 4.x yang menggunakan Middleware Autentikasi Microsoft.Owin Cookie dapat dikonfigurasi untuk menghasilkan autentikasi cookieyang kompatibel dengan Middleware Autentikasi Inti Cookie ASP.NET. Ini dapat berguna jika aplikasi web terdiri dari aplikasi ASP.NET 4.x dan aplikasi ASP.NET Core yang harus berbagi pengalaman akses menyeluruh. Contoh spesifik skenario tersebut secara bertahap memigrasikan aplikasi web dari ASP.NET ke ASP.NET Core. Dalam skenario seperti itu, umum bagi beberapa bagian aplikasi untuk dilayani oleh aplikasi ASP.NET asli sementara yang lain dilayani oleh aplikasi ASP.NET Core baru. Pengguna seharusnya hanya perlu masuk sekali, meskipun. Ini dapat dicapai dengan salah satu pendekatan berikut:
- Menggunakan fitur autentikasi jarak jauh adaptor System.Web, yang menggunakan aplikasi ASP.NET untuk memasukkan pengguna.
- Mengonfigurasi aplikasi ASP.NET untuk menggunakan Middleware Autentikasi Microsoft.Owin Cookie sehingga autentikasi cookiedibagikan dengan aplikasi ASP.NET Core.
Untuk mengonfigurasi ASP.NET Middleware Autentikasi Microsoft.Owin Cookie untuk berbagi cookiedengan aplikasi ASP.NET Core, ikuti instruksi sebelumnya untuk mengonfigurasi aplikasi ASP.NET Core untuk menggunakan nama tertentu cookie , nama aplikasi, dan untuk mempertahankan kunci perlindungan data ke lokasi yang terkenal. Lihat Mengonfigurasi ASP.NET Perlindungan Data Inti untuk informasi selengkapnya tentang kunci perlindungan data yang bertahan.
Di aplikasi ASP.NET, instal Microsoft.Owin.Security.Interop
paket.
UseCookieAuthentication
Perbarui panggilan di Startup.Auth.cs untuk mengonfigurasi AspNetTicketDataFormat agar sesuai dengan pengaturan aplikasi ASP.NET Core:
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
LoginPath = new PathString("/Account/Login"),
Provider = new CookieAuthenticationProvider
{
OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<ApplicationUserManager, ApplicationUser>(
validateInterval: TimeSpan.FromMinutes(30),
regenerateIdentity: (manager, user) => user.GenerateUserIdentityAsync(manager))
},
// Settings to configure shared cookie with ASP.NET Core app
CookieName = ".AspNet.ApplicationCookie",
AuthenticationType = "Identity.Application",
TicketDataFormat = new AspNetTicketDataFormat(
new DataProtectorShim(
DataProtectionProvider.Create(new DirectoryInfo(@"c:\PATH TO COMMON KEY RING FOLDER"),
builder => builder.SetApplicationName("SharedCookieApp"))
.CreateProtector(
"Microsoft.AspNetCore.Authentication.Cookies.CookieAuthenticationMiddleware",
// Must match the Scheme name used in the ASP.NET Core app, i.e. IdentityConstants.ApplicationScheme
"Identity.Application",
"v2"))),
CookieManager = new ChunkingCookieManager()
});
Item penting yang dikonfigurasi di sini meliputi:
- Nama cookie diatur ke nama yang sama seperti di aplikasi ASP.NET Core.
- Penyedia perlindungan data dibuat menggunakan jalur cincin kunci yang sama. Perhatikan bahwa dalam contoh ini, kunci perlindungan data disimpan di disk tetapi penyedia perlindungan data lainnya dapat digunakan. Misalnya, Redis atau Azure Blob Storage dapat digunakan untuk penyedia perlindungan data selama konfigurasi cocok antara aplikasi. Lihat Mengonfigurasi ASP.NET Perlindungan Data Inti untuk informasi selengkapnya tentang kunci perlindungan data yang bertahan.
- Nama aplikasi diatur agar sama dengan nama aplikasi yang digunakan di aplikasi ASP.NET Core.
- Jenis autentikasi diatur ke nama skema autentikasi di aplikasi ASP.NET Core.
System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier
diatur ke klaim dari identitas ASP.NET Core yang akan unik untuk pengguna.
Karena jenis autentikasi diubah agar sesuai dengan skema autentikasi aplikasi ASP.NET Core, aplikasi ASP.NET juga perlu memperbarui cara aplikasi ASP.NET menghasilkan identitas baru untuk menggunakan nama yang sama. Hal ini biasanya dilakukan dalam Models/IdentityModels.cs
:
public class ApplicationUser : IdentityUser
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, "Identity.Application");
// Add custom user claims here
return userIdentity;
}
}
Dengan perubahan ini, aplikasi ASP.NET dan ASP.NET Core dapat menggunakan autentikasi cookieyang sama sehingga pengguna yang masuk atau keluar dari satu aplikasi tercermin di aplikasi lain.
Perhatikan bahwa karena ada perbedaan antara skema database ASP.NET Identity dan ASP.NET Core Identity, disarankan agar pengguna hanya masuk menggunakan salah satu aplikasi - baik aplikasi ASP.NET atau ASP.NET Core. Setelah pengguna masuk, langkah-langkah yang didokumenkan di bagian ini akan memungkinkan autentikasi cookiedigunakan oleh aplikasi dan kedua aplikasi harus dapat mengeluarkan pengguna.
Sumber Daya Tambahan:
- Menghosting ASP.NET Core di farm web
- Primer pada middleware autentikasi OWIN cookie untuk pengembang ASP.NET oleh Brock Allen
- Arsitektur Middleware Autentikasi OWIN oleh Brock Allen
- Posting dari Kategori 'OWIN / Katana' oleh Brock Allen
Dalam contoh berikut:
- Nama autentikasi cookie diatur ke nilai umum .
.AspNet.SharedCookie
AuthenticationType
diatur keIdentity.Application
secara eksplisit atau secara default.- Nama aplikasi umum digunakan untuk mengaktifkan sistem perlindungan data untuk berbagi kunci perlindungan data (
SharedCookieApp
). Identity.Application
digunakan sebagai skema autentikasi. Skema apa pun yang digunakan, skema tersebut harus digunakan secara konsisten di dalam dan di seluruh aplikasi bersama cookie baik sebagai skema default atau dengan mengaturnya secara eksplisit. Skema ini digunakan saat mengenkripsi dan mendekripsi cookies, sehingga skema yang konsisten harus digunakan di seluruh aplikasi.- Lokasi penyimpanan kunci perlindungan data umum digunakan.
- Di aplikasi ASP.NET Core, PersistKeysToFileSystem digunakan untuk mengatur lokasi penyimpanan utama.
- Di aplikasi .NET Framework, Cookie Middleware Autentikasi menggunakan implementasi DataProtectionProvider.
DataProtectionProvider
menyediakan layanan perlindungan data untuk enkripsi dan dekripsi data payload autentikasi cookie .DataProtectionProvider
Instans diisolasi dari sistem perlindungan data yang digunakan oleh bagian lain dari aplikasi. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>) menerima DirectoryInfo untuk menentukan lokasi penyimpanan kunci perlindungan data.
DataProtectionProvider
memerlukan paket NuGet Microsoft.AspNetCore.DataProtection.Extensions:- Di aplikasi ASP.NET Core 2.x, referensikan metapackage Microsoft.AspNetCore.App.
- Di aplikasi .NET Framework, tambahkan referensi paket ke Microsoft.AspNetCore.DataProtection.Extensions.
- SetApplicationName mengatur nama aplikasi umum.
Bagikan autentikasi cookiedengan ASP.NET Core Identity
Saat menggunakan ASP.NET Core Identity:
- Kunci perlindungan data dan nama aplikasi harus dibagikan di antara aplikasi. Lokasi penyimpanan kunci umum disediakan untuk PersistKeysToFileSystem metode dalam contoh berikut. Gunakan SetApplicationName untuk mengonfigurasi nama aplikasi bersama umum (
SharedCookieApp
dalam contoh berikut). Untuk informasi selengkapnya, lihat Mengonfigurasi ASP.NET Core Data Protection. - ConfigureApplicationCookie Gunakan metode ekstensi untuk menyiapkan layanan perlindungan data untuk cookies.
- Jenis autentikasi default adalah
Identity.Application
.
Di Startup.ConfigureServices
:
services.AddDataProtection()
.PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
.SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
});
Catatan: Instruksi sebelumnya tidak berfungsi dengan ITicketStore
(CookieAuthenticationOptions.SessionStore
). Untuk informasi lebih lanjut, lihat masalah GitHub ini.
Demi keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang ada. Cukup informasi klaim yang diperlukan saja.
Bagikan autentikasi cookietanpa ASP.NET Core Identity
Saat menggunakan cookies secara langsung tanpa ASP.NET Core Identity, konfigurasikan perlindungan dan autentikasi data di Startup.ConfigureServices
. Dalam contoh berikut, jenis autentikasi diatur ke Identity.Application
:
services.AddDataProtection()
.PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
.SetApplicationName("SharedCookieApp");
services.AddAuthentication("Identity.Application")
.AddCookie("Identity.Application", options =>
{
options.Cookie.Name = ".AspNet.SharedCookie";
});
Demi keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang ada. Cukup informasi klaim yang diperlukan saja.
Berbagi cookiedi berbagai jalur dasar
Autentikasi cookie menggunakan HttpRequest.PathBase sebagai defaultnyaCookie. Jalur. Jika aplikasi cookie harus dibagikan di berbagai jalur dasar, Path
harus ditimpa:
services.AddDataProtection()
.PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
.SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Path = "/";
});
Bagikan cookiedi seluruh subdomain
Saat menghosting aplikasi yang berbagi cookiedi seluruh subdomain, tentukan domain umum di Cookie. Properti domain . Untuk berbagi cookiedi seluruh aplikasi di contoso.com
, seperti first_subdomain.contoso.com
dan second_subdomain.contoso.com
, tentukan Cookie.Domain
sebagai .contoso.com
:
options.Cookie.Domain = ".contoso.com";
Mengenkripsi kunci perlindungan data saat tidak aktif
Untuk penyebaran produksi, konfigurasikan DataProtectionProvider
untuk mengenkripsi kunci tidak aktif dengan DPAPI atau X509Certificate. Untuk informasi selengkapnya, lihat Enkripsi kunci saat tidak aktif di Windows dan Azure menggunakan ASP.NET Core. Dalam contoh berikut, thumbprint sertifikat disediakan untuk ProtectKeysWithCertificate:
services.AddDataProtection()
.ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
Berbagi autentikasi cookieantara aplikasi ASP.NET 4.x dan ASP.NET Core
ASP.NET aplikasi 4.x yang menggunakan Middleware Autentikasi Katana Cookie dapat dikonfigurasi untuk menghasilkan autentikasi cookieyang kompatibel dengan Middleware Autentikasi Inti Cookie ASP.NET. Untuk informasi selengkapnya, lihat Berbagi autentikasi cookieantara aplikasi ASP.NET 4.x dan ASP.NET Core (dotnet/AspNetCore.Docs #21987).
Menggunakan database pengguna umum
Saat aplikasi menggunakan skema yang sama Identity (versi Identityyang sama ), konfirmasikan bahwa Identity sistem untuk setiap aplikasi diacu pada database pengguna yang sama. Jika tidak, sistem identitas menghasilkan kegagalan pada runtime ketika mencoba mencocokkan informasi dalam autentikasi cookie terhadap informasi dalam databasenya.
Identity Ketika skema berbeda di antara aplikasi, biasanya karena aplikasi menggunakan versi yang berbedaIdentity, berbagi database umum berdasarkan versi Identity terbaru tidak dimungkinkan tanpa memulihkan dan menambahkan kolom di skema Identity aplikasi lain. Seringkali lebih efisien untuk meningkatkan aplikasi lain untuk menggunakan versi terbaru Identity sehingga database umum dapat dibagikan oleh aplikasi.
Sumber Daya Tambahan:
ASP.NET Core
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk