Bagikan melalui


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 ke Identity.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.
  • DataProtectionProvidermemerlukan paket NuGet Microsoft.AspNetCore.DataProtection.Extensions:
  • SetApplicationName mengatur nama aplikasi umum.

Bagikan autentikasi cookiedengan ASP.NET Core Identity

Saat menggunakan ASP.NET Core Identity:

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:

Dalam contoh berikut:

  • Nama autentikasi cookie diatur ke nilai umum ..AspNet.SharedCookie
  • AuthenticationType diatur ke Identity.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.
  • DataProtectionProvidermemerlukan paket NuGet Microsoft.AspNetCore.DataProtection.Extensions:
  • SetApplicationName mengatur nama aplikasi umum.

Bagikan autentikasi cookiedengan ASP.NET Core Identity

Saat menggunakan ASP.NET Core Identity:

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: