kimlik doğrulamalarını cookieASP.NET uygulamalar arasında paylaşma

Gönderen Rick Anderson

Web siteleri genellikle birlikte çalışan tek tek web uygulamalarından oluşur. Çoklu oturum açma (SSO) deneyimi sağlamak için sitedeki web uygulamalarının kimlik doğrulamalarını cookiepaylaşması gerekir. Bu senaryoyu desteklemek için veri koruma yığını Katana cookie kimlik doğrulamasını ve ASP.NET Core cookie kimlik doğrulama biletlerini paylaşmaya izin verir.

Aşağıdaki örneklerde:

  • Kimlik doğrulama cookie adı ortak değeri olarak .AspNet.SharedCookieayarlanır.
  • AuthenticationType açıkça veya varsayılan olarak olarak ayarlanırIdentity.Application.
  • Yaygın bir uygulama adı SharedCookieAppolan , veri koruma sisteminin veri koruma anahtarlarını paylaşmasını sağlamak için kullanılır.
  • Identity.Application kimlik doğrulama düzeni olarak kullanılır. Hangi düzen kullanılırsa kullanılsın, varsayılan düzen olarak veya açıkça ayarlanarak paylaşılan cookie uygulamalar içinde ve genelinde tutarlı bir şekilde kullanılmalıdır. Düzen, şifrelenirken ve şifreleri çözülürken cookiekullanılır, bu nedenle uygulamalar arasında tutarlı bir düzen kullanılmalıdır.
  • Ortak bir veri koruma anahtarı depolama konumu kullanılır.
  • DataProtectionProviderMicrosoft.AspNetCore.DataProtection.Extensions NuGet paketini gerektirir:
    • .NET Framework uygulamalarında Microsoft.AspNetCore.DataProtection.Extensions'a bir paket başvurusu ekleyin.
  • SetApplicationName ortak uygulama adını ayarlar.

kimlik doğrulamalarını cookieASP.NET Core ile paylaşma Identity

ASP.NET Core Identitykullanırken:

  • Veri koruma anahtarları ve uygulama adı uygulamalar arasında paylaşılmalıdır. Aşağıdaki örneklerde yöntemine PersistKeysToFileSystem ortak bir anahtar depolama konumu sağlanır. Ortak bir paylaşılan uygulama adı yapılandırmak için kullanın SetApplicationName (SharedCookieApp aşağıdaki örneklerde). Daha fazla bilgi için bkz . ASP.NET Çekirdek Veri Korumasını Yapılandırma.
  • ConfigureApplicationCookie s için veri koruma hizmetini ayarlamak için cookieuzantı yöntemini kullanın.
  • Varsayılan kimlik doğrulama türü şeklindedir Identity.Application.

Program.cs içinde:

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();

Not: Önceki yönergeler (CookieAuthenticationOptions.SessionStore ile ITicketStore çalışmaz). Daha fazla bilgi için bu GitHub konusuna bakın.

Güvenlik nedeniyle, kimlik doğrulaması cookie değerleri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulaması cookie değerlerini kullanırken geliştiriciler, dahil edilen istek bilgilerinin sayısını, ihtiyaçları için gerekli olan değere kadar en aza indirmelidir.

kimlik doğrulamalarını cookieASP.NET Core olmadan paylaşma Identity

S'leri doğrudan ASP.NET Core Identityolmadan kullanırkencookie, veri korumasını ve kimlik doğrulamasını yapılandırın. Aşağıdaki örnekte, kimlik doğrulama türü olarak Identity.Applicationayarlanır:

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();

Güvenlik nedeniyle, kimlik doğrulaması cookie değerleri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulaması cookie değerlerini kullanırken geliştiriciler, dahil edilen istek bilgilerinin sayısını, ihtiyaçları için gerekli olan değere kadar en aza indirmelidir.

S'leri farklı temel yollarda paylaşma cookie

Kimlik doğrulamasıcookie, varsayılan Cookieolarak HttpRequest.PathBase kullanır. Yol. Uygulamanın cookie farklı temel yollarda paylaşılması gerekiyorsa geçersiz Path kılınmalıdır:

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();

Alt etki alanları arasında paylaşım cookie

Alt etki alanları arasında s paylaşan cookieuygulamaları barındırırken, içinde Cookieortak bir etki alanı belirtin. Etki alanı özelliği. ve gibi second_subdomain.contoso.comfirst_subdomain.contoso.com uygulamaları contoso.comarasında paylaşmak cookieiçin öğesini olarak .contoso.combelirtinCookie.Domain:

