Мне вручили требование принудительной повторной авторизации пользователя, когда начинается новый месяц (у нас есть модель месячной подписки). Чтобы реализовать это и НЕ влиять на других поставщиков аутентификации, используемых в нашем приложении, я изменил входящий вызов следующим образом:
До:
await HttpContext.SignInAsync(authorizationProvider.GetClaimsPrincipal());
После:
await HttpContext.SignInAsync(authorizationProvider.GetClaimsPrincipal(), authorizationProvider.GetAutheticationProperties());
public AuthenticationProperties GetAutheticationProperties() =>
new AuthenticationProperties
{
ExpiresUtc = DateTimeOffset.UtcNow.AddMinutes(1),
IsPersistent = true,
AllowRefresh = false
};
Обратите внимание, что в будущем для целей тестирования ExpiresUtc
будет установлен на 1 мин; он будет вычислен до конца месяца, как только реализация сработает.
Я ожидал, что наша личность (расширяющая ClaimsIdentity
) получит свое свойство IsAuthorized
false после того, как будет достигнут ExpiresUtc
, но это не так. Чтение ClaimsIdentity.IsAuthenticated говорит о том, что
true, если идентификация была аутентифицирована; иначе ложно. Примечания: true, если свойство AuthenticationType не равно null или не является пустой строкой.
Теперь я в замешательстве. Что мне ожидать после истечения срока действия? Соответственно, как удостоверение становится IsAuthenticated == false
?
В настоящее время мы используем asp. net ядро 2.2 и в процессе перехода на 3.
Аутентификация регистрируется как это при запуске приложения (Startup.cs
):
var expirationInMinutes = Convert.ToInt32(Configuration["Authentication:ExpirationInMinutes"]);
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
// Configure cookie authentication
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, o =>
{
o.LoginPath = new PathString("/Account/LogOn");
o.LogoutPath = new PathString("/Account/LogOut");
o.AccessDeniedPath = new PathString("/Account/AccessDenied");
o.SlidingExpiration = true;
o.ExpireTimeSpan = TimeSpan.FromMinutes(expirationInMinutes);
o.Cookie.Expiration = TimeSpan.FromMinutes(expirationInMinutes);
o.EventsType = typeof(CustomCookieAuthenticationEvents);
// Used because of safari
o.CookieManager = new ChunkingCookieManager()
{
ChunkSize = 2048,
ThrowForPartialCookies = true
};
});