使用 servicestack 的单个会话

Single session using servicestack

我喜欢实现功能 如果两个用户尝试使用相同的凭据登录,那么第一个用户应该在第二个用户登录后立即注销。

考虑用户一是使用他的凭据从一台机器登录的 他/另一个用户正试图从另一台机器登录 那么用户一登录后应该立即删除用户一会话。

Ps: 我试图通过在用户 table 中保存当前会话 ID 并从 IAuthSession 接口覆盖 OnCreated 方法然后检查请求 sessionId 是否与保存的会话 ID 如果相同则处理请求,否则调用 lout 端点。

但这对性能不利,我不确定这样做是否是一个好方法?

PS:我正在使用 JWT 令牌。

更新: 我可以通过使用 ICacheClient 获取会话来清除会话,然后使用 IRequest.RemoveSession(sessionId) 从服务器删除会话,但它不会注销特定用户。

您不能使使用无状态身份验证(如 JWT)进行身份验证的用户无效,它在令牌中嵌入了签名身份验证,该令牌在 JWT 到期之前有效。

即您不能在 JWT 令牌发出后撤销它。

有一个 JwtAuthProvider.ValidateToken 过滤器,您可以使用它来执行自定义逻辑以防止用户进行身份验证,您可以使用它,但是这需要您管理要阻止的令牌信息集合在其令牌到期之前进行身份验证。