Сookie идентификации ASP.NET в субдоменах .Net и Core
Веб-сайты обычно состоят из множества отдельных веб-приложений, гармонично работающих вместе. Если разработчик приложения хочет обеспечить хороший опыт единой регистрации, ему потребуется, чтобы все различные веб-приложения на сайте обменивались друг с другом тикетами проверки подлинности.
Для поддержки этого сценария стек защиты данных позволяет совместно использовать тикеты проверки подлинности файлов 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
Только полноправные пользователи могут оставлять комментарии. Аутентифицируйтесь пожалуйста, используя сервисы.