Поделиться через


Предоставление общего доступа к файлам cookie проверки подлинности среди приложений ASP.NET

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

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

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

  • Для имени проверки подлинности cookie задано общее значение .AspNet.SharedCookie.
  • Для AuthenticationType этого задано значение Identity.Application явным образом или по умолчанию.
  • Общее имя SharedCookieAppприложения используется для предоставления системе защиты данных общего доступа к ключам защиты данных.
  • Identity.Application используется в качестве схемы проверки подлинности. Какую бы схему ни использовалось, она должна использоваться последовательно внутри общих приложений либо cookie в качестве схемы по умолчанию, либо путем явной настройки. Схема используется при шифровании и расшифровке файлов cookie, поэтому согласованная схема должна использоваться в приложениях.
  • Используется общее расположение хранилища ключей защиты данных.
    • В приложениях 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 Используйте метод расширения для настройки службы защиты данных для файлов cookie.
  • Тип проверки подлинности по умолчанию .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

При использовании файлов cookie непосредственно без 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";

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

Для рабочих развертываний настройте DataProtectionProvider шифрование ключей rest с помощью DPAPI или X509Certificate. Дополнительные сведения см. в разделе "Шифрование rest ключей" в 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 система для каждого приложения указывает на одну и ту же пользовательская база данных. 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 , можно настроить для создания файлов cookie проверки подлинности, совместимых с по промежуточному поверку ASP.NET Core Cookie Authentication. Это может быть полезно, если веб-приложение состоит из приложений 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 identity , которое будет уникальным для пользователя.

Так как тип проверки подлинности был изменен на соответствие схеме проверки подлинности приложения 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 в качестве схемы по умолчанию, либо путем явной настройки. Схема используется при шифровании и расшифровке файлов cookie, поэтому согласованная схема должна использоваться в приложениях.
  • Используется общее расположение хранилища ключей защиты данных.
    • В приложениях 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 Используйте метод расширения для настройки службы защиты данных для файлов cookie.
  • Тип проверки подлинности по умолчанию .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

При использовании файлов cookie непосредственно без 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";

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

Для рабочих развертываний настройте DataProtectionProvider шифрование ключей rest с помощью DPAPI или X509Certificate. Дополнительные сведения см. в разделе "Шифрование rest ключей" в 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 . Дополнительные сведения см. в разделе "Общие файлы cookie проверки подлинности" между ASP.NET 4.x и ASP.NET приложениями Core (dotnet/AspNetCore.Docs #21987).

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

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

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

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