options.Cookie.Domain = ".contoso.com";

Bekleyen veri koruma anahtarlarını şifreleme

Üretim dağıtımları için, bekleyen anahtarları DPAPI veya X509Certificate ile şifrelemek için öğesini yapılandırın DataProtectionProvider . Daha fazla bilgi için bkz . ASP.NET Core kullanarak Windows ve Azure'da bekleyen anahtar şifrelemesi. Aşağıdaki örnekte, için ProtectKeysWithCertificatebir sertifika parmak izi sağlanır:

using Microsoft.AspNetCore.DataProtection;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

builder.Services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");

Ortak kullanıcı veritabanı kullanma

Uygulamalar aynı Identity şemayı (aynı sürümü Identity) kullandığında, her uygulama için sistemin aynı kullanıcı veritabanına işaret edildiğini onaylayın Identity . Aksi takdirde kimlik sistemi, kimlik doğrulamasındaki cookie bilgileri veritabanındaki bilgilerle eşleştirmeye çalıştığında çalışma zamanında hatalar üretir.

Identity Şema uygulamalar arasında farklı olduğunda, genellikle uygulamalar farklı Identity sürümler kullandığından, diğer uygulamanın Identity şemalarına sütunları yeniden eşlemeden ve eklemeden en son sürümünü Identity temel alan ortak bir veritabanını paylaşmak mümkün değildir. Ortak bir veritabanının uygulamalar tarafından paylaşılabilmesi için diğer uygulamaları en son Identity sürümü kullanacak şekilde yükseltmek genellikle daha verimlidir.

Uygulama adı değişikliği

.NET 6'da içerik WebApplicationBuilder kök yolunu ile DirectorySeparatorCharbitmesi için normalleştirir. Veya WebHostBuilder uygulamasından HostBuilder geçiş yapılan uygulamaların çoğu normalleştirilemediği için aynı uygulama adına sahip olmaz. Daha fazla bilgi için bkz . SetApplicationName

kimlik doğrulamalarını cookieASP.NET 4.x ile ASP.NET Core uygulamaları arasında paylaşma

ASP.NET Microsoft.Owin Cookie Kimlik Doğrulama Ara Yazılımı kullanan 4.x uygulamaları, ASP.NET Core Cookie Authentication Ara Yazılımı ile uyumlu kimlik doğrulamaları cookieoluşturmak için yapılandırılabilir. Bir web uygulaması hem ASP.NET 4.x uygulamalarından hem de çoklu oturum açma deneyimini paylaşması gereken ASP.NET Core uygulamalarından oluşuyorsa bu yararlı olabilir. Bu tür senaryoların belirli bir örneği, bir web uygulamasını ASP.NET'dan ASP.NET Core'a artımlı olarak geçirmektir. Bu tür senaryolarda, bir uygulamanın bazı bölümlerinin özgün ASP.NET uygulaması tarafından, diğerleri ise yeni ASP.NET Core uygulaması tarafından sunulur. Ancak kullanıcıların yalnızca bir kez oturum açması gerekir. Bu, aşağıdaki yaklaşımlardan biri tarafından gerçekleştirilebilir:

ASP.NET Microsoft.Owin Cookie Kimlik Doğrulama Ara Yazılımını bir ASP.NET Core uygulamasıyla paylaşmak cookieüzere yapılandırmak için, ASP.NET Core uygulamasını belirli cookie bir ad, uygulama adı kullanacak ve veri koruma anahtarlarını iyi bilinen bir konumda kalıcı hale getirmek üzere yapılandırmak için yukarıdaki yönergeleri izleyin. Kalıcı veri koruma anahtarları hakkında daha fazla bilgi için bkz . ASP.NET Core Data Protection'ı yapılandırma.

ASP.NET uygulamasında paketi yükleyin Microsoft.Owin.Security.Interop .

UseCookieAuthentication Bir AspNetTicketDataFormat'ı ASP.NET Core uygulamasının ayarlarıyla eşleşecek şekilde yapılandırmak için Startup.Auth.cs dosyasındaki çağrıyı güncelleştirin:

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()
});

