Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Webbplatser består ofta av enskilda webbappar som arbetar tillsammans. För att tillhandahålla en enkel inloggning (SSO) måste webbappar på en webbplats dela autentiseringscookies. För att stödja det här scenariot tillåter dataskyddsstacken delning av Katana-autentisering cookie och ASP.NET Core-autentiseringsbiljetter cookie .
I exemplen som följer:
- Autentiseringsnamnet cookie är inställt på ett gemensamt värde för .AspNet.SharedCookie.
- 
              AuthenticationTypeär inställt påIdentity.Application, antingen uttryckligen eller som standard.
- Ett vanligt appnamn, SharedCookieApp, används för att göra det möjligt för dataskyddssystemet att dela dataskyddsnycklar.
- 
              Identity.Applicationanvänds som autentiseringsschema. Oavsett vilket schema som används måste det användas konsekvent i och mellan delade cookie appar, antingen som standardschema eller genom att uttryckligen ange det. Schemat används vid kryptering och dekryptering av cookies, så ett konsekvent schema måste användas mellan appar.
- En gemensam lagringsplats för dataskyddsnycklar används.
- I ASP.NET Core-appar PersistKeysToFileSystem används för att ange platsen för nyckellagring.
- I .NET Framework-appar Cookie använder autentiseringsmellanprogram en implementering av DataProtectionProvider. 
              DataProtectionProvidertillhandahåller dataskyddstjänster för kryptering och dekryptering av nyttolastdata för autentisering cookie. InstansenDataProtectionProviderär isolerad från dataskyddssystemet som används av andra delar av appen. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>) accepterar en DirectoryInfo för att ange platsen för lagring av dataskyddsnycklar.
 
- 
              DataProtectionProviderkräver NuGet-paketet Microsoft.AspNetCore.DataProtection.Extensions :- I .NET Framework-appar lägger du till en paketreferens till Microsoft.AspNetCore.DataProtection.Extensions.
 
- SetApplicationName anger det gemensamma appnamnet.
Dela cookies för autentisering med ASP.NET Core Identity
När du använder ASP.NET Core Identity:
- Dataskyddsnycklar och appnamnet måste delas mellan appar. En gemensam nyckellagringsplats tillhandahålls till PersistKeysToFileSystem metoden i följande exempel. Använd SetApplicationName för att konfigurera ett gemensamt namn på delad app (SharedCookieAppi följande exempel). Mer information finns i Konfigurera ASP.NET Core Data Protection.
- ConfigureApplicationCookie Använd tilläggsmetoden för att konfigurera dataskyddstjänsten för cookies.
- Standardautentiseringstypen är Identity.Application.
I 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();
              Observera: De föregående instruktionerna fungerar inte med ITicketStore (CookieAuthenticationOptions.SessionStore).  Mer information finns i det här GitHub-problemet.
