Совместное использование проверки подлинности cookieмежду приложениями ASP.NET

Автор: Рик Андерсон (Rick Anderson)

Веб-сайты часто состоят из отдельных веб-приложений, работающих вместе. Чтобы обеспечить единый вход, веб-приложения на сайте должны предоставлять общий доступ к проверке подлинности cookie. Для поддержки этого сценария стек защиты данных позволяет совместно использовать проверку подлинности Katana cookie и ASP.NET билеты на проверку подлинности Core cookie .

В следующих примерах:

  • Для имени проверки подлинности cookie задано общее значение .AspNet.SharedCookie.
  • Для AuthenticationType этого задано значение Identity.Application явным образом или по умолчанию.
  • Общее имя SharedCookieAppприложения используется для предоставления системе защиты данных общего доступа к ключам защиты данных.
  • Identity.Application используется в качестве схемы проверки подлинности. Какую бы схему ни использовалось, она должна использоваться последовательно внутри общих приложений либоcookie в качестве схемы по умолчанию, либо путем явной настройки. Схема используется при шифровании и расшифровке cookies, поэтому согласованная схема должна использоваться в приложениях.
  • Используется общее расположение хранилища ключей защиты данных.
    • В приложениях PersistKeysToFileSystem ASP.NET Core используется для задания расположения хранилища ключей.
    • В приложениях Cookie платформа .NET Framework ПО промежуточного DataProtectionProviderслоя проверки подлинности использует реализацию. DataProtectionProvider предоставляет службы защиты данных для шифрования и расшифровки полезных данных проверки подлинности cookie . Экземпляр DataProtectionProvider изолирован от системы защиты данных, используемой другими частями приложения. DataProtectionProvider.Create(System.IO.DirectoryInfo, ActionDataProtectionBuilder<>) принимает DirectoryInfo расположение хранилища ключей защиты данных.
  • DataProtectionProvider требуется пакет NuGet Microsoft.AspNetCore.DataProtection.Extensions :
  • SetApplicationName задает общее имя приложения.

Совместное использование проверки подлинности cookieс помощью ASP.NET Core Identity

При использовании ASP.NET Core Identity:

  • Ключи защиты данных и имя приложения должны быть общими для приложений. Общее расположение хранилища ключей предоставляется методу PersistKeysToFileSystem в следующих примерах. Используется SetApplicationName для настройки общего имени приложения (SharedCookieApp в следующих примерах). Дополнительные сведения см. в статье Настройка защиты данных в ASP.NET Core.
  • ConfigureApplicationCookie Используйте метод расширения для настройки службы защиты данных для cookies.
  • Тип проверки подлинности по умолчанию .Identity.Application

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

Примечание. Приведенные выше инструкции не работают с ITicketStore (CookieAuthenticationOptions.SessionStore). Дополнительные сведения см. здесь на GitHub.

По соображениям безопасности для файлов cookie проверки подлинности не выполняется сжатие в ASP.NET Core. При использовании файлов cookie проверки подлинности разработчики должны максимально сокращать объем включаемых сведений об утверждениях до необходимого только для их нужд.

Совместное использование проверки подлинности cookieбез ASP.NET Core Identity

При использовании cookies напрямую без ASP.NET Core Identityнастройте защиту данных и проверку подлинности. В следующем примере для типа проверки подлинности задано 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();

По соображениям безопасности для файлов cookie проверки подлинности не выполняется сжатие в ASP.NET Core. При использовании файлов cookie проверки подлинности разработчики должны максимально сокращать объем включаемых сведений об утверждениях до необходимого только для их нужд.

Общий доступ cookieмежду различными базовыми путями

Проверка подлинности cookie использует httpRequest.PathBase по умолчаниюCookie. Путь. Если приложение cookie должно быть общим для разных базовых путей, Path необходимо переопределить:

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

Совместное использование cookieмежду поддоменами

При размещении приложений, которые совместно используются cookieв поддоменах, укажите общий домен в Cookie. Свойство домена . Чтобы предоставить общий доступ cookieк приложениям в таких приложениях contoso.com, как first_subdomain.contoso.com и second_subdomain.contoso.com, укажите следующие Cookie.Domain.contoso.comзначения:

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

Шифрование неактивных ключей защиты данных

Для рабочих развертываний настройте DataProtectionProvider неактивных ключей с помощью DPAPI или X509Certificate. Дополнительные сведения см. в статье о шифровании ключей в Windows и Azure с помощью ASP.NET Core. В следующем примере отпечаток ProtectKeysWithCertificateсертификата предоставляется в следующих случаях:

using Microsoft.AspNetCore.DataProtection;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();

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

Использование общей пользовательской базы данных

Если приложения используют одну и ту же схему (ту же Identity версию Identity), убедитесь, что Identity система для каждого приложения указывает на одну и ту же пользовательская база данных. В противном случае система удостоверений создает сбои во время выполнения при попытке сопоставить сведения в проверке подлинности cookie с информацией в базе данных.

