Сookie идентификации ASP.NET в субдоменах .Net и Core

  • 15 мин. на прочтение
  • 63
  • 05 Mar 2023
  • 05 Mar 2023

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

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

Совместное использование файлов cookie аутентификации между приложениями

Настройка на сайте авторизации

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

Добавьте аутентификацию в свое приложение

// Аутентификация 
builder.Services.AddAuthentication(options =>
{
   options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
   options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
   .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
   {
       options.Cookie.Name = "token";
       if (!builder.Environment.IsDevelopment())
           options.Cookie.Domain = ".subbnet.ru";
       
       options.Cookie.HttpOnly = false;
       options.ExpireTimeSpan = TimeSpan.FromDays(365);
       options.SlidingExpiration = true;
       options.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
       options.LoginPath = new Microsoft.AspNetCore.Http.PathString("/login");
       options.LogoutPath = new Microsoft.AspNetCore.Http.PathString("/logout");
       options.AccessDeniedPath = new Microsoft.AspNetCore.Http.PathString("/unauthorized");
   })

и в настройках приложения

// Аутентификация 
app.UseAuthentication();

В методе configure зададим настройки службы защиты данных для файлов cookie.

Можно с сохранением файла ключа на диске

builder.Services.AddDataProtection()
   .SetApplicationName("subbnet.ru")
   .PersistKeysToFileSystem(new DirectoryInfo(@"key"))
   .SetDefaultKeyLifetime(TimeSpan.FromDays(365));

или в БД

builder.Services.AddDataProtection()
   .SetApplicationName("subbnet.ru")
   .PersistKeysToDbContext()
   .SetDefaultKeyLifetime(TimeSpan.FromDays(365));

Настройку с сохранением ключа в БД рассмотрим в ближайшее время.

Настройка на сайтах субдоменах

Настройка в секции ConfigureServices
 

            services.AddDataProtection()
               .SetApplicationName("subbnet.ru")
               .PersistKeysToFileSystem(new DirectoryInfo(@"key"))
               .SetDefaultKeyLifetime(TimeSpan.FromDays(365));
           services.AddAuthentication(options =>
           {
               options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
               options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
           })
           .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
           {
               options.Cookie.Name = "token";
               options.Cookie.Domain = ".subbnet.ru";
               options.Cookie.HttpOnly = false;
               options.ExpireTimeSpan = TimeSpan.FromDays(365);
               options.SlidingExpiration = true;
               options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
           });

Настройка в секции Configure

            // Аутентификация 
           app.UseAuthentication();

 

Проверка

Запускаем оба приложения.

Переписать папку с ключом с сайта аутентификации на сайт субдомена

 

Заходим на сайт аутентификации.

Проходим аутентификацию и видим, что создался файл cookie для субдоменов

Идем на сайт api.subbnet.ru и видим, что файл cookie здесь уже присутствует.

На тестовую страницу отображения добавляем 

@User.Identity.Name

Переходим та страницу и видим, что мы аутентифицированы на сайте субдомена пользователем сайта аутентификации.

Можем получать Claims, которые задавали на сервере аутентификации при создании Сookie 

@User.Claims.SingleOrDefault(c => c.Type == "id")?.Value
@User.Identity.AuthenticationType