Av säkerhetsskäl komprimeras inte autentiseringscookies i ASP.NET Core. När du använder cookies för autentisering bör utvecklare minimera antalet anspråk genom att inkludera endast den information om anspråk som är nödvändig för deras behov.
Dela autentiseringscookies utan ASP.NET Core Identity
När du använder cookies direkt utan ASP.NET Core Identitykonfigurerar du dataskydd och autentisering. I följande exempel är autentiseringstypen inställd på 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();
Av säkerhetsskäl komprimeras inte autentiseringscookies i ASP.NET Core. När du använder cookies för autentisering bör utvecklare minimera antalet anspråk genom att inkludera endast den information om anspråk som är nödvändig för deras behov.
Dela cookies mellan olika basvägar
Autentisering cookie använder HttpRequest.PathBase som standardinställning för Cookie.Path. Om appens cookie ska delas över olika bassökvägar, Path måste åsidosättas.
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();
Dela cookies mellan underdomäner
När du är värd för appar som delar cookies mellan underdomäner anger du en gemensam domän i Cookie. Domänegenskap . Om du vill dela cookies mellan appar på contoso.com, till exempel first_subdomain.contoso.com och second_subdomain.contoso.com, anger du Cookie.Domain som .contoso.com:
options.Cookie.Domain = ".contoso.com";
Kryptera vilande dataskyddsnycklar
För produktionsdistributioner konfigurerar du DataProtectionProvider för att kryptera nycklar i vila med DPAPI eller en X509Certificate. Mer information finns i Nyckelkryptering i vila i Windows och Azure med hjälp av ASP.NET Core. I följande exempel tillhandahålls ett tumavtryck för certifikatet till ProtectKeysWithCertificate:
using Microsoft.AspNetCore.DataProtection;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
Använda en gemensam användardatabas
När appar använder samma Identity schema (samma version av Identity) kontrollerar du att Identity systemet för varje app pekar på samma användardatabas. Annars uppstår fel under körningstid när identitetssystemet försöker matcha informationen i autentiseringen cookie mot informationen i databasen.
Identity När schemat skiljer sig mellan appar, vanligtvis eftersom appar använder olika Identity versioner, går det inte att dela en gemensam databas baserat på den senaste versionen av Identity utan att mappa om och lägga till kolumner i andra appars Identity scheman. Det är ofta mer effektivt att uppgradera de andra apparna så att de använder den senaste Identity versionen så att en gemensam databas kan delas av apparna.
Ändring av programnamn
I .NET 6 WebApplicationBuilder normaliserar du innehållsrotsökvägen så att den slutar med en DirectorySeparatorChar. De flesta appar som migreras från HostBuilder eller WebHostBuilder har inte samma appnamn eftersom de inte är normaliserade. Mer information finns i SetApplicationName
Dela autentiseringscookies mellan ASP.NET 4.x och ASP.NET Core-appar
ASP.NET 4.x-appar som använder Microsoft.Owin Cookie Authentication Middleware kan konfigureras för att generera autentiseringscookies som är kompatibla med ASP.NET Core Cookie Authentication Middleware. Detta kan vara användbart om ett webbprogram består av både ASP.NET 4.x-appar och ASP.NET Core-appar som måste dela en enkel inloggningsupplevelse. Ett specifikt exempel på ett sådant scenario är att stegvis migrera en webbapp från ASP.NET till ASP.NET Core. I sådana scenarier är det vanligt att vissa delar av en app hanteras av den ursprungliga ASP.NET-appen medan andra hanteras av den nya ASP.NET Core-appen. Användare bör dock bara behöva logga in en gång. Detta kan åstadkommas med någon av följande metoder:
- Använd System.Web-adaptrarnas funktion för fjärrinloggning, som använder ASP.NET-appen för att logga in användare.
- Konfigurera ASP.NET-appen så att den använder Microsoft.Owin Cookie Authentication Middleware så att autentiseringscookies delas med ASP.NET Core-appen.
Om du vill konfigurera ASP.NET Microsoft.Owin Cookie Authentication Middleware att dela cookies med en ASP.NET Core-app följer du de föregående anvisningarna för att konfigurera ASP.NET Core-appen så att den använder ett specifikt cookie namn, ett appnamn och bevarar dataskyddsnycklar till en välkänd plats. Mer information om hur du bevarar dataskyddsnycklar finns i Konfigurera ASP.NET Core Data Protection .
Installera paketet i ASP.NET-appen Microsoft.Owin.Security.Interop .
Uppdatera anropet UseCookieAuthentication i Startup.Auth.cs för att konfigurera ett AspNetTicketDataFormat så att det matchar inställningarna för ASP.NET Core-appen:
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()
});
Viktiga objekt som konfigurerats här är:
- Namnet cookie är inställt på samma namn som i ASP.NET Core-appen.
- En dataskyddsleverantör skapas med samma nyckelringsökväg. Observera att i de här exemplen lagras dataskyddsnycklar på disken, men andra dataskyddsleverantörer kan användas. Till exempel kan Redis eller Azure Blob Storage användas för dataskyddsleverantörer så länge konfigurationen matchar mellan apparna. Mer information om hur du bevarar dataskyddsnycklar finns i Konfigurera ASP.NET Core Data Protection .
- Appnamnet är inställt på samma som appnamnet som används i ASP.NET Core-appen.
- Autentiseringstypen är inställd på namnet på autentiseringsschemat i ASP.NET Core-appen.
- 
              System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifierär inställd på ett anspråk från ASP.NET Core-identiteten som är unikt för en användare.
Eftersom autentiseringstypen har ändrats så att den matchar autentiseringsschemat för ASP.NET Core-appen är det också nödvändigt att uppdatera hur ASP.NET-appen genererar nya identiteter för att använda samma namn. Detta görs vanligtvis i 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;
    }
}
Med dessa ändringar kan ASP.NET och ASP.NET Core-appar använda samma autentiseringscookies så att användare som loggar in eller ut från en app återspeglas i den andra appen.
Observera att eftersom det finns skillnader mellan ASP.NET Identity och ASP.NET Core-databasscheman Identityrekommenderar vi att användarna bara loggar in med någon av apparna – antingen ASP.NET- eller ASP.NET Core-appen . När användarna har loggat in gör de steg som beskrivs i det här avsnittet att autentiseringen cookiekan användas av någon av apparna och båda apparna ska kunna logga ut användare.
Ytterligare resurser
I exemplen som följer:
- Autentiseringsnamnet cookie är inställt på ett gemensamt värde för .AspNet.SharedCookie.
- 
              AuthenticationTypeär inställt påIdentity.Application, antingen uttryckligen eller som standard.
- Ett vanligt appnamn används för att göra det möjligt för dataskyddssystemet att dela dataskyddsnycklar (SharedCookieApp).
- 
              Identity.Applicationanvänds som autentiseringsschema. Oavsett vilket schema som används måste det användas konsekvent i och mellan delade cookie appar, antingen som standardschema eller genom att uttryckligen ange det. Schemat används vid kryptering och dekryptering av cookies, så ett konsekvent schema måste användas mellan appar.