Identity Если схема отличается от приложений, обычно так как приложения используют разные Identity версии, совместное использование общей базы данных на основе последней версии Identity невозможно без повторного сопоставления и добавления столбцов в схемы других приложенийIdentity. Часто более эффективно обновить другие приложения, чтобы использовать последнюю Identity версию, чтобы общая база данных была предоставлена приложениям.

Изменение имени приложения

В .NET 6 WebApplicationBuilder нормализует корневой путь содержимого, чтобы завершиться с DirectorySeparatorCharпомощью . Большинство приложений, перенесенных из HostBuilder или WebHostBuilder не имеющих того же имени приложения, так как они не нормализованы. Дополнительные сведения см. в разделе SetApplicationName

Совместное использование проверки подлинности cookieмежду приложениями ASP.NET 4.x и ASP.NET Core

ASP.NET приложения 4.x, использующие ПО промежуточного слоя проверки подлинности Microsoft.Owin Cookie , можно настроить для создания проверки подлинности, совместимой с ПО промежуточного слоя проверки подлинности cookieASP.NET Core Cookie . Это может быть полезно, если веб-приложение состоит из приложений ASP.NET 4.x и приложений ASP.NET Core, которые должны совместно использовать единый вход. Конкретный пример такого сценария заключается в добавочном переносе веб-приложения из ASP.NET в ASP.NET Core. В таких сценариях обычно для некоторых частей приложения, обслуживаемых исходным приложением ASP.NET, а другие — новым приложением ASP.NET Core. Однако пользователям необходимо выполнить вход только один раз. Это можно сделать с помощью любого из следующих подходов:

  • Использование функции удаленной проверки подлинности system.Web adapters, которая использует приложение ASP.NET для входа пользователей.
  • Настройка приложения ASP.NET для использования ПО промежуточного слоя проверки подлинности Microsoft.Owin Cookie , чтобы проверка подлинности cookieбыла предоставлена приложению ASP.NET Core.

Чтобы настроить ASP.NET ПО промежуточного слоя проверки подлинности Microsoft.Owin Cookie для совместного использования cookieс приложением ASP.NET Core, следуйте приведенным выше инструкциям, чтобы настроить приложение ASP.NET Core для использования определенного cookie имени, имени приложения и сохранения ключей защиты данных в известном расположении. Дополнительные сведения о сохранении ключей защиты данных см. в разделе "Настройка ASP.NET Core Data Protection ".

В приложении ASP.NET установите Microsoft.Owin.Security.Interop пакет.

UseCookieAuthentication Обновите вызов в Startup.Auth.cs, чтобы настроить AspNetTicketDataFormat для соответствия параметрам приложения 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()
});

Важные элементы, настроенные здесь, включают:

  • Для cookie имени задано то же имя, что и в приложении ASP.NET Core.
  • Поставщик защиты данных создается с помощью того же пути к кругу ключей. Обратите внимание, что в этих примерах ключи защиты данных хранятся на диске, но могут использоваться другие поставщики защиты данных. Например, Redis или Хранилище BLOB-объектов Azure можно использовать для поставщиков защиты данных до тех пор, пока конфигурация совпадает между приложениями. Дополнительные сведения о сохранении ключей защиты данных см. в разделе "Настройка ASP.NET Core Data Protection ".
  • Имя приложения должно совпадать с именем приложения, используемым в приложении ASP.NET Core.
  • Тип проверки подлинности имеет имя схемы проверки подлинности в приложении ASP.NET Core.
  • System.Web.Helpers.AntiForgeryConfig.UniqueClaimTypeIdentifier имеет значение утверждения из удостоверения ASP.NET Core, которое будет уникальным для пользователя.

Так как тип проверки подлинности был изменен на соответствие схеме проверки подлинности приложения ASP.NET Core, также необходимо обновить способ создания ASP.NET новых удостоверений для использования этого же имени. Обычно это делается в 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;
    }
}

В этих изменениях приложения ASP.NET и ASP.NET Core могут использовать те же проверки подлинности cookie, чтобы пользователи входить в одно или из одного приложения отражаются в другом приложении.

Обратите внимание, что поскольку существуют различия между ASP.NET и схемами базы данных ASP.NET Identity Core Identity, рекомендуется только для входа пользователей с помощью одного из приложений — ASP.NET или ASP.NET Core. После входа в систему пользователи, описанные в этом разделе, позволят использовать проверку подлинности cookieв любом приложении, а оба приложения смогут выйти из системы.

Дополнительные ресурсы

