【问题标题】:OpenID Connect ID Token: What's the purpose of audience [aud] field validationOpenID Connect ID Token:观众 [aud] 字段验证的目的是什么
【发布时间】:2017-01-16 05:54:24
【问题描述】:
我正在尝试实现OpenID Connect Implicit Flow。前端单页应用程序将 ID 令牌向下传递到后端服务器(使用授权标头),我需要在其中对其进行验证。
文档要求我 to check 我信任令牌的受众(aud 和 azp 字段)。我正在努力理解此验证步骤的重要性以及不这样做的安全影响。如果我不是预期的接收者,为什么要不信任令牌?
我的理由是,如果我信任发行人,那么为谁发行代币并不重要。我希望任何 clientId 的声明都是相同的(这是错误的吗?)。理想情况下,当我在我的微服务周围传递 ID 令牌时,他们应该知道的就是要信任的发行者(并使用 discovery protocol 找出密钥)。
如果我跳过此验证步骤,攻击向量是什么?
【问题讨论】:
标签:
security
microservices
openid-connect
【解决方案1】:
发行者可能正在向不同的应用程序发行令牌,而这些应用程序可能具有不同的权限。不检查受众将允许攻击者在应用程序 B 使用为应用程序 A 颁发的令牌,并可能导致权限提升。
根据您的建议:每个客户的声明可能确实不同。
【解决方案2】:
我为后代回答这个问题。
如果您从外部 OpenId 提供者接收令牌,您应该检查发行者以及您的 client_id 是否是受众中唯一的一个。一个可能比你的客户拥有更多的东西。
声明对于 OpenID 提供者来说不是全局的,它们可以是每个客户端的。用户可以在 app-A 上拥有“管理员”角色,在那里获取令牌,然后尝试向 app-B(您的应用程序)发送相同的令牌,希望您没有检查它是为哪个客户端(其受众)发出的。