使用JWT的角色

使用JWT的角色,jwt,Jwt,我是JWT的新手。我研究了一下JWT,了解到它的框架是“header.claims.signature” 考虑一个简单的场景,如下所示: 客户得到认证 客户可能有(一个或多个)管理员、会员、注册、来宾角色 服务器不维护任何会话(仅依赖JWT进行身份验证/授权) 一旦通过身份验证,服务器就会找到客户类型,我假设customerId和角色将是JWT中“声明”的一部分。如果我的假设不正确(或不符合标准),请告诉我 JWT的“声明”部分未加密(仅编码)。这暴露了一个简单的安全漏洞,(服务)消费者可以

我是JWT的新手。我研究了一下JWT,了解到它的框架是“header.claims.signature”

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

  • 客户得到认证
  • 客户可能有(一个或多个)管理员、会员、注册、来宾角色
  • 服务器不维护任何会话(仅依赖JWT进行身份验证/授权)
一旦通过身份验证,服务器就会找到客户类型,我假设customerId和角色将是JWT中“声明”的一部分。如果我的假设不正确(或不符合标准),请告诉我

JWT的“声明”部分未加密(仅编码)。这暴露了一个简单的安全漏洞,(服务)消费者可以简单地修改JWT的“声明”部分,并将其重新发送给更多角色(客户/消费者无权这样做)


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

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

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


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

JWT的
声明部分可以进行验证,但是在
声明中添加类似角色的内容时,另一个问题是更改用户角色时的情况,但是旧令牌仍然包含以前分配给用户的角色。所以要小心。

您可以简单地将用户标识符保留在令牌中,并根据持久化机制(数据库或其他任何内容)检索与用户相关的任何其他信息。

如果我将“admin”修改为“false”,看起来签名并不真正关心它。我是否遗漏了什么?jwt.io上的工具正在更新签名,因为您修改了JSON声明。如果要在其他地方修改JWT并将其粘贴到中,那么工具会报告无效的签名。例如,此JWT将签名计算在声明w/“admin”:false上,但随后将声明/有效负载修改为“admin”:true,因此签名无效:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyjzdwiiiiiiiijmjm0nty3odkwiiiibmzsi6ikpvag4grg9liiwiywrtaw4ionrydwv9.uI_rNanTsZ_wFa1VnICzq2txKeYPArda5QLdVeQYFGI@BrianCampbell:太棒了!正是我要找的!由于这一点和许多其他原因,访问令牌的寿命很短。Azure AD代币仅在1小时内有效,例如,我正在搜索此答案。多谢各位。