如何在ServiceStack中延长会话超时时间

10

ServiceStack 中的身份验证、仓库和缓存提供程序可以简单地为 Web 应用程序添加登录会话,几乎不需要额外的代码。我发现身份验证提供程序的会话超时可以进行配置,例如:

new CredentialsAuthProvider { SessionExpiry = TimeSpan.FromMinutes(10) }

这提供了一个从登录时间算起的到期时间。如果我们正在开发一个安全系统,必须在短时间内将用户注销,则将其从默认的2周更改为类似上面示例的时间。但是这会有一个问题,即用户登录后10分钟后,无论他们是否仍在与应用程序交互,都将被强制退出。

有没有一种简单的方法告诉会话提供者在调用服务时延长过期时间?

理想情况下,它将允许我们为特定的服务/请求延长会话(因此仅在用户积极与应用程序交互时才延长会话,因此可以忽略轮询服务)。

更新

根据mythz给出的答案,我们现在通过扩展ResponseFilterAttribute拥有了一个提供所需级别控制的简单解决方案。


2
这不是你问题的答案,但它的术语是“滑动”。例如:滑动缓存、滑动会话超时等。 - Matthew
1个回答

10

ServiceStack目前还没有自动支持“滑动会话过期”。您基本上需要在每个成功的请求中重置会话缓存条目。例如,您可以使用响应过滤器(因为它们仅对经过身份验证的请求执行)重新保存会话,这将具有通过到期时间延长其生命周期的效果:

var userSession = httpReq.GetSession();
httpReq.SaveSession(userSession, slidingExpiryTimeSpan);

如果你知道自己使用的缓存提供者,比如Redis,你可以手动更新到期超时时间而无需重新读取该条目,例如:

var sessionKey = SessionFeature.GetSessionKey(httpReq.GetSessionId());
redis.ExpireEntryIn(sessionKey, slidingExpiry); //"urn:iauthsession:{sessionId}"

谢谢。也许未来 SS 的一个功能是,你可以给服务请求函数添加一个属性,明确告诉它滑动到期日,因此默认行为将不会这样做。 - Dan
2
希望对他人有用,这是我根据Mythz的建议采用的解决方案链接:http://teadriven.me.uk/2013/02/14/sliding-sessions-in-service-stack。 - Dan
1
你还应该编辑你的答案,提到你的解决方案,这样更容易找到。 - mythz
1
我使用一个基于相同网站的过滤器,但添加了一些保护措施。 如果 (!req.Items.ContainsKey(RequestItemsSessionKey)) 返回; var session = req.GetSession(); 如果 (session != null && session.IsAuthenticated) req.SaveSession(session, Expiry); - jeffgabhart
@mythz 这个问题有更新了吗?新版本,v4 或者 v5 支持这个功能吗? - Mayank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接