Как увеличить тайм-аут сеанса в ServiceStack
Поставщики аутентификации, репозитория и кэширования в ServiceStack предоставляют простой способ добавления сеансов входа в веб-приложение с почти отсутствием дополнительного кода. Я обнаружил, что тайм-аут сеанса для поставщика проверки подлинности можно настроить, например:
new CredentialsAuthProvider { SessionExpiry = TimeSpan.FromMinutes(10) }
Это дает срок действия с момента входа в систему. Если мы разрабатываем защищенную систему, которая должна вывести пользователя из системы через короткое время, мы изменим это значение по умолчанию на две недели на что-то вроде приведенного выше примера. Но в этом проблема состоит в том, что 10 минут после входа в систему пользователя будут выведены из системы независимо от того, взаимодействуют ли они с приложением.
Есть ли простой способ сказать провайдеру сеанса продлить время истечения срока действия при вызове служб?
В идеале это позволит нам продлить сеанс для определенных сервисов/запросов (чтобы сеанс был расширен только тогда, когда пользователь активно взаимодействует с приложением, и поэтому опрошенные службы могут быть проигнорированы).
Обновление
Основываясь на ответе, данном mythz, теперь у нас есть простое решение, которое обеспечивает уровень контроля, который нам требуется расширение ResponseFilterAttribute.
Ответы
Ответ 1
ServiceStack не поддерживает "скользящее время сеанса" автоматически. Вам в основном понадобится reset запись кэша сеанса при каждом успешном запросе. т.е. у вас может быть фильтр ответов (поскольку они выполняются только для аутентифицированных запросов), которые сохраняют сеанс, который будет продлевать его продолжительность жизни по истечении срока действия:
var userSession = httpReq.GetSession();
httpReq.SaveSession(userSession, slidingExpiryTimeSpan);
Если вы знаете, какой поставщик кеширования вы используете, например. Redis вы можете вручную обновить тайм-аут истечения срока действия без повторного чтения записи, например:
var sessionKey = SessionFeature.GetSessionKey(httpReq.GetSessionId());
redis.ExpireEntryIn(sessionKey, slidingExpiry); //"urn:iauthsession:{sessionId}"