Время сеанса истекает до того, как cookie CookieAuthentication делает это, пытаясь смоделировать функциональность "Запомнить меня" при аутентификации на основе удаленного API на основе JWT.
Грубый обзор
Приложение № 1 - .Net Core 2.0.8 - с использованием токенов Identity и JWT (угловое приложение с .net core и ef core API)
Приложение № 2 - .Net Core 2.1.1 - использование схемы CookieAuthentication для входа в систему клиентов, вызов API App #1
для аутентификации / проверки учетных данных. Токен извлекается и сохраняется для будущих вызовов API (для получения дополнительной информации о пользователе, для обновления информации о пользователе и т. Д.)
Код в Приложении № 1 работает нормально, и срок действия токена / обновления токена работает, как и ожидалось (проверено независимо с помощью Postman) - я добавил параметр для отправки с вызовом аутентификации, чтобы установить срок действия токена, поэтому я могу его установить например, до 5 минут или 30 дней.
В приложении № 2 у меня при запуске:
services.AddDistributedRedisCache(options =>
{
options.Configuration = "host:port";
});
var redis = ConnectionMultiplexer.Connect("host:port");
services
.AddDataProtection()
.PersistKeysToRedis(redis, $"{appSettings.RedisInstanceName}-DataProtection-Keys")
.SetDefaultKeyLifetime(TimeSpan.FromDays(30))
services.AddSession(opts =>
{
opts.Cookie.HttpOnly = true;
opts.Cookie.Name = ".session";
opts.IdleTimeout = exp;
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(opts =>
{
opts.Cookie.HttpOnly = true;
opts.Cookie.Name = ".session.auth";
});
В приведенном выше примере exp установлен на 240 минут, то есть 4 часа - в качестве теста.
Когда происходит вход в систему, я делаю:
- Вызовите удаленный API с именем пользователя / паролем для аутентификации, в случае успеха получите токен доступа
- Сохранение токена доступа в локальном сеансе вместе с базовой идентификационной информацией пользователя (имя, фамилия, электронная почта, идентификатор пользователя)
вызовите идентификатор входа в систему, чтобы установить статус аутентификации, чтобы я мог использовать [Авторизовать] без контроллеров / действий.
var authProperties = new AuthenticationProperties
{
AllowRefresh = true,
ExpiresUtc = exp,
IsPersistent = rememberMe,
IssuedUtc = DateTimeOffset.UtcNow,
RedirectUri = null
};
await _httpContextAccessor.HttpContext.SignInAsync(
CookieAuthenticationDefaults.AuthenticationScheme,
new ClaimsPrincipal(claimsIdentity),
authProperties
);
(опыт такой же, как указано выше, 240 минут)
Таким образом, предполагаемая функциональность здесь - если true, если "RememberMe" - истина, cookie и сеанс работают до 4 часов простоя. В реальном мире это, вероятно, будет длительный период, то есть 30 дней. Если «RememberMe» имеет значение false, оно должно длиться в течение сеанса только с IdleTimeout по умолчанию 20 минут или что-то еще.
Вопрос в том, как настроить файл cookie проверки подлинности в соответствии с обычным файлом cookie приложения, который управляет содержимым, сохраненным в сеансе? т.е. _httpContextAccessor.HttpContext.Session.Get<T>("key");
Что происходит сейчас, истекает сеанс приложения, но аутентификация - нет, но с сохраненным в сеансе токеном доступа удаленного API он теряется, поэтому я не могу обновить эту информацию и не могу делать дальше Вызовы API. ИЛИ, как мне сохранить информацию в аутентифицированном сеансе?
Это плохой способ / что было бы лучше для этого варианта использования API?