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.SharedCookie
ayarlanır. AuthenticationType
açıkça veya varsayılan olarak olarak ayarlanırIdentity.Application
.- Yaygın bir uygulama adı
SharedCookieApp
olan , 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.
- ASP.NET Core uygulamalarında anahtar PersistKeysToFileSystem depolama konumunu ayarlamak için kullanılır.
- .NET Framework uygulamalarında, Cookie Kimlik Doğrulama Ara Yazılımı uygulamasını DataProtectionProviderkullanır.
DataProtectionProvider
, kimlik doğrulama cookie yükü verilerinin şifrelenmesini ve şifresinin çözülmesini sağlayan veri koruma hizmetleri sağlar. ÖrnekDataProtectionProvider
, uygulamanın diğer bölümleri tarafından kullanılan veri koruma sisteminden yalıtılır. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>), veri koruma anahtarı depolama alanının konumunu belirtmek için bir DirectoryInfo değerini kabul eder.
DataProtectionProvider
Microsoft.AspNetCore.DataProtection.Extensions NuGet paketini gerektirir:- 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.Application
ayarlanı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.com
first_subdomain.contoso.com
uygulamaları contoso.com
arasında paylaşmak cookieiçin öğesini olarak .contoso.com
belirtinCookie.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:
- System.Web bağdaştırıcılarının kullanıcıların oturum açması için ASP.NET uygulamasını kullanan uzaktan kimlik doğrulama özelliğini kullanma.
- kimlik doğrulamalarının cookieASP.NET Core uygulamasıyla paylaşılması için ASP.NET uygulamasını Microsoft.Owin Cookie Kimlik Doğrulaması Ara Yazılımı kullanacak şekilde yapılandırma.
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.cs
yapı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.SharedCookie
ayarlanı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.
- ASP.NET Core uygulamalarında anahtar PersistKeysToFileSystem depolama konumunu ayarlamak için kullanılır.
- .NET Framework uygulamalarında, Cookie Kimlik Doğrulama Ara Yazılımı uygulamasını DataProtectionProviderkullanır.
DataProtectionProvider
, kimlik doğrulama cookie yükü verilerinin şifrelenmesini ve şifresinin çözülmesini sağlayan veri koruma hizmetleri sağlar. ÖrnekDataProtectionProvider
, uygulamanın diğer bölümleri tarafından kullanılan veri koruma sisteminden yalıtılır. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>), veri koruma anahtarı depolama alanının konumunu belirtmek için bir DirectoryInfo değerini kabul eder.
DataProtectionProvider
Microsoft.AspNetCore.DataProtection.Extensions NuGet paketini gerektirir:- 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.ConfigureServices
yapılandırın. Aşağıdaki örnekte, kimlik doğrulama türü olarak Identity.Application
ayarlanı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.com
first_subdomain.contoso.com
uygulamaları contoso.com
arasında paylaşmak cookieiçin öğesini olarak .contoso.com
belirtinCookie.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
ASP.NET Core
Geri Bildirim
https://aka.ms/ContentUserFeedback.
Çok yakında: 2024 boyunca, içerik için geri bildirim mekanizması olarak GitHub Sorunları’nı kullanımdan kaldıracak ve yeni bir geri bildirim sistemiyle değiştireceğiz. Daha fazla bilgi için bkz.Gönderin ve geri bildirimi görüntüleyin