撤销承载令牌和刷新令牌 - ServiceStack

时间:2018-06-04 23:39:26

标签: servicestack

我想为我的Angular应用强制执行单个用户会话功能,因为我的客户与他们的同事共享一个帐户。

目前的问题,我的实施。正在撤销存储在客户端本地存储中的有效令牌,特别是有效的刷新令牌。

场景是:

  1. 用户1使用有效的用户名和密码登录,持票人令牌将在一小时后到期,刷新令牌将在两周后到期
  2. 用户2,两小时后使用相同的用户名和密码。用户2被提示他们已登录到另一台设备上并询问他们是否希望使该会话到期并开始新会话。
  3. 用户2表示同意,现在用户1的会话无效。
  4. 问题是用户1仍然有一个有效的刷新令牌。

    我无法撤销此刷新令牌。我的Auth API接受有效,我不知道它是用户1还是用户2的刷新令牌。

    我是否需要在数据库中开始存储刷新令牌值以解决此问题?我还认为我可以为User1和User2使用不同的JwtAuthKeyBase64,作为使User1的令牌无效的方法,但这似乎不是使用ServiceStack JwtAuthProvider的好方法。

1 个答案:

答案 0 :(得分:0)

JWT RefreshToken用于联系Auth服务器以获取新的JWT承载令牌。如果用户仍然具有Access,它将仅返回BearerToken,因此您可以通过填充UserAuth.LockedDate来锁定用户帐户,这将阻止用户检索新的JWT承载令牌。

如果您想要更多自定义验证,可以implement IUserSessionSource并在GetUserSession()中抛出异常以返回错误响应而不是JWT承载令牌。