Sdílet prostřednictvím


Sdílení ověřování cookiemezi aplikacemi ASP.NET

Autor: Rick Anderson

Weby se často skládají z jednotlivých webových aplikací, které spolupracují. Aby bylo prostředí jednotného přihlašování (SSO) zajištěné, musí webové aplikace na webu sdílet ověřování cookie. Pro podporu tohoto scénáře zásobník ochrany dat umožňuje sdílet ověřování Katana cookie a ASP.NET lístky ověřování Core cookie .

V následujících příkladech:

  • Název ověřování cookie je nastaven na společnou hodnotu .AspNet.SharedCookie.
  • Je AuthenticationType nastavená buď explicitně Identity.Application , nebo ve výchozím nastavení.
  • Běžný název aplikace , SharedCookieAppslouží k povolení systému ochrany dat sdílet klíče ochrany dat.
  • Identity.Application se používá jako schéma ověřování. Bez ohledu na to, jaké schéma se používá, musí se používat konzistentně v rámci sdílených cookie aplikací, a to buď jako výchozí schéma, nebo explicitně ho nastavíte. Schéma se používá při šifrování a dešifrování cookie, takže musí být použito konzistentní schéma napříč aplikacemi.
  • Používá se běžné umístění úložiště klíčů ochrany dat.
  • DataProtectionProvider vyžaduje balíček NuGet Microsoft.AspNetCore.DataProtection.Extensions :
    • V aplikacích .NET Framework přidejte odkaz na balíček Microsoft.AspNetCore.DataProtection.Extensions.
  • SetApplicationName nastaví běžný název aplikace.

Sdílení ověřování cookies využitím ASP.NET Core Identity

Při použití ASP.NET Core Identity:

  • Klíče ochrany dat a název aplikace se musí sdílet mezi aplikacemi. Pro metodu PersistKeysToFileSystem je k dispozici společné umístění úložiště klíčů v následujících příkladech. Slouží SetApplicationName ke konfiguraci společného názvu sdílené aplikace (SharedCookieApp v následujících příkladech). Další informace najdete v tématu Konfigurace ASP.NET základní ochrany dat.
  • ConfigureApplicationCookie Pomocí metody rozšíření nastavte službu ochrany dat pro cookies.
  • Výchozí typ ověřování je Identity.Application.

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

Poznámka: Předchozí pokyny nefungují s ITicketStore (CookieAuthenticationOptions.SessionStore). Další informace najdete u tohoto problému na GitHubu.

Z důvodu zabezpečení nejsou soubory cookie ověřování v ASP.NET Core komprimovány. Při používání souborů cookie ověřování by měli vývojáři minimalizovat počet informací o deklaraci identity na minimum – jen na to, co je nezbytné pro jejich potřeby.

Sdílení ověřování cookiebez ASP.NET Core Identity

Při použití cookiepřímo bez ASP.NET Core Identitynakonfigurujte ochranu a ověřování dat. V následujícím příkladu je typ ověřování nastaven 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();

Z důvodu zabezpečení nejsou soubory cookie ověřování v ASP.NET Core komprimovány. Při používání souborů cookie ověřování by měli vývojáři minimalizovat počet informací o deklaraci identity na minimum – jen na to, co je nezbytné pro jejich potřeby.

Sdílení cookiemezi různými základními cestami

Ověřování používá jako výchozíCookie httpRequest.PathBase .cookie Cesta. Pokud se aplikace cookie musí sdílet napříč různými základními cestami, Path musí se přepsat:

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

Sdílení cookiemezi subdoménami

Při hostováníaplikacích cookieCookie Domain property. Pokud chcete sdílet aplikace na adrese , například first_subdomain.contoso.com a second_subdomain.contoso.com, zadejte následující Cookie.Domain.contoso.com:contoso.comcookie

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

Šifrování neaktivních uložených klíčů ochrany dat

Pro produkční nasazení nakonfigurujte DataProtectionProvider šifrování neaktivních uložených klíčů pomocí DPAPI nebo X509Certificate. Další informace najdete v tématu Šifrování neaktivních uložených klíčů ve Windows a Azure pomocí ASP.NET Core. V následujícím příkladu je k dispozici ProtectKeysWithCertificatekryptografický otisk certifikátu:

using Microsoft.AspNetCore.DataProtection;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

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

Použití společné uživatelské databáze

Pokud aplikace používají stejné schéma (stejnou Identity verzi Identity), ověřte, že Identity systém pro každou aplikaci odkazuje na stejnou uživatelskou databázi. Jinak systém identit při pokusu o shodu informací v ověřování cookie s informacemi v databázi způsobí selhání za běhu.

Identity Pokud se schéma liší mezi aplikacemi, obvykle proto, že aplikace používají různé Identity verze, sdílení společné databáze na základě nejnovější verze Identity není možné bez přemapování a přidávání sloupců do schémat jiných aplikacíIdentity. Často je efektivnější upgradovat ostatní aplikace tak, aby používaly nejnovější Identity verzi, aby aplikace mohly sdílet společnou databázi.

