У меня есть приложение Identity server 4 с идентификацией asp .net.У меня есть куки, настроенные на слайд.
services.ConfigureApplicationCookie(opts =>
{
opts.Cookie.Expiration = TimeSpan.FromDays(30);
opts.SessionStore = new RedisCacheTicketStore(new RedisCacheOptions()
{
Configuration = configuration["Redis:HostPort"]
}, logger, configuration);
opts.Cookie.SameSite = SameSiteMode.None;
opts.SlidingExpiration = true;
opts.ExpireTimeSpan = TimeSpan.FromDays(30);
}
);
Не скользит
Локальный хост: Когда пользователь входит в систему .AspNetCore.Idenitty.Application
, он получает время истечения.Когда страница обновляется, срок действия обновляется, я вижу изменение метки времени.
Производство: Однако, если я проверяю это, когда он активен на сервере, пользователь входит в систему, и. AspNetCore.Idenitty.Application
получает время истечения сотметка времени, когда вы вошли в систему. Однако при обновлении страницы отметка времени не изменяется.Он остается таким же, каким был при входе пользователя в систему.
Пользователь выгнал через 30 минут
Производство: Вторая проблема заключается в том, что, как вы видите, срок действия установлен на месяц вперед, но когда на сервере через 30 минут этого пользователя выгонят и заставят снова войти в систему.Я не могу держать пользователя в системе более 30 минут, даже если он активен.
Метка безопасности
Я проверил, что маркер безопасности пользователей не изменился, и токен содержит "AspNet.Identity.SecurityStamp": "[users actual key]"
Обновление
Так что после некоторого раскопок я, наконец, решил перебрать проверку штампов безопасностиЯ сделал это, перебрав следующие методы в моем ApplicationSignInManager
public override async Task<ApplicationUser> ValidateSecurityStampAsync(ClaimsPrincipal principal)
{
if (principal == null)
{
Logger.LogError(LoggingEvents.ApplicationSignInManagerSecurityTokenValidation, "ClaimsPrincipal is null");
return null;
}
var user = await UserManager.GetUserAsync(principal);
if (await ValidateSecurityStampAsync(user, principal.FindFirstValue(Options.ClaimsIdentity.SecurityStampClaimType)))
{
return user;
}
if(user == null)
Logger.LogError(LoggingEvents.ApplicationSignInManagerSecurityTokenValidation, "User not found [principal {principal}]", principal);
var principalSecurityStamp = principal.FindFirstValue(Options.ClaimsIdentity.SecurityStampClaimType); // Security stamp from claims
var userManagerSecurityStamp = user.SecurityStamp; // Security Stamp from usermanager
var getSecurityStampAsyncResults = await UserManager.GetSecurityStampAsync(user); // Security stamp from GetSecurityStampAsync
Logger.LogError(LoggingEvents.ApplicationSignInManagerSecurityTokenValidation,
"Security stamp Validation Failed: [principalSecurityStamp {principalSecurityStamp}] != [getSecurityStampAsyncResults {getSecurityStampAsyncResults}] also ([userManagerSecurityStamp {userManagerSecurityStamp}] )", principalSecurityStamp, getSecurityStampAsyncResults, userManagerSecurityStamp);
return null;
}
public virtual async Task<bool> ValidateSecurityStampAsync(ApplicationUser user, string securityStamp)
=> user != null &&
// Only validate the security stamp if the store supports it
(!UserManager.SupportsUserSecurityStamp || securityStamp == await UserManager.GetSecurityStampAsync(user));
Это привело к тому, что в моем журнале мгновенно появилась очень интересная информация.
Сбой проверки безопасности: [PrincipalSecurityStamp (null)]! = [getSecurityStampAsyncResults 83270b3f-a042-4a8f-b090-f5e1a084074e] также ([userManagerSecurityStamp 83270b3f-a042-4a8f-b090 * * * * * 10 * 10 * 1044) 1074 044 1040 044 040 1074 074 1074 074 074 074 074 074 074 074 074 074 074 074 074 074 424ноль.Почему я не знаюЯ также не знаю, как это исправить, так как есть ряд сторонних приложений, вызывающих этот сервер идентификации.
update2:
Теперь я могу проверить, что GenerateClaimsAsync действительно устанавливает SecurityStampClaim.Однако CookieValidatePrincipalContext в ValidateAsync не содержит рассматриваемое утверждение, что странно, как говорится в комментарии к методу.
/// <param name="context">The context containing the <see cref="System.Security.Claims.ClaimsPrincipal"/>