Как увеличить тайм-аут сеанса в 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}"