对不起,我的英语不好。我正在使用Vue.JS作为客户端在ASP.NET Core中编写应用程序。对于身份验证用户,我正在使用JWT和ASP.NET Identity。我有一种更改密码的方法。但是我不明白:密码更改后如何使令牌无效?我希望在其他浏览器中通过身份验证的用户将在此之后注销。有没有遇到过这样的问题的人?
答案 0 :(得分:0)
您通常不会使JWT失效,因为它们是短暂的访问令牌,因此在更改密码后,请求新令牌将提示用户重新输入凭据。
如果您确实确实需要在更改密码后立即使JWT无效-您需要查看Introspection
,其中后端api实际上具有通向令牌发行者的反向通道,然后它可以重新验证每个请求的令牌。这样,如果您在发行方使令牌无效-它会立即在api上反映。
答案 1 :(得分:0)
我一直在考虑这个问题,无法使已经存在的 JWT 失效可能不会被内置到任何东西中,但这是可能的。
叙述如下:您安装了可通过网络控制的警报系统,并且您的前 S/O 已登录到您之前共享的帐户。他们心烦意乱,总是在随机时间启用警报。 如果 Web 应用使用 JWT 来存储会话,您可以更改密码,但您前任拥有的 JWT 在超时之前仍然可以使用一段时间。
假设您采用解决方案 3:
在为此解决方案存储 JWT 数据时,我倾向于不存储整个 JWT,因为它一开始是相当大的文本。或者,只需存储 JWS(JWT 签名),如果因任何原因被捕获,这将使存储的值更小且不可用。 接下来,它是一个哈希值,所以我们可以只存储最后的 9 个值(9 个,因为 int32 最大值是 2147483647)。我们只需要一点独特性,并不多。 接下来,如果我们使用正则表达式从 JWS 中提取整数并再次取您遇到的前 9 个数字,我们可以避免字符串比较以验证传递的 JWS 是活动的。
按照此方法,返回叙述,如果您要注销,您的用户将被标记为已注销,导致您和您的 S/O 都需要重新进行身份验证。 (假设您已经更改了密码,那么您就是黄金,否则是时候联系客户支持了) 如果您重新登录,您将获得一个新的 JWT,并且一个新的签名将存储在 Users 表中。如果您的 S/O 尝试使用该站点,他们将无法通过旧的 JWT 进行身份验证,并会被迫重新登录。
权衡:如果我们只存储 JWS,或者按照我的建议存储其中的一部分,则多个用户无法同时登录同一个帐户。您对此的感受实际上取决于您的应用。