В следующих примерах:

  • Для имени проверки подлинности cookie задано общее значение .AspNet.SharedCookie.
  • Для AuthenticationType этого задано значение Identity.Application явным образом или по умолчанию.
  • Общее имя приложения используется для предоставления системе защиты данных общего доступа к ключам защиты данных (SharedCookieApp).
  • Identity.Application используется в качестве схемы проверки подлинности. Какую бы схему ни использовалось, она должна использоваться последовательно внутри общих приложений либоcookie в качестве схемы по умолчанию, либо путем явной настройки. Схема используется при шифровании и расшифровке cookies, поэтому согласованная схема должна использоваться в приложениях.
  • Используется общее расположение хранилища ключей защиты данных.
    • В приложениях PersistKeysToFileSystem ASP.NET Core используется для задания расположения хранилища ключей.
    • В приложениях Cookie платформа .NET Framework ПО промежуточного DataProtectionProviderслоя проверки подлинности использует реализацию. DataProtectionProvider предоставляет службы защиты данных для шифрования и расшифровки полезных данных проверки подлинности cookie . Экземпляр DataProtectionProvider изолирован от системы защиты данных, используемой другими частями приложения. DataProtectionProvider.Create(System.IO.DirectoryInfo, ActionDataProtectionBuilder<>) принимает DirectoryInfo расположение хранилища ключей защиты данных.
  • DataProtectionProvider требуется пакет NuGet Microsoft.AspNetCore.DataProtection.Extensions :
  • SetApplicationName задает общее имя приложения.

Совместное использование проверки подлинности cookieс помощью ASP.NET Core Identity

При использовании ASP.NET Core Identity:

  • Ключи защиты данных и имя приложения должны быть общими для приложений. Общее расположение хранилища ключей предоставляется методу PersistKeysToFileSystem в следующих примерах. Используется SetApplicationName для настройки общего имени приложения (SharedCookieApp в следующих примерах). Дополнительные сведения см. в статье Настройка защиты данных в ASP.NET Core.
  • ConfigureApplicationCookie Используйте метод расширения для настройки службы защиты данных для cookies.
  • Тип проверки подлинности по умолчанию .Identity.Application

В Startup.ConfigureServices:

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

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

Примечание. Приведенные выше инструкции не работают с ITicketStore (CookieAuthenticationOptions.SessionStore). Дополнительные сведения см. здесь на GitHub.

По соображениям безопасности для файлов cookie проверки подлинности не выполняется сжатие в ASP.NET Core. При использовании файлов cookie проверки подлинности разработчики должны максимально сокращать объем включаемых сведений об утверждениях до необходимого только для их нужд.

Совместное использование проверки подлинности cookieбез ASP.NET Core Identity

При использовании cookies напрямую без ASP.NET Core Identityнастройте защиту данных и проверку подлинности.Startup.ConfigureServices В следующем примере для типа проверки подлинности задано 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";
    });

По соображениям безопасности для файлов cookie проверки подлинности не выполняется сжатие в ASP.NET Core. При использовании файлов cookie проверки подлинности разработчики должны максимально сокращать объем включаемых сведений об утверждениях до необходимого только для их нужд.

Общий доступ cookieмежду различными базовыми путями

Проверка подлинности cookie использует httpRequest.PathBase по умолчаниюCookie. Путь. Если приложение cookie должно быть общим для разных базовых путей, Path необходимо переопределить:

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

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

Совместное использование cookieмежду поддоменами

При размещении приложений, которые совместно используются cookieв поддоменах, укажите общий домен в Cookie. Свойство домена . Чтобы предоставить общий доступ cookieк приложениям в таких приложениях contoso.com, как first_subdomain.contoso.com и second_subdomain.contoso.com, укажите следующие Cookie.Domain.contoso.comзначения:

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

Шифрование неактивных ключей защиты данных

Для рабочих развертываний настройте DataProtectionProvider неактивных ключей с помощью DPAPI или X509Certificate. Дополнительные сведения см. в статье о шифровании ключей в Windows и Azure с помощью ASP.NET Core. В следующем примере отпечаток ProtectKeysWithCertificateсертификата предоставляется в следующих случаях:

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

Совместное использование проверки подлинности cookieмежду приложениями ASP.NET 4.x и ASP.NET Core

ASP.NET приложения 4.x, использующие ПО промежуточного слоя проверки подлинности Katana Cookie , можно настроить для создания проверки подлинности cookie, совместимой с по промежуточному поверку ASP.NET Core Cookie Authentication. Дополнительные сведения см. в разделе "Общий доступ к проверке подлинности cookie" между ASP.NET 4.x и ASP.NET приложениями Core (dotnet/AspNetCore.Docs #21987).

Использование общей пользовательской базы данных

Если приложения используют одну и ту же схему (ту же Identity версию Identity), убедитесь, что Identity система для каждого приложения указывает на одну и ту же пользовательская база данных. В противном случае система удостоверений создает сбои во время выполнения при попытке сопоставить сведения в проверке подлинности cookie с информацией в базе данных.

Identity Если схема отличается от приложений, обычно так как приложения используют разные Identity версии, совместное использование общей базы данных на основе последней версии Identity невозможно без повторного сопоставления и добавления столбцов в схемы других приложенийIdentity. Часто более эффективно обновить другие приложения, чтобы использовать последнюю Identity версию, чтобы общая база данных была предоставлена приложениям.

Дополнительные ресурсы