使用 JWT 的角色

Posted

技术标签:

【中文标题】使用 JWT 的角色【英文标题】:Roles using JWT 【发布时间】:2015-11-16 11:19:08 【问题描述】:

我是智威汤逊的新手。我对 JWT 进行了一些研究,并了解到它被框架为“header.claims.signature”。

考虑一个简单的场景如下:

客户通过身份验证 客户可能拥有(一个或多个)管理员、成员、注册、访客等角色 服务器不维护任何会话(并且完全依赖 JWT 进行身份验证/授权)

一旦通过身份验证,服务器就会找到客户的类型,我假设 customerId 和角色将成为 JWT 中“声明”的一部分。如果我的假设不正确(或不符合标准),请告诉我。

JWT 的“声明”部分未加密(只是编码)。这暴露了一个简单的安全漏洞,(服务)消费者可以简单地修改 JWT 的“声明”部分,并使用更多角色(客户/消费者无权)重新发送相同的内容。

如果我的理解/假设不正确,我们如何实现我的目标?

【问题讨论】:

【参考方案1】:

当使用JWS (header.claims.signature) 时,JWT 的“声明”部分受到签名的完整性保护。因此,如果“声明”或 JWT 的任何其他部分被没有正确密钥的人修改,则 JWT 上的签名验证将失败并且应该拒绝令牌。

【讨论】:

如果我在jwt.io 将“admin”修改为“false”,看起来签名并不真正关心它。我在这里错过了什么吗? jwt.io 上的工具会在您修改 JSON 声明时更新签名。如果您要在别处修改 JWT 并将其粘贴,您将得到该工具报告的无效签名。例如,这具有JWT超过calculted权利要求瓦特/“管理员”的签名:假但随后的权利要求书/有效载荷修改为“管理员”:真,从而该签名是无效的:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.uI_rNanTsZ_wFa1VnICzq2txKeYPArda5QLdVeQYFGI 跨度> @BrianCampbell:Excellet!正是我要找的!【参考方案2】:

可以验证 JWT 的 claims 部分,但在向 claims 添加类似角色的内容时,另一个问题是您更改用户角色时,但旧令牌仍包含分配给用户的先前角色。所以要小心。 您可以简单地将用户标识符保留在令牌中,并根据您的持久性机制(数据库或其他任何东西)检索与用户关联的任何其他信息。

【讨论】:

访问令牌由于这个和许多其他原因是短暂的。 Azure AD 令牌仅在 1 小时内有效,例如 我正在搜索这个答案。非常感谢。【参考方案3】:

另一种选择是在身份验证期间根据令牌中包含的用户标识符在数据库中查找用户,以验证 JWT 中未包含的角色或其身份的其他方面。

但是,如前所述,JWT 中包含的任何信息都通过签名进行验证,因此如果需要,您也可以依赖 JWT 中的内容。

【讨论】:

以上是关于使用 JWT 的角色的主要内容,如果未能解决你的问题,请参考以下文章

将 JWT 与基于角色的授权一起使用

使用 express-jwt 进行基于角色的授权?

使用passport-jwt在nestJs框架中进行角色验证

如何制作和使用基于 JWT 角色的身份验证?

如何使用剃刀视图 ASP .Net Core 从 JWT 声明角色

如何在 Python 中使用 JWT 实现基于角色的身份验证