- En gemensam lagringsplats för dataskyddsnycklar används.
- I ASP.NET Core-appar PersistKeysToFileSystem används för att ange platsen för nyckellagring.
- I .NET Framework-appar Cookie använder autentiseringsmellanprogram en implementering av DataProtectionProvider. 
              DataProtectionProvidertillhandahåller dataskyddstjänster för kryptering och dekryptering av nyttolastdata för autentisering cookie. InstansenDataProtectionProviderär isolerad från dataskyddssystemet som används av andra delar av appen. DataProtectionProvider.Create(System.IO.DirectoryInfo, Action<IDataProtectionBuilder>) accepterar en DirectoryInfo för att ange platsen för lagring av dataskyddsnycklar.
 
- 
              DataProtectionProviderkräver NuGet-paketet Microsoft.AspNetCore.DataProtection.Extensions :- I ASP.NET Core 2.x-appar refererar du till Microsoft.AspNetCore.App metapackage.
- I .NET Framework-appar lägger du till en paketreferens till Microsoft.AspNetCore.DataProtection.Extensions.
 
- SetApplicationName anger det gemensamma appnamnet.
Dela cookies för autentisering med ASP.NET Core Identity
När du använder ASP.NET Core Identity:
- Dataskyddsnycklar och appnamnet måste delas mellan appar. En gemensam nyckellagringsplats tillhandahålls till PersistKeysToFileSystem metoden i följande exempel. Använd SetApplicationName för att konfigurera ett gemensamt namn på delad app (SharedCookieAppi följande exempel). Mer information finns i Konfigurera ASP.NET Core Data Protection.
- ConfigureApplicationCookie Använd tilläggsmetoden för att konfigurera dataskyddstjänsten för cookies.
- Standardautentiseringstypen är Identity.Application.
I Startup.ConfigureServices:
services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
});
              Observera: De föregående instruktionerna fungerar inte med ITicketStore (CookieAuthenticationOptions.SessionStore).  Mer information finns i det här GitHub-problemet.
Av säkerhetsskäl komprimeras inte autentiseringscookies i ASP.NET Core. När du använder cookies för autentisering bör utvecklare minimera antalet anspråk genom att inkludera endast den information om anspråk som är nödvändig för deras behov.
Dela autentiseringscookies utan ASP.NET Core Identity
När du använder cookies direkt utan ASP.NET Core Identitykonfigurerar du dataskydd och autentisering i Startup.ConfigureServices. I följande exempel är autentiseringstypen inställd på 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";
    });
Av säkerhetsskäl komprimeras inte autentiseringscookies i ASP.NET Core. När du använder cookies för autentisering bör utvecklare minimera antalet anspråk genom att inkludera endast den information om anspråk som är nödvändig för deras behov.
Dela cookies mellan olika basvägar
Autentisering cookie använder HttpRequest.PathBase som standardinställning för Cookie.Path. Om appens cookie ska delas över olika bassökvägar, Path måste åsidosättas.
services.AddDataProtection()
    .PersistKeysToFileSystem("{PATH TO COMMON KEY RING FOLDER}")
    .SetApplicationName("SharedCookieApp");
services.ConfigureApplicationCookie(options => {
    options.Cookie.Name = ".AspNet.SharedCookie";
    options.Cookie.Path = "/";
});
Dela cookies mellan underdomäner
När du är värd för appar som delar cookies mellan underdomäner anger du en gemensam domän i Cookie. Domänegenskap . Om du vill dela cookies mellan appar på contoso.com, till exempel first_subdomain.contoso.com och second_subdomain.contoso.com, anger du Cookie.Domain som .contoso.com:
options.Cookie.Domain = ".contoso.com";
Kryptera vilande dataskyddsnycklar
För produktionsdistributioner konfigurerar du DataProtectionProvider för att kryptera nycklar i vila med DPAPI eller en X509Certificate. Mer information finns i Nyckelkryptering i vila i Windows och Azure med hjälp av ASP.NET Core. I följande exempel tillhandahålls ett tumavtryck för certifikatet till ProtectKeysWithCertificate:
services.AddDataProtection()
    .ProtectKeysWithCertificate("{CERTIFICATE THUMBPRINT}");
Dela autentiseringscookies mellan ASP.NET 4.x och ASP.NET Core-appar
ASP.NET 4.x-appar som använder Katana Cookie Authentication Middleware kan konfigureras för att generera autentiseringscookies som är kompatibla med ASP.NET Core Cookie Authentication Middleware. Mer information finns i Dela autentiseringscookies mellan ASP.NET 4.x och ASP.NET Core-appar (dotnet/AspNetCore.Docs #21987).
Använda en gemensam användardatabas
När appar använder samma Identity schema (samma version av Identity) kontrollerar du att Identity systemet för varje app pekar på samma användardatabas. Annars uppstår fel under körningstid när identitetssystemet försöker matcha informationen i autentiseringen cookie mot informationen i databasen.
Identity När schemat skiljer sig mellan appar, vanligtvis eftersom appar använder olika Identity versioner, går det inte att dela en gemensam databas baserat på den senaste versionen av Identity utan att mappa om och lägga till kolumner i andra appars Identity scheman. Det är ofta mer effektivt att uppgradera de andra apparna så att de använder den senaste Identity versionen så att en gemensam databas kan delas av apparna.
Ytterligare resurser
ASP.NET Core