Berbagi cookie autentikasi di 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 cookie autentikasi. 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 cookie, 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 cookie autentikasi dengan 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 cookie.
- 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.
Untuk alasan keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang disertakan hanya untuk kebutuhan mereka.
Bagikan cookie autentikasi tanpa ASP.NET Core Identity
Saat menggunakan cookie 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();
Untuk alasan keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang disertakan hanya untuk kebutuhan mereka.
Berbagi cookie di 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();
Berbagi cookie di seluruh subdomain
Saat menghosting aplikasi yang berbagi cookie di seluruh subdomain, tentukan domain umum di Cookie. Properti domain . Untuk berbagi cookie di 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 di rest
Untuk penyebaran produksi, konfigurasikan DataProtectionProvider
untuk mengenkripsi kunci di rest dengan DPAPI atau X509Certificate. Untuk informasi selengkapnya, lihat Enkripsi kunci di rest 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, identity sistem 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 cookie autentikasi antara 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 cookie autentikasi yang 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 cookie autentikasi dibagikan dengan aplikasi ASP.NET Core.
Untuk mengonfigurasi ASP.NET Middleware Autentikasi Microsoft.Owin Cookie untuk berbagi cookie dengan aplikasi ASP.NET Core, ikuti instruksi sebelumnya untuk mengonfigurasi aplikasi ASP.NET Core untuk menggunakan cookie nama tertentu, nama aplikasi, dan untuk mempertahankan kunci perlindungan data ke lokasi 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 ASP.NET Core identity 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 cookie autentikasi yang 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 cookie digunakan 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 cookie, 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 cookie autentikasi dengan 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 cookie.
- 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.
Untuk alasan keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang disertakan hanya untuk kebutuhan mereka.
Bagikan cookie autentikasi tanpa ASP.NET Core Identity
Saat menggunakan cookie 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";
});
Untuk alasan keamanan, cookie autentikasi tidak dikompresi di ASP.NET Core. Saat menggunakan cookie autentikasi, pengembang harus meminimalkan jumlah informasi klaim yang disertakan hanya untuk kebutuhan mereka.
Berbagi cookie di 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 = "/";
});
Berbagi cookie di seluruh subdomain
Saat menghosting aplikasi yang berbagi cookie di seluruh subdomain, tentukan domain umum di Cookie. Properti domain . Untuk berbagi cookie di 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 di rest
Untuk penyebaran produksi, konfigurasikan DataProtectionProvider
untuk mengenkripsi kunci di rest dengan DPAPI atau X509Certificate. Untuk informasi selengkapnya, lihat Enkripsi kunci di rest Windows dan Azure menggunakan ASP.NET Core. Dalam contoh berikut, thumbprint sertifikat disediakan untuk ProtectKeysWithCertificate:
services.AddDataProtection()
.ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
Berbagi cookie autentikasi antara aplikasi ASP.NET 4.x dan ASP.NET Core
ASP.NET aplikasi 4.x yang menggunakan Middleware Autentikasi Katana Cookie dapat dikonfigurasi untuk menghasilkan cookie autentikasi yang kompatibel dengan Middleware Autentikasi Inti Cookie ASP.NET. Untuk informasi selengkapnya, lihat Berbagi cookie autentikasi antara 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, identity sistem 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