Файл cookie IdentityServer Session не скользит

Я столкнулся со странной проблемой. Я могу выполнить обновление без вывода сообщений, но мой файл cookie IdP становится скользящим. Больше в проблеме...

У меня есть время жизни cookie сеанса IdP (IdentityServer), истекающее через 15 минут, и я сохранил одно и то же время для маркера доступа и токена id.

На моем клиенте JavaScript я проверяю активность пользователя каждые 2 минуты, и если в течение последних 2 минут активность была, я обновляю токен.

Я могу получить токен доступа и токен идентификатора с обновленным временем истечения, но через 15 минут (время жизни cookie IdP) неактивные вызовы возобновления завершаются неудачно, и IdP выходит из системы.
Я проверил ответ молчаливого возобновления вызова, и я не вижу, чтобы в заголовках ответа были установлены файлы cookie (с новым временем истечения срока действия).

Есть ли какие-либо настройки, которые я должен включить на стороне сервера? Ценю твою помощь.

1 ответ

Решение

Как упомянуто в комментариях @mackie, cookie будет сдвигаться только в том случае, если истек срок его действия на полпути... и это не имеет ничего общего с Identity Server, но.NET Framework

Я смог преодолеть это, сделав это:

public class CustomCookieOptions : IConfigureNamedOptions<CookieAuthenticationOptions>
{
    private readonly AppConfiguration _appConfiguration;
    private const string UTC_DATE_TIME_FORMAT = "r";
    private const string EXPIRES_KEY = ".expires";

    public CustomCookieOptions(IOptions<AppConfiguration> appConfiguration)
    {
        _appConfiguration = appConfiguration.Value;
    }

    public void Configure(CookieAuthenticationOptions options)
    {
    }

    public void Configure(string name, CookieAuthenticationOptions options)
    {
        options.Events.OnValidatePrincipal = context =>
        {
            if (context.Principal.Identity.IsAuthenticated &&
                options.Cookie.Name == IdentityServerConstants.DefaultCookieAuthenticationScheme)
            {
                if (context.Properties.Items.ContainsKey(EXPIRES_KEY)
                    && context.Request.Path.Value.StartsWith("/connect/authorize"))
                {
                    var expiresAt = DateTimeOffset.Parse(context.Properties.Items[EXPIRES_KEY]);
                    if (DateTimeOffset.UtcNow <= expiresAt)
                    {
                        context.ShouldRenew = true;
                        context.Properties.Items[EXPIRES_KEY] =
                            DateTimeOffset.UtcNow.AddSeconds(_appConfiguration.CookieLifetimeInSeconds)
                                .ToString(UTC_DATE_TIME_FORMAT, CultureInfo.InvariantCulture);
                    }
                }
            }
            return Task.CompletedTask;
        };
    }

А затем зарегистрируйте это:

services.AddSingleton<IConfigureOptions<CookieAuthenticationOptions>, CustomCookieOptions>();
Другие вопросы по тегам