首页 > 解决方案 > id_token/Identity token 声明隐式与任何其他流之间的差异

问题描述

为什么在使用隐式或任何其他授权类型时身份令牌声明会有所不同?这是按规范还是我做错了什么?任何有助于理解这种行为的帮助都将受到高度赞赏。

当我使用带有 id_token 响应的隐式授权类型时,我会从身份服务器正在保护的客户端将所有声明添加到范围中。但是当我使用混合授权类型或代码授权类型时,身份令牌中缺少大多数声明(电子邮件和电话)。但是我可以在访问令牌中看到范围列表中的电子邮件和电话。使用访问令牌,我可以点击 userinfo 端点来获取范围内的所有信息。

标签: .netidentityserver4

解决方案


根据使用的流程和身份提供者的实现,令牌的内容可能会有所不同。

OpendId连接规范说:

3.3.3.6。身份令牌

使用混合流时,从 Token Endpoint 返回的 ID Token 的内容与从 Authorization Endpoint 返回的 ID Token 的内容相同,如第 3.3.2.11 节中定义的,除了本节中指定的不同之处。

如果从授权端点和令牌端点都返回了一个 ID 令牌(response_type 值代码 id_token 和代码 id_token 令牌就是这种情况),则两个 ID 令牌中的 iss 和 sub 声明值必须相同。任何一个中出现的关于身份验证事件的所有声明都应该出现在两者中。如果任一 ID 令牌包含有关最终用户的声明,则两者中的任何一个都应该在两者中具有相同的值。请注意,OP 可以选择从授权端点返回更少的关于最终用户的声明,例如,出于隐私原因。at_hash 和 c_hash 声明可以从令牌端点返回的 ID 令牌中省略,即使这些声明存在于从授权端点返回的 ID 令牌中,

如果您从两个端点(授权和令牌)获取访问令牌,它们可能会有所不同:

3.3.3.8。访问令牌

如果从授权端点和令牌端点都返回访问令牌(response_type 值代码令牌和代码 id_token 令牌就是这种情况),它们的值可能相同或可能不同。请注意,由于两个端点的安全特性不同,它们可能会返回不同的访问令牌,并且它们授予的资源的生命周期和访问权限也可能不同。


推荐阅读