Udostępnianie plików cookie uwierzytelniania między aplikacjami ASP.NET
Autor: Rick Anderson
Witryny internetowe często składają się z poszczególnych aplikacji internetowych, które współpracują ze sobą. Aby zapewnić środowisko logowania jednokrotnego, aplikacje internetowe w witrynie muszą udostępniać pliki cookie uwierzytelniania. Aby obsługiwać ten scenariusz, stos ochrony danych umożliwia udostępnianie uwierzytelniania Katana cookie i biletów uwierzytelniania ASP.NET Core cookie .
W poniższych przykładach:
- Nazwa uwierzytelniania cookie jest ustawiona na wspólną wartość
.AspNet.SharedCookie
. - Właściwość
AuthenticationType
jest domyślnie ustawiona naIdentity.Application
jawną lub domyślną. - Nazwa pospolita aplikacji
SharedCookieApp
, służy do umożliwienia systemowi ochrony danych współużytkowania kluczy ochrony danych. Identity.Application
jest używany jako schemat uwierzytelniania. Niezależnie od używanego schematu, należy go używać spójnie w aplikacjach udostępnionych i w ramach udostępnionych cookie aplikacji jako schematu domyślnego lub przez jawne ustawienie go. Schemat jest używany podczas szyfrowania i odszyfrowywania plików cookie, dlatego należy używać spójnego schematu w aplikacjach.- Używana jest wspólna lokalizacja magazynu kluczy ochrony danych.
- W aplikacjach PersistKeysToFileSystem ASP.NET Core służy do ustawiania lokalizacji przechowywania kluczy.
- W aplikacjach Cookie .NET Framework oprogramowanie pośredniczące uwierzytelniania używa implementacji .DataProtectionProvider
DataProtectionProvider
Udostępnia usługi ochrony danych na potrzeby szyfrowania i odszyfrowywania danych ładunku uwierzytelniania cookie . WystąpienieDataProtectionProvider
jest odizolowane od systemu ochrony danych używanego przez inne części aplikacji. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>) akceptuje element , DirectoryInfo aby określić lokalizację magazynu kluczy ochrony danych.
DataProtectionProvider
wymaga pakietu NuGet Microsoft.AspNetCore.DataProtection.Extensions:- W aplikacjach .NET Framework dodaj odwołanie do pakietu Microsoft.AspNetCore.DataProtection.Extensions.
- SetApplicationName Ustawia nazwę pospolitej aplikacji.
Udostępnianie plików cookie uwierzytelniania za pomocą ASP.NET Core Identity
W przypadku korzystania z ASP.NET Core Identity:
- Klucze ochrony danych i nazwa aplikacji muszą być współużytkowane przez aplikacje. Typowa lokalizacja magazynu kluczy jest udostępniana metodzie PersistKeysToFileSystem w poniższych przykładach. Użyj SetApplicationName polecenia , aby skonfigurować wspólną nazwę aplikacji udostępnionej (
SharedCookieApp
w poniższych przykładach). Aby uzyskać więcej informacji, zobacz Konfigurowanie ASP.NET Core Data Protection. - ConfigureApplicationCookie Użyj metody rozszerzenia, aby skonfigurować usługę ochrony danych dla plików cookie.
- Domyślnym typem uwierzytelniania jest
Identity.Application
.
W pliku 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();
Uwaga: powyższe instrukcje nie działają z elementem ITicketStore
(CookieAuthenticationOptions.SessionStore
). Aby uzyskać więcej informacji, zobacz ten problem w serwisie GitHub.
Ze względów bezpieczeństwa pliki cookie uwierzytelniania nie są kompresowane w ASP.NET Core. W przypadku korzystania z plików cookie uwierzytelniania deweloperzy powinni zminimalizować liczbę informacji o oświadczeniach uwzględnionych tylko w tych potrzebach.
Udostępnianie plików cookie uwierzytelniania bez ASP.NET Core Identity
W przypadku korzystania z plików cookie bezpośrednio bez ASP.NET Core Identityskonfiguruj ochronę danych i uwierzytelnianie. W poniższym przykładzie typ uwierzytelniania jest ustawiony na :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();
Ze względów bezpieczeństwa pliki cookie uwierzytelniania nie są kompresowane w ASP.NET Core. W przypadku korzystania z plików cookie uwierzytelniania deweloperzy powinni zminimalizować liczbę informacji o oświadczeniach uwzględnionych tylko w tych potrzebach.
Udostępnianie plików cookie między różnymi ścieżkami podstawowymi
Uwierzytelnianie cookie używa obiektu HttpRequest.PathBase jako domyślnego Cookieelementu . Ścieżka. Jeśli aplikacja cookie musi być współdzielona między różnymi ścieżkami podstawowymi, Path
musi zostać zastąpiona:
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();
Udostępnianie plików cookie w poddomenach
W przypadku hostowania aplikacji, które udostępniają pliki cookie w poddomenach, określ wspólną domenę w domenie Cookie. Właściwość domeny . Aby udostępniać pliki cookie w aplikacjach, contoso.com
takich jak first_subdomain.contoso.com
i second_subdomain.contoso.com
, określ wartość Cookie.Domain
jako .contoso.com
:
options.Cookie.Domain = ".contoso.com";
Szyfrowanie kluczy ochrony danych pod adresem rest
W przypadku wdrożeń produkcyjnych należy skonfigurować element DataProtectionProvider
, aby szyfrować klucze przy rest użyciu interfejsu DPAPI lub X509Certificate. Aby uzyskać więcej informacji, zobacz Szyfrowanie kluczy w rest systemie Windows i na platformie Azure przy użyciu platformy ASP.NET Core. W poniższym przykładzie odcisk palca certyfikatu jest udostępniany w usłudze ProtectKeysWithCertificate:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
.ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
Używanie typowej bazy danych użytkowników
Jeśli aplikacje używają tego samego schematu (tej samej Identity wersji Identity), upewnij się, że Identity system dla każdej aplikacji jest wskazywany na tę samą bazę danych użytkownika. identity W przeciwnym razie system generuje błędy w czasie wykonywania, gdy próbuje dopasować informacje w uwierzytelnianiu cookie do informacji w bazie danych.
Identity Gdy schemat różni się między aplikacjami, zwykle dlatego, że aplikacje używają różnych Identity wersji, udostępnianie wspólnej bazy danych opartej na najnowszej wersji Identity nie jest możliwe bez ponownego mapowania i dodawania kolumn w schematach innych aplikacjiIdentity. Często wydajniejsze jest uaktualnianie innych aplikacji do korzystania z najnowszej Identity wersji, dzięki czemu wspólna baza danych może być współużytkowany przez aplikacje.
Zmiana nazwy aplikacji
Na platformie .NET 6 WebApplicationBuilder normalizuje ścieżkę katalogu głównego zawartości, aby zakończyć ciąg .DirectorySeparatorChar Większość aplikacji migrowanych z HostBuilder lub WebHostBuilder nie ma takiej samej nazwy aplikacji, ponieważ nie są znormalizowane. Aby uzyskać więcej informacji, zobacz SetApplicationName
Udostępnianie plików cookie uwierzytelniania między aplikacjami ASP.NET 4.x i ASP.NET Core
ASP.NET aplikacje 4.x korzystające z oprogramowania pośredniczącego uwierzytelniania Microsoft.Owin Cookie można skonfigurować do generowania plików cookie uwierzytelniania zgodnych z oprogramowaniem pośredniczącym uwierzytelniania ASP.NET Core Cookie . Może to być przydatne, jeśli aplikacja internetowa składa się zarówno z aplikacji ASP.NET 4.x, jak i aplikacji ASP.NET Core, które muszą współużytkować środowisko logowania jednokrotnego. Konkretnym przykładem takiego scenariusza jest przyrostowe migrowanie aplikacji internetowej z ASP.NET do ASP.NET Core. W takich scenariuszach niektóre części aplikacji mogą być obsługiwane przez oryginalną aplikację ASP.NET, podczas gdy inne są obsługiwane przez nową aplikację ASP.NET Core. Użytkownicy powinni jednak zalogować się tylko raz. Można to osiągnąć za pomocą jednej z następujących metod:
- Używanie funkcji uwierzytelniania zdalnego kart System.Web, która używa aplikacji ASP.NET do logowania użytkowników.
- Skonfigurowanie aplikacji ASP.NET do korzystania z oprogramowania Pośredniczącego uwierzytelniania Microsoft.Owin Cookie w taki sposób, aby pliki cookie uwierzytelniania zostały udostępnione aplikacji ASP.NET Core.
Aby skonfigurować oprogramowanie pośredniczące ASP.NET Microsoft.Owin Cookie Authentication w celu udostępniania plików cookie aplikacji ASP.NET Core, postępuj zgodnie z poprzednimi instrukcjami, aby skonfigurować aplikację ASP.NET Core do używania określonej cookie nazwy, nazwy aplikacji i utrwalania kluczy ochrony danych w dobrze znanej lokalizacji. Aby uzyskać więcej informacji na temat utrwalania kluczy ochrony danych, zobacz Konfigurowanie ASP.NET Core Data Protection .
W aplikacji ASP.NET zainstaluj Microsoft.Owin.Security.Interop
pakiet.
Zaktualizuj wywołanie UseCookieAuthentication
w Startup.Auth.cs, aby skonfigurować format AspNetTicketDataFormat tak, aby był zgodny z ustawieniami aplikacji 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()
});
Ważne elementy skonfigurowane w tym miejscu obejmują:
- Nazwa cookie jest ustawiona na taką samą nazwę jak w aplikacji ASP.NET Core.
- Dostawca ochrony danych jest tworzony przy użyciu tej samej ścieżki pierścienia kluczy. Należy pamiętać, że w tych przykładach klucze ochrony danych są przechowywane na dysku, ale mogą być używane inne dostawcy ochrony danych. Na przykład usługi Redis lub Azure Blob Storage mogą być używane dla dostawców ochrony danych, o ile konfiguracja jest zgodna między aplikacjami. Aby uzyskać więcej informacji na temat utrwalania kluczy ochrony danych, zobacz Konfigurowanie ASP.NET Core Data Protection .
- Nazwa aplikacji jest taka sama jak nazwa aplikacji używana w aplikacji ASP.NET Core.
- Typ uwierzytelniania jest ustawiony na nazwę schematu uwierzytelniania w aplikacji ASP.NET Core.
System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier
parametr jest ustawiony na oświadczenie z ASP.NET Core identity , które będzie unikatowe dla użytkownika.
Ponieważ typ uwierzytelniania został zmieniony tak, aby był zgodny ze schematem uwierzytelniania aplikacji ASP.NET Core, konieczne jest również zaktualizowanie sposobu generowania przez aplikację ASP.NET nowych tożsamości w celu używania tej samej nazwy. Zazwyczaj odbywa się to w programie 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;
}
}
Dzięki tym zmianom aplikacje ASP.NET i ASP.NET Core mogą używać tych samych plików cookie uwierzytelniania, dzięki czemu użytkownicy logujący się lub wychodzący z jednej aplikacji są odzwierciedlane w innej aplikacji.
Należy pamiętać, że ponieważ istnieją różnice między schematami baz danych ASP.NET Identity i ASP.NET CoreIdentity, zaleca się, aby użytkownicy logujący się tylko przy użyciu jednej z aplikacji — ASP.NET lub ASP.NET Core. Po zalogowaniu użytkowników kroki opisane w tej sekcji umożliwią użycie uwierzytelniania przez jedną cookie z aplikacji, a obie aplikacje powinny mieć możliwość wylogowania użytkowników.
Dodatkowe zasoby
- Hostowanie aplikacji ASP.NET Core na farmie internetowej
- Podstawy oprogramowania pośredniczącego uwierzytelniania OWIN cookie dla dewelopera ASP.NET firmy Brock Allen
- Architektura oprogramowania pośredniczącego uwierzytelniania OWIN firmy Brock Allen
- Wpisy z kategorii "OWIN / Katana" autorstwa Brock Allen
W poniższych przykładach:
- Nazwa uwierzytelniania cookie jest ustawiona na wspólną wartość
.AspNet.SharedCookie
. - Właściwość
AuthenticationType
jest domyślnie ustawiona naIdentity.Application
jawną lub domyślną. - Nazwa pospolita aplikacji służy do włączania systemu ochrony danych w celu udostępniania kluczy ochrony danych (
SharedCookieApp
). Identity.Application
jest używany jako schemat uwierzytelniania. Niezależnie od używanego schematu, należy go używać spójnie w aplikacjach udostępnionych i w ramach udostępnionych cookie aplikacji jako schematu domyślnego lub przez jawne ustawienie go. Schemat jest używany podczas szyfrowania i odszyfrowywania plików cookie, dlatego należy używać spójnego schematu w aplikacjach.- Używana jest wspólna lokalizacja magazynu kluczy ochrony danych.
- W aplikacjach PersistKeysToFileSystem ASP.NET Core służy do ustawiania lokalizacji przechowywania kluczy.
- W aplikacjach Cookie .NET Framework oprogramowanie pośredniczące uwierzytelniania używa implementacji .DataProtectionProvider
DataProtectionProvider
Udostępnia usługi ochrony danych na potrzeby szyfrowania i odszyfrowywania danych ładunku uwierzytelniania cookie . WystąpienieDataProtectionProvider
jest odizolowane od systemu ochrony danych używanego przez inne części aplikacji. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>) akceptuje element , DirectoryInfo aby określić lokalizację magazynu kluczy ochrony danych.
DataProtectionProvider
wymaga pakietu NuGet Microsoft.AspNetCore.DataProtection.Extensions:- W aplikacjach ASP.NET Core 2.x odwołuje się do Microsoft.AspNetCore.App metapakiet.
- W aplikacjach .NET Framework dodaj odwołanie do pakietu Microsoft.AspNetCore.DataProtection.Extensions.
- SetApplicationName Ustawia nazwę pospolitej aplikacji.
Udostępnianie plików cookie uwierzytelniania za pomocą ASP.NET Core Identity
W przypadku korzystania z ASP.NET Core Identity:
- Klucze ochrony danych i nazwa aplikacji muszą być współużytkowane przez aplikacje. Typowa lokalizacja magazynu kluczy jest udostępniana metodzie PersistKeysToFileSystem w poniższych przykładach. Użyj SetApplicationName polecenia , aby skonfigurować wspólną nazwę aplikacji udostępnionej (
SharedCookieApp
w poniższych przykładach). Aby uzyskać więcej informacji, zobacz Konfigurowanie ASP.NET Core Data Protection. - ConfigureApplicationCookie Użyj metody rozszerzenia, aby skonfigurować usługę ochrony danych dla plików cookie.
- Domyślnym typem uwierzytelniania jest
Identity.Application
.
W pliku Startup.ConfigureServices
:
services.AddDataProtection()
.PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
.SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
});
Uwaga: powyższe instrukcje nie działają z elementem ITicketStore
(CookieAuthenticationOptions.SessionStore
). Aby uzyskać więcej informacji, zobacz ten problem w serwisie GitHub.
Ze względów bezpieczeństwa pliki cookie uwierzytelniania nie są kompresowane w ASP.NET Core. W przypadku korzystania z plików cookie uwierzytelniania deweloperzy powinni zminimalizować liczbę informacji o oświadczeniach uwzględnionych tylko w tych potrzebach.
Udostępnianie plików cookie uwierzytelniania bez ASP.NET Core Identity
W przypadku używania plików cookie bezpośrednio bez ASP.NET Core Identityskonfiguruj ochronę danych i uwierzytelnianie w programie Startup.ConfigureServices
. W poniższym przykładzie typ uwierzytelniania jest ustawiony na :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";
});
Ze względów bezpieczeństwa pliki cookie uwierzytelniania nie są kompresowane w ASP.NET Core. W przypadku korzystania z plików cookie uwierzytelniania deweloperzy powinni zminimalizować liczbę informacji o oświadczeniach uwzględnionych tylko w tych potrzebach.
Udostępnianie plików cookie między różnymi ścieżkami podstawowymi
Uwierzytelnianie cookie używa obiektu HttpRequest.PathBase jako domyślnego Cookieelementu . Ścieżka. Jeśli aplikacja cookie musi być współdzielona między różnymi ścieżkami podstawowymi, Path
musi zostać zastąpiona:
services.AddDataProtection()
.PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
.SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options => {
options.Cookie.Name = ".AspNet.SharedCookie";
options.Cookie.Path = "/";
});
Udostępnianie plików cookie w poddomenach
W przypadku hostowania aplikacji, które udostępniają pliki cookie w poddomenach, określ wspólną domenę w domenie Cookie. Właściwość domeny . Aby udostępniać pliki cookie w aplikacjach, contoso.com
takich jak first_subdomain.contoso.com
i second_subdomain.contoso.com
, określ wartość Cookie.Domain
jako .contoso.com
:
options.Cookie.Domain = ".contoso.com";
Szyfrowanie kluczy ochrony danych pod adresem rest
W przypadku wdrożeń produkcyjnych należy skonfigurować element DataProtectionProvider
, aby szyfrować klucze przy rest użyciu interfejsu DPAPI lub X509Certificate. Aby uzyskać więcej informacji, zobacz Szyfrowanie kluczy w rest systemie Windows i na platformie Azure przy użyciu platformy ASP.NET Core. W poniższym przykładzie odcisk palca certyfikatu jest udostępniany w usłudze ProtectKeysWithCertificate:
services.AddDataProtection()
.ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
Udostępnianie plików cookie uwierzytelniania między aplikacjami ASP.NET 4.x i ASP.NET Core
ASP.NET aplikacje 4.x korzystające z oprogramowania pośredniczącego Katana Cookie Authentication można skonfigurować do generowania plików cookie uwierzytelniania zgodnych z oprogramowaniem pośredniczącym uwierzytelniania podstawowego ASP.NET Core Cookie . Aby uzyskać więcej informacji, zobacz Udostępnianie plików cookie uwierzytelniania między aplikacjami ASP.NET 4.x i ASP.NET Core (dotnet/AspNetCore.Docs #21987).
Używanie typowej bazy danych użytkowników
Jeśli aplikacje używają tego samego schematu (tej samej Identity wersji Identity), upewnij się, że Identity system dla każdej aplikacji jest wskazywany na tę samą bazę danych użytkownika. identity W przeciwnym razie system generuje błędy w czasie wykonywania, gdy próbuje dopasować informacje w uwierzytelnianiu cookie do informacji w bazie danych.
Identity Gdy schemat różni się między aplikacjami, zwykle dlatego, że aplikacje używają różnych Identity wersji, udostępnianie wspólnej bazy danych opartej na najnowszej wersji Identity nie jest możliwe bez ponownego mapowania i dodawania kolumn w schematach innych aplikacjiIdentity. Często wydajniejsze jest uaktualnianie innych aplikacji do korzystania z najnowszej Identity wersji, dzięki czemu wspólna baza danych może być współużytkowany przez aplikacje.