Udostępnianie uwierzytelniania cookiemię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(SSO), aplikacje internetowe w witrynie muszą udostępniać uwierzytelnianie cookie. 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 na Identity.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 cookies, więc spójny schemat musi być używany w aplikacjach.
  • Używana jest wspólna lokalizacja magazynu kluczy ochrony danych.
  • DataProtectionProviderwymaga pakietu NuGet Microsoft.AspNetCore.DataProtection.Extensions:
  • SetApplicationName Ustawia nazwę pospolitej aplikacji.

Udostępnianie uwierzytelniania cookieza pomocą platformy 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 programu cookies.
  • 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ędu na bezpieczeństwo pliki cookie uwierzytelniania nie są kompresowane na platformie ASP.NET Core. Deweloperzy używający plików cookie uwierzytelniania powinni minimalizować ilość uwzględnianych informacji dotyczących oświadczeń tylko do informacji, które są dla nich niezbędne.

Udostępnianie uwierzytelniania cookiebez ASP.NET Core Identity

W przypadku używania cookies 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ędu na bezpieczeństwo pliki cookie uwierzytelniania nie są kompresowane na platformie ASP.NET Core. Deweloperzy używający plików cookie uwierzytelniania powinni minimalizować ilość uwzględnianych informacji dotyczących oświadczeń tylko do informacji, które są dla nich niezbędne.

Udostępnianie cookiemię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 cookiemiędzy poddomenami

Podczas hostowania aplikacji, które współużytkują cookiedomeny podrzędne, określ wspólną domenę w domenie Cookie. Właściwość domeny . Aby udostępnić cookieaplikacje w witrynie contoso.com, na przykład 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 magazynowanych

W przypadku wdrożeń produkcyjnych należy skonfigurować opcję szyfrowania kluczy magazynowanych przy użyciu interfejsu DataProtectionProvider DPAPI lub X509Certificate. Aby uzyskać więcej informacji, zobacz Szyfrowanie kluczy magazynowanych w systemach Windows i 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. W przeciwnym razie system tożsamości 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 uwierzytelniania cookiemiędzy aplikacjami ASP.NET 4.x i ASP.NET Core

ASP.NET aplikacji 4.x korzystających z oprogramowania pośredniczącego uwierzytelniania Microsoft.Owin Cookie można skonfigurować tak, aby generować uwierzytelnianie zgodne z oprogramowaniem pośredniczącym uwierzytelniania cookiepodstawowego 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 Microsoft.Owin Cookie Authentication w taki sposób, aby uwierzytelnianie cookiebyło współużytkowane z aplikacją ASP.NET Core.

Aby skonfigurować oprogramowanie pośredniczące ASP.NET Microsoft.Owin Cookie Authentication w celu udostępnienia cookieaplikacji 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 pliku 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 jest ustawiona na oświadczenie z tożsamości ASP.NET Core, która będzie unikatowa 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 środowisk uwierzytelniania cookie, 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

W poniższych przykładach:

  • Nazwa uwierzytelniania cookie jest ustawiona na wspólną wartość .AspNet.SharedCookie.
  • Właściwość AuthenticationType jest domyślnie ustawiona na Identity.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 cookies, więc spójny schemat musi być używany w aplikacjach.
  • Używana jest wspólna lokalizacja magazynu kluczy ochrony danych.
  • DataProtectionProviderwymaga pakietu NuGet Microsoft.AspNetCore.DataProtection.Extensions:
  • SetApplicationName Ustawia nazwę pospolitej aplikacji.

Udostępnianie uwierzytelniania cookieza pomocą platformy 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 programu cookies.
  • 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ędu na bezpieczeństwo pliki cookie uwierzytelniania nie są kompresowane na platformie ASP.NET Core. Deweloperzy używający plików cookie uwierzytelniania powinni minimalizować ilość uwzględnianych informacji dotyczących oświadczeń tylko do informacji, które są dla nich niezbędne.

Udostępnianie uwierzytelniania cookiebez ASP.NET Core Identity

Jeśli używasz cookies bezpośrednio bez ASP.NET Core Identity, skonfiguruj 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ędu na bezpieczeństwo pliki cookie uwierzytelniania nie są kompresowane na platformie ASP.NET Core. Deweloperzy używający plików cookie uwierzytelniania powinni minimalizować ilość uwzględnianych informacji dotyczących oświadczeń tylko do informacji, które są dla nich niezbędne.

Udostępnianie cookiemię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 cookiemiędzy poddomenami

Podczas hostowania aplikacji, które współużytkują cookiedomeny podrzędne, określ wspólną domenę w domenie Cookie. Właściwość domeny . Aby udostępnić cookieaplikacje w witrynie contoso.com, na przykład 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 magazynowanych

W przypadku wdrożeń produkcyjnych należy skonfigurować opcję szyfrowania kluczy magazynowanych przy użyciu interfejsu DataProtectionProvider DPAPI lub X509Certificate. Aby uzyskać więcej informacji, zobacz Szyfrowanie kluczy magazynowanych w systemach Windows i 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 uwierzytelniania cookiemię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 s uwierzytelniania, które są zgodne z oprogramowaniem pośredniczącym uwierzytelniania cookiepodstawowego ASP.NET Core Cookie . Aby uzyskać więcej informacji, zobacz Udostępnianie uwierzytelniania cookiemię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. W przeciwnym razie system tożsamości 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.

Dodatkowe zasoby