Změna názvu aplikace

V .NET 6 normalizuje kořenovou cestu k obsahu tak, WebApplicationBuilder aby končila na .DirectorySeparatorChar Většina aplikací migrovaných z HostBuilder nebo WebHostBuilder nebude mít stejný název aplikace, protože nejsou normalizované. Další informace najdete v tématu SetApplicationName

Sdílení ověřování cookiemezi aplikacemi ASP.NET 4.x a ASP.NET Core

ASP.NET aplikace 4.x, které používají middleware Microsoft.Owin Cookie Authentication, je možné nakonfigurovat tak, aby generovaly ověřování cookiekompatibilní s middlewarem ASP.NET Core Cookie Authentication. To může být užitečné, pokud se webová aplikace skládá z aplikací ASP.NET 4.x i aplikací ASP.NET Core, které musí sdílet jednotné přihlašování. Konkrétním příkladem takového scénáře je přírůstková migrace webové aplikace z ASP.NET na ASP.NET Core. V takových scénářích je běžné, že některé části aplikace obsluhují původní ASP.NET aplikace, zatímco jiné jsou obsluhovány novou aplikací ASP.NET Core. Uživatelé by se ale měli přihlásit jenom jednou. Toho lze dosáhnout některým z následujících přístupů:

  • Pomocí funkce vzdáleného ověřování adaptérů System.Web, která používá aplikaci ASP.NET k přihlášení uživatelů.
  • Konfigurace ASP.NET aplikace tak, aby používala middleware Microsoft.Owin Cookie Authentication, aby se ověřování cookiesdílelo s aplikací ASP.NET Core.

Pokud chcete nakonfigurovat ASP.NET middlewaru Microsoft.Owin Cookie Authentication pro sdílení cookies aplikací ASP.NET Core, postupujte podle předchozích pokynů a nakonfigurujte aplikaci ASP.NET Core tak, aby používala konkrétní cookie název, název aplikace a trvalé klíče ochrany dat do dobře známého umístění. Další informace o zachování klíčů ochrany dat najdete v tématu Konfigurace ASP.NET Core Data Protection .

V aplikaci ASP.NET nainstalujte Microsoft.Owin.Security.Interop balíček.

UseCookieAuthentication Aktualizujte volání v souboru Startup.Auth.cs a nakonfigurujte AspNetTicketDataFormat tak, aby odpovídalo nastavení aplikace 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()
});

Mezi důležité položky nakonfigurované tady patří:

  • Název cookie je nastavený na stejný název jako v aplikaci ASP.NET Core.
  • Zprostředkovatel ochrany dat se vytvoří pomocí stejné cesty k okruhu klíčů. Všimněte si, že v těchto příkladech jsou klíče ochrany dat uložené na disku, ale je možné použít jiné zprostředkovatele ochrany dat. Například Redis nebo Azure Blob Storage je možné použít pro poskytovatele ochrany dat, pokud se konfigurace shoduje s aplikacemi. Další informace o zachování klíčů ochrany dat najdete v tématu Konfigurace ASP.NET Core Data Protection .
  • Název aplikace je nastavený tak, aby byl stejný jako název aplikace použitý v aplikaci ASP.NET Core.
  • Typ ověřování je nastavený na název schématu ověřování v aplikaci ASP.NET Core.
  • System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier je nastavená na deklaraci identity z identity ASP.NET Core, která bude jedinečná pro uživatele.

Vzhledem k tomu, že se typ ověřování změnil tak, aby odpovídal schématu ověřování aplikace ASP.NET Core, je také nutné aktualizovat způsob, jakým aplikace ASP.NET generuje nové identity, aby používala stejný název. Obvykle se to provádí v 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;
    }
}

Díky těmto změnám můžou aplikace ASP.NET a ASP.NET Core používat stejné ověřování cookie, aby se v druhé aplikaci projevilo přihlášení nebo odhlášení z jedné aplikace.

Mějte na paměti, že vzhledem k rozdílům mezi schématy databáze ASP.NET Identity a ASP.NET Core Identityse doporučuje, aby se uživatelé přihlašují jenom pomocí jedné z aplikací – buď ASP.NET, nebo aplikace ASP.NET Core. Jakmile se uživatelé přihlásí, kroky popsané v této části umožní, aby se ověřování cookie používalo v obou aplikacích a obě aplikace by měly být schopné uživatele odhlásit.

Další prostředky

