【问题标题】:Revoking Bearer Token and Refresh Token - ServiceStack撤销承载令牌和刷新令牌 - ServiceStack
【发布时间】:2018-11-14 08:29:43
【问题描述】:

我想为我的 Angular 应用程序实施单一用户会话功能,因为我的客户与他们的同事共享一个帐户。

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

场景是:

  1. 用户 1 使用有效的用户名和密码登录,承载令牌将在一个小时后过期,刷新令牌将在两周后过期
  2. 用户 2,两小时后使用相同的用户名和密码。系统提示用户 2 他们已在另一台设备上登录,并询问他们是否希望使该会话过期并开始新会话。
  3. 用户 2 说是,现在用户 1 的会话无效。

问题是用户 1 仍然有一个有效的刷新令牌。

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

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

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    JWT RefreshToken 用于联系 Auth Server 以获取新的 JWT Bearer Token。如果用户仍然具有访问权限,它只会返回 BearerToken,因此您可以通过填充 UserAuth.LockedDate 来锁定用户帐户,这将阻止用户检索新的 JWT Bearer Token。

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

    【讨论】:

    • 这是有道理的,唯一的问题是 User1 和 User2 将具有相同的 UserId,所以我不知道要撤销哪个 RefreshToken,除非我将当前 RefreshToken 存储在数据库中正确?
    • @BrianOgden 这两个选项都不能让您访问 RefreshToken。用户 1 和用户 2 不应使用相同的用户名/密码,除非他们是相同的用户。唯一真正的选择是添加一个全局请求过滤器来检查 GetAccessToken 请求 DTO 并在您想要拒绝 RefreshToken 访问时短路请求。
    猜你喜欢
    • 2021-09-24
    • 2019-04-12
    • 2015-12-13
    • 1970-01-01
    • 2021-07-05
    • 2022-07-05
    • 2018-04-23
    • 2019-01-21
    • 2021-07-03
    相关资源
    最近更新 更多