OpenID Connect ID Token: audience [aud]字段验证的目的是什么?

14
我正在尝试实现OpenID Connect Implicit Flow。前端单页应用程序将ID Token通过Authorization头传递到后端服务器,在那里我需要验证它。
文档要求我检查我信任令牌的受众(aud & azp字段)。我很难理解这个验证步骤的重要性以及不这样做的安全影响。如果我不是预期的接收者,为什么应该不信任令牌?
我的想法是,如果我信任发行者,那么发行给谁的令牌并不重要。我希望声明对于任何客户端ID都是相同的(这是错误的吗?)。理想情况下,当我在我的微服务中传递ID Token时,所有他们需要知道的就是要信任哪些发行者(并使用discovery protocol来找出密钥)。
如果我跳过此验证步骤,攻击向量是什么?
3个回答

13

发行方可能会向不同的应用程序发行令牌,这些应用程序可能具有不同的权限。如果不检查受众,攻击者可以在应用程序B上使用为应用程序A颁发的令牌,并可能导致权限提升。

关于您的建议:每个客户端的声明确实可能不同。


3

这里有另一个原因:如果您检查aud声明仅包含您的客户端,它可以防止其他应用程序的被盗令牌在您的应用程序上使用。如果用户的令牌从另一个应用程序中被盗取,由于aud声明不正确,没有人能够冒充该用户在您的应用程序上。


1
我为了后人的方便而回答这个问题。
如果你从外部OpenId提供商那里接收到令牌,你应该检查发行者和你的client_id是否是唯一的受众。因为OpenId提供商可能有比你更多的客户端。
声明不是全局的OpenID提供商,它们可以是每个客户端的。一个用户在app-A上可能有“管理员”角色,在那里得到一个令牌,然后尝试发送相同的令牌给app-B(你的应用程序),希望你没有检查它是为哪个客户端(它的受众)发行的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接