V následujících příkladech:

  • Název ověřování cookie je nastaven na společnou hodnotu .AspNet.SharedCookie.
  • Je AuthenticationType nastavená buď explicitně Identity.Application , nebo ve výchozím nastavení.
  • Běžný název aplikace se používá k povolení systému ochrany dat ke sdílení klíčů ochrany dat (SharedCookieApp).
  • Identity.Application se používá jako schéma ověřování. Bez ohledu na to, jaké schéma se používá, musí se používat konzistentně v rámci sdílených cookie aplikací, a to buď jako výchozí schéma, nebo explicitně ho nastavíte. Schéma se používá při šifrování a dešifrování cookie, takže musí být použito konzistentní schéma napříč aplikacemi.
  • Používá se běžné umístění úložiště klíčů ochrany dat.
  • DataProtectionProvider vyžaduje balíček NuGet Microsoft.AspNetCore.DataProtection.Extensions :
    • V aplikacích ASP.NET Core 2.x odkazujte na metabalík Microsoft.AspNetCore.App.
    • V aplikacích .NET Framework přidejte odkaz na balíček Microsoft.AspNetCore.DataProtection.Extensions.
  • SetApplicationName nastaví běžný název aplikace.

Sdílení ověřování cookies využitím ASP.NET Core Identity

Při použití ASP.NET Core Identity:

  • Klíče ochrany dat a název aplikace se musí sdílet mezi aplikacemi. Pro metodu PersistKeysToFileSystem je k dispozici společné umístění úložiště klíčů v následujících příkladech. Slouží SetApplicationName ke konfiguraci společného názvu sdílené aplikace (SharedCookieApp v následujících příkladech). Další informace najdete v tématu Konfigurace ASP.NET základní ochrany dat.
  • ConfigureApplicationCookie Pomocí metody rozšíření nastavte službu ochrany dat pro cookies.
  • Výchozí typ ověřování je Identity.Application.

V Startup.ConfigureServices:

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

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

Poznámka: Předchozí pokyny nefungují s ITicketStore (CookieAuthenticationOptions.SessionStore). Další informace najdete u tohoto problému na GitHubu.

Z důvodu zabezpečení nejsou soubory cookie ověřování v ASP.NET Core komprimovány. Při používání souborů cookie ověřování by měli vývojáři minimalizovat počet informací o deklaraci identity na minimum – jen na to, co je nezbytné pro jejich potřeby.

Sdílení ověřování cookiebez ASP.NET Core Identity

Při použití cookiepřímo bez ASP.NET Core Identitynakonfigurujte ochranu a ověřování dat v Startup.ConfigureServices. V následujícím příkladu je typ ověřování nastaven 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";
    });

Z důvodu zabezpečení nejsou soubory cookie ověřování v ASP.NET Core komprimovány. Při používání souborů cookie ověřování by měli vývojáři minimalizovat počet informací o deklaraci identity na minimum – jen na to, co je nezbytné pro jejich potřeby.

Sdílení cookiemezi různými základními cestami

Ověřování používá jako výchozíCookie httpRequest.PathBase .cookie Cesta. Pokud se aplikace cookie musí sdílet napříč různými základními cestami, Path musí se přepsat:

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

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

Sdílení cookiemezi subdoménami

Při hostováníaplikacích cookieCookie Domain property. Pokud chcete sdílet aplikace na adrese , například first_subdomain.contoso.com a second_subdomain.contoso.com, zadejte následující Cookie.Domain.contoso.com:contoso.comcookie

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

Šifrování neaktivních uložených klíčů ochrany dat

Pro produkční nasazení nakonfigurujte DataProtectionProvider šifrování neaktivních uložených klíčů pomocí DPAPI nebo X509Certificate. Další informace najdete v tématu Šifrování neaktivních uložených klíčů ve Windows a Azure pomocí ASP.NET Core. V následujícím příkladu je k dispozici ProtectKeysWithCertificatekryptografický otisk certifikátu:

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

Sdílení ověřování cookiemezi aplikacemi ASP.NET 4.x a ASP.NET Core

ASP.NET aplikace 4.x, které používají Middleware pro ověřování Katana Cookie , je možné nakonfigurovat tak, aby generovaly ověřování cookiekompatibilní s middlewarem ASP.NET Core Cookie Authentication. Další informace najdete v tématu Sdílení ověřování cookiemezi aplikacemi ASP.NET 4.x a ASP.NET Core (dotnet/AspNetCore.Docs #21987).

Použití společné uživatelské databáze

Pokud aplikace používají stejné schéma (stejnou Identity verzi Identity), ověřte, že Identity systém pro každou aplikaci odkazuje na stejnou uživatelskou databázi. Jinak systém identit při pokusu o shodu informací v ověřování cookie s informacemi v databázi způsobí selhání za běhu.

Identity Pokud se schéma liší mezi aplikacemi, obvykle proto, že aplikace používají různé Identity verze, sdílení společné databáze na základě nejnovější verze Identity není možné bez přemapování a přidávání sloupců do schémat jiných aplikacíIdentity. Často je efektivnější upgradovat ostatní aplikace tak, aby používaly nejnovější Identity verzi, aby aplikace mohly sdílet společnou databázi.

Další prostředky