在JWT中更新/更改角色声明(或任何其他声明)

tob*_*bbe 16 authentication oauth jwt asp.net-core asp.net-core-webapi

我将用户角色存储在JWT中(以限制API端点).管理员可以更改角色.

如果角色发生了变化.我怎么能在所有代币中反映这一点?我考虑过几个解决方案:

  • 如果我使用刷新令牌,则用户必须等到访问令牌的到期日期到期.

  • 我可以记录已更改的用户ID并检查每个请求,然后在用户更改后返回新令牌.

有没有标准的方法来做到这一点?

Jan*_*nar 8

JWT令牌是不可变的,因此您无法更改/更新现有令牌的声明 - 因此您必须发出新的JWT令牌.

这导致了JWT的最大问题 - 令牌撤销.没有好的解决方案.你能做的是

  • 保持JWT到期日期短(并可选择使用刷新令牌)

  • 使用黑名单来保存已撤销的令牌列表(当然这样会丢失'无状态'部分)

  • 更改密钥(请记住,这会撤消所有用户的所有有效令牌)

最佳解决方案取决于具体案例.


Bal*_*zar 7

如果您关心即时更改,刷新令牌似乎不是解决方案,如果您撤消其权限,您可能不希望用户访问审核工具一段时间.

您可以做的是在jwt令牌中保留相对于用户的版本号,就像mongoose用它的versionKey一样.通过这样做,您将能够针对给定用户的数据库中的版本检查此版本.每次更改此用户的角色时,如果jwt的版本不匹配,您将增加此版本,只需重新创建具有正确角色和版本的新版本并将其发送回用户.

我不相信有一个适当的标准,因为jwt是设计不可变的,如果你需要"更新"它,你必须完全改变它.

  • 您是否会根据站点范围的版本号(可能存储在配置文件中)或存储在数据库中的特定用户的版本号来检查 jwt 中存储的版本?因为如果它不是站点范围的,那么您必须在每个请求上访问数据库,对吧? (2认同)