Burada yapılandırılan önemli öğeler şunlardır:

  • Ad cookie , ASP.NET Core uygulamasındaki adla aynı ada ayarlanır.
  • Veri koruma sağlayıcısı aynı anahtar halka yolu kullanılarak oluşturulur. Bu örneklerde veri koruma anahtarlarının diskte depolandığını ancak diğer veri koruma sağlayıcılarının kullanılabileceğini unutmayın. Örneğin Redis veya Azure Blob Depolama, yapılandırma uygulamalar arasında eşleştikçe veri koruma sağlayıcıları için kullanılabilir. Kalıcı veri koruma anahtarları hakkında daha fazla bilgi için bkz . ASP.NET Core Data Protection'ı yapılandırma.
  • Uygulama adı, ASP.NET Core uygulamasında kullanılan uygulama adıyla aynı olacak şekilde ayarlanır.
  • Kimlik doğrulama türü, ASP.NET Core uygulamasındaki kimlik doğrulama düzeninin adına ayarlanır.
  • System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier ASP.NET Core kimliğinden bir kullanıcıya benzersiz olacak bir talep olarak ayarlanır.

Kimlik doğrulama türü, ASP.NET Core uygulamasının kimlik doğrulama düzeniyle eşleşecek şekilde değiştirildiğinden, aynı adı kullanmak için ASP.NET uygulamasının yeni kimlik oluşturma biçimini güncelleştirmek de gerekir. Bu genellikle içinde Models/IdentityModels.csyapılır:

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;
    }
}

Bu değişikliklerle, ASP.NET ve ASP.NET Core uygulamaları aynı kimlik doğrulamalarını cookiekullanarak kullanıcıların bir uygulamada oturum açmasını veya kapatmasını diğer uygulamaya yansıtabiliyor.

ASP.NET ile ASP.NET Identity Core'un Identityveritabanı şemaları arasında farklar olduğundan, kullanıcıların uygulamalardan yalnızca birini (ASP.NET veya ASP.NET Core uygulaması) kullanarak oturum açmaları önerilir. Kullanıcılar oturum açtıktan sonra, bu bölümde belgelenen adımlar kimlik doğrulamasının cookie her iki uygulama tarafından da kullanılmasına izin verir ve her iki uygulamanın da kullanıcıların oturumunu kapatabilmesi gerekir.

Ek kaynaklar

Aşağıdaki örneklerde:

  • Kimlik doğrulama cookie adı ortak değeri olarak .AspNet.SharedCookieayarlanır.
  • AuthenticationType açıkça veya varsayılan olarak olarak ayarlanırIdentity.Application.
  • Veri koruma sisteminin veri koruma anahtarlarını (SharedCookieApp ) paylaşmasını sağlamak için ortak bir uygulama adı kullanılır.
  • Identity.Application kimlik doğrulama düzeni olarak kullanılır. Hangi düzen kullanılırsa kullanılsın, varsayılan düzen olarak veya açıkça ayarlanarak paylaşılan cookie uygulamalar içinde ve genelinde tutarlı bir şekilde kullanılmalıdır. Düzen, şifrelenirken ve şifreleri çözülürken cookiekullanılır, bu nedenle uygulamalar arasında tutarlı bir düzen kullanılmalıdır.
  • Ortak bir veri koruma anahtarı depolama konumu kullanılır.
  • DataProtectionProviderMicrosoft.AspNetCore.DataProtection.Extensions NuGet paketini gerektirir:
    • ASP.NET Core 2.x uygulamalarında Microsoft.AspNetCore.App meta paketine başvurun.
    • .NET Framework uygulamalarında Microsoft.AspNetCore.DataProtection.Extensions'a bir paket başvurusu ekleyin.
  • SetApplicationName ortak uygulama adını ayarlar.

kimlik doğrulamalarını cookieASP.NET Core ile paylaşma Identity

ASP.NET Core Identitykullanırken:

  • Veri koruma anahtarları ve uygulama adı uygulamalar arasında paylaşılmalıdır. Aşağıdaki örneklerde yöntemine PersistKeysToFileSystem ortak bir anahtar depolama konumu sağlanır. Ortak bir paylaşılan uygulama adı yapılandırmak için kullanın SetApplicationName (SharedCookieApp aşağıdaki örneklerde). Daha fazla bilgi için bkz . ASP.NET Çekirdek Veri Korumasını Yapılandırma.
  • ConfigureApplicationCookie s için veri koruma hizmetini ayarlamak için cookieuzantı yöntemini kullanın.
  • Varsayılan kimlik doğrulama türü şeklindedir Identity.Application.

Startup.ConfigureServices içinde:

services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
});

Not: Önceki yönergeler (CookieAuthenticationOptions.SessionStore ile ITicketStore çalışmaz). Daha fazla bilgi için bu GitHub konusuna bakın.

Güvenlik nedeniyle, kimlik doğrulaması cookie değerleri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulaması cookie değerlerini kullanırken geliştiriciler, dahil edilen istek bilgilerinin sayısını, ihtiyaçları için gerekli olan değere kadar en aza indirmelidir.

kimlik doğrulamalarını cookieASP.NET Core olmadan paylaşma Identity

S'leri doğrudan ASP.NET Core Identityolmadan kullanırken cookieiçinde veri korumasını ve kimlik doğrulamasını Startup.ConfigureServicesyapılandırın. Aşağıdaki örnekte, kimlik doğrulama türü olarak Identity.Applicationayarlanır:

services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.AddAuthentication("Identity.Application")
    .AddCookie("Identity.Application", options =>
    {
        options.Cookie.Name = ".AspNet.SharedCookie";
    });

Güvenlik nedeniyle, kimlik doğrulaması cookie değerleri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulaması cookie değerlerini kullanırken geliştiriciler, dahil edilen istek bilgilerinin sayısını, ihtiyaçları için gerekli olan değere kadar en aza indirmelidir.

S'leri farklı temel yollarda paylaşma cookie

Kimlik doğrulamasıcookie, varsayılan Cookieolarak HttpRequest.PathBase kullanır. Yol. Uygulamanın cookie farklı temel yollarda paylaşılması gerekiyorsa geçersiz Path kılınmalıdır:

services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");

services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
    options.Cookie.Path = "/";
});

Alt etki alanları arasında paylaşım cookie

Alt etki alanları arasında s paylaşan cookieuygulamaları barındırırken, içinde Cookieortak bir etki alanı belirtin. Etki alanı özelliği. ve gibi second_subdomain.contoso.comfirst_subdomain.contoso.com uygulamaları contoso.comarasında paylaşmak cookieiçin öğesini olarak .contoso.combelirtinCookie.Domain:

options.Cookie.Domain = ".contoso.com";

Bekleyen veri koruma anahtarlarını şifreleme

Üretim dağıtımları için, bekleyen anahtarları DPAPI veya X509Certificate ile şifrelemek için öğesini yapılandırın DataProtectionProvider . Daha fazla bilgi için bkz . ASP.NET Core kullanarak Windows ve Azure'da bekleyen anahtar şifrelemesi. Aşağıdaki örnekte, için ProtectKeysWithCertificatebir sertifika parmak izi sağlanır:

services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");

kimlik doğrulamalarını cookieASP.NET 4.x ile ASP.NET Core uygulamaları arasında paylaşma

Katana Cookie Kimlik Doğrulama Ara Yazılımı kullanan ASP.NET 4.x uygulamaları, ASP.NET Core Cookie Authentication Ara Yazılımı ile uyumlu kimlik doğrulamaları cookieoluşturmak için yapılandırılabilir. Daha fazla bilgi için bkz. ASP.NET 4.x ile ASP.NET Core uygulamaları (dotnet/AspNetCore.Docs #21987) arasında kimlik doğrulamalarını cookiepaylaşma.

Ortak kullanıcı veritabanı kullanma

Uygulamalar aynı Identity şemayı (aynı sürümü Identity) kullandığında, her uygulama için sistemin aynı kullanıcı veritabanına işaret edildiğini onaylayın Identity . Aksi takdirde kimlik sistemi, kimlik doğrulamasındaki cookie bilgileri veritabanındaki bilgilerle eşleştirmeye çalıştığında çalışma zamanında hatalar üretir.

Identity Şema uygulamalar arasında farklı olduğunda, genellikle uygulamalar farklı Identity sürümler kullandığından, diğer uygulamanın Identity şemalarına sütunları yeniden eşlemeden ve eklemeden en son sürümünü Identity temel alan ortak bir veritabanını paylaşmak mümkün değildir. Ortak bir veritabanının uygulamalar tarafından paylaşılabilmesi için diğer uygulamaları en son Identity sürümü kullanacak şekilde yükseltmek genellikle daha verimlidir.

Ek kaynaklar