ASP.NET核心。更改密码后如何使JWT-Token失效

时间:2019-04-01 16:13:53

标签: c# asp.net vue.js

对不起,我的英语不好。我正在使用Vue.JS作为客户端在ASP.NET Core中编写应用程序。对于身份验证用户,我正在使用JWT和ASP.NET Identity。我有一种更改密码的方法。但是我不明白:密码更改后如何使令牌无效?我希望在其他浏览器中通过身份验证的用户将在此之后注销。有没有遇到过这样的问题的人?

2 个答案:

答案 0 :(得分:0)

您通常不会使JWT失效,因为它们是短暂的访问令牌,因此在更改密码后,请求新令牌将提示用户重新输入凭据。

如果您确实确实需要在更改密码后立即使JWT无效-您需要查看Introspection,其中后端api实际上具有通向令牌发行者的反向通道,然后它可以重新验证每个请求的令牌。这样,如果您在发行方使令牌无效-它会立即在api上反映。

答案 1 :(得分:0)

我一直在考虑这个问题,无法使已经存在的 JWT 失效可能不会被内置到任何东西中,但这是可能的。

叙述如下:您安装了可通过网络控制的警报系统,并且您的前 S/O 已登录到您之前共享的帐户。他们心烦意乱,总是在随机时间启用警报。 如果 Web 应用使用 JWT 来存储会话,您可以更改密码,但您前任拥有的 JWT 在超时之前仍然可以使用一段时间。

  • 解决方案 1:短时间超时。但是如果您想长时间保持登录状态(例如密码管理器),该怎么办
  • 解决方案 2:通过更改认证机构的签名密钥注销所有用户,基本上使所有 JWT 全面​​失效。这仍然是一条不太理想的路线,我相信您可以想象。
  • 解决方案 3:跟踪用户表中每个用户的当前 JWT。如果他们拥有的 JWT 与当前的 JWT 不同,那么他们就不会被认证。如果用户注销,请取消用户表中存储的 JWT 数据,这同样会对该用户的 JWT 进行身份验证并强制重新登录。 我还建议为用户存储一个“登录”的布尔值。不要依赖于此。这将是一个在他们登录时设置为 true 的值,在他们注销时将其设置为 false,如果他们向您传递 JWT,则验证该值是否为“true”。这将确保他们在注销时被迫重新进行身份验证。

假设您采用解决方案 3:

在为此解决方案存储 JWT 数据时,我倾向于不存储整个 JWT,因为它一开始是相当大的文本。或者,只需存储 JWS(JWT 签名),如果因任何原因被捕获,这将使存储的值更小且不可用。 接下来,它是一个哈希值,所以我们可以只存储最后的 9 个值(9 个,因为 int32 最大值是 2147483647)。我们只需要一点独特性,并不多。 接下来,如果我们使用正则表达式从 JWS 中提取整数并再次取您遇到的前 9 个数字,我们可以避免字符串比较以验证传递的 JWS 是活动的。

按照此方法,返回叙述,如果您要注销,您的用户将被标记为已注销,导致您和您的 S/O 都需要重新进行身份验证。 (假设您已经更改了密码,那么您就是黄金,否则是时候联系客户支持了) 如果您重新登录,您将获得一个新的 JWT,并且一个新的签名将存储在 Users 表中。如果您的 S/O 尝试使用该站点,他们将无法通过旧的 JWT 进行身份验证,并会被迫重新登录。

权衡:如果我们只存储 JWS,或者按照我的建议存储其中的一部分,则多个用户无法同时登录同一个帐户。您对此的感受实际上取决于您的应用。