Aracılığıyla paylaş


Kimlik doğrulama tanımlama bilgilerini ASP.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ğrulama tanımlama bilgilerini paylaş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 uygulamalar içinde ve genelindecookiekullanılmalıdır. Şema, tanımlama bilgileri şifrelenirken ve şifresi çözülürken kullanı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.
  • DataProtectionProvider Microsoft.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ğrulama tanımlama bilgilerini ASP.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 Tanımlama bilgileri için veri koruma hizmetini ayarlamak için uzantı 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 (ITicketStore ile CookieAuthenticationOptions.SessionStore çalışmaz). Daha fazla bilgi için bu GitHub konusuna bakın.

Güvenlik nedeniyle kimlik doğrulama tanımlama bilgileri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulama tanımlama bilgilerini kullanırken, geliştiricilerin yalnızca ihtiyaçları için gerekli olan talep bilgilerinin sayısını en aza indirmesi gerekir.

kimlik doğrulama tanımlama bilgilerini ASP.NET Core olmadan paylaşma Identity

Tanımlama bilgilerini doğrudan ASP.NET Core Identityolmadan kullanırken 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ğrulama tanımlama bilgileri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulama tanımlama bilgilerini kullanırken, geliştiricilerin yalnızca ihtiyaçları için gerekli olan talep bilgilerinin sayısını en aza indirmesi gerekir.

Tanımlama bilgilerini farklı temel yollarda paylaşma

Kimlik doğrulamasıcookie, varsayılan olarak HttpRequest.PathBaseCookie. 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();

Tanımlama bilgilerini alt etki alanları arasında paylaşma

Tanımlama bilgilerini alt etki alanları arasında paylaşan uygulamaları barındırırken, içinde Cookieortak bir etki alanı belirtin. Etki alanı özelliği. ve gibi contoso.com uygulamalar arasında tanımlama bilgilerini paylaşmak için şunu belirtinfirst_subdomain.contoso.comsecond_subdomain.contoso.com:Cookie.Domain.contoso.com

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

Veri koruma anahtarlarını saklanırken şifrele

Üretim dağıtımları için, duran anahtarları DPAPI veya X509Certificate ile şifrelemek için DataProtectionProvider yapılandırın. Daha fazla bilgi için bkz: Windows ve Azure'da ASP.NET Core kullanarak diskte 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ı 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 HostBuilder uygulamasından WebHostBuilder 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

ASP.NET 4.x ve ASP.NET Core uygulamaları arasında kimlik doğrulama tanımlama bilgilerini paylaşma

ASP.NET Microsoft.Owin Cookie Kimlik Doğrulama Ara Yazılımı kullanan 4.x uygulamaları, ASP.NET Core Cookie Kimlik Doğrulama Ara Yazılımı ile uyumlu kimlik doğrulama tanımlama bilgileri oluşturacak şekilde 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ı ASP.NET Core uygulamasıyla tanımlama bilgilerini paylaşmak ü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 AspNetTicketDataFormat'ı ASP.NET Core uygulamasının ayarlarıyla eşleşecek şekilde yapılandırmak için Startup.Auth.cs'daki ç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 özel 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ğrulama tanımlama bilgilerini kullanarak 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 uygulamalar içinde ve genelindecookiekullanılmalıdır. Şema, tanımlama bilgileri şifrelenirken ve şifresi çözülürken kullanı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.
  • DataProtectionProvider Microsoft.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ğrulama tanımlama bilgilerini ASP.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 Tanımlama bilgileri için veri koruma hizmetini ayarlamak için uzantı 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 (ITicketStore ile CookieAuthenticationOptions.SessionStore çalışmaz). Daha fazla bilgi için bu GitHub konusuna bakın.

Güvenlik nedeniyle kimlik doğrulama tanımlama bilgileri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulama tanımlama bilgilerini kullanırken, geliştiricilerin yalnızca ihtiyaçları için gerekli olan talep bilgilerinin sayısını en aza indirmesi gerekir.

kimlik doğrulama tanımlama bilgilerini ASP.NET Core olmadan paylaşma Identity

Tanımlama bilgilerini doğrudan ASP.NET Core Identityolmadan kullanırken iç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ğrulama tanımlama bilgileri ASP.NET Core'da sıkıştırılmaz. Kimlik doğrulama tanımlama bilgilerini kullanırken, geliştiricilerin yalnızca ihtiyaçları için gerekli olan talep bilgilerinin sayısını en aza indirmesi gerekir.

Tanımlama bilgilerini farklı temel yollarda paylaşma

Kimlik doğrulamasıcookie, varsayılan olarak HttpRequest.PathBaseCookie. 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 = "/";
});

Tanımlama bilgilerini alt etki alanları arasında paylaşma

Tanımlama bilgilerini alt etki alanları arasında paylaşan uygulamaları barındırırken, içinde Cookieortak bir etki alanı belirtin. Etki alanı özelliği. ve gibi contoso.com uygulamalar arasında tanımlama bilgilerini paylaşmak için şunu belirtinfirst_subdomain.contoso.comsecond_subdomain.contoso.com:Cookie.Domain.contoso.com

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

Veri koruma anahtarlarını saklanırken şifrele

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

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

ASP.NET 4.x ve ASP.NET Core uygulamaları arasında kimlik doğrulama tanımlama bilgilerini 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ğrulama tanımlama bilgileri oluşturmak üzere 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ğrulama tanımlama bilgilerini paylaş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ı 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