Тайм-аут сессии ASP.NET Core 2.1 CookieAuthentication - PullRequest
0 голосов
/ 29 октября 2018

Время сеанса истекает до того, как 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?

...