Access和Id令牌之间的“ sub”声明值不同

时间:2018-10-18 14:46:05

标签: oauth-2.0 azure-active-directory openid-connect

我正在使用“资源所有者密码”授予流程,并且也在请求ID令牌(scope包括openid)。我将以下内容发送到端点:

  • client_id
  • client_secret
  • grant_type=password
  • username
  • password
  • scope

在响应中,我获得了访问令牌和id令牌。 sub声明的值在两个令牌之间不同。为什么会这样?

更新

似乎用户ID实际上是一个oid声明。 Azure AD ID token reference中对此进行了描述。

描述oid声明的文本:

  

Microsoft身份系统中对象的不可变标识符,在这种情况下为用户帐户。此ID在应用程序之间唯一标识用户-在同一用户中签名的两个不同应用程序将在oid声明中收到相同的值。 Microsoft Graph将返回此ID作为给定用户帐户的id属性。由于oid允许多个应用程序关联用户,因此需要profile范围才能收到此声明。请注意,如果一个用户存在于多个租户中,则该用户将在每个租户中包含一个不同的对象ID-即使用户使用相同的凭据登录到每个帐户,它们也被视为不同的帐户。

描述sub声明的文本:

  

令牌用于声明信息的主体,例如应用程序的用户。此值是不可变的,不能重新分配或重用。该主题是一个成对的标识符-对于特定的应用程序ID是唯一的。因此,如果单个用户使用两个不同的客户端ID登录两个不同的应用程序,则这些应用程序将收到该主题声明的两个不同值。根据您的体系结构和隐私要求,可能不需要,也可能不需要。

但是,我仍然不清楚为什么sub声明在访问令牌和id令牌之间有所不同。

2 个答案:

答案 0 :(得分:2)

主题(sub)声明对于用户和令牌所针对的服务是唯一的(由受众群体(aud声明所标识)。

通常,ID令牌和访问令牌的受众不同:ID令牌的受众是用户登录的客户端应用,访问令牌的受众是客户端应用将尝试访问的资源服务器(代表的登录用户)。

答案 1 :(得分:1)

根据OpenID规范,不应将“资源所有者密码凭证”授予类型用于用户身份验证,只有通过authorization endpoint与用户进行交互的流才可以这样做(即,隐式,授权撰写本文时,代码,混合和无授权类型流)。

如果您使用ROPC流程接收到ID令牌,则身份提供者会提出超出OpenID Connect规范范围且可能具有特定和非标准功能的特定方法,应予以记录。

在任何情况下,在客户端,您都应仅依赖ID令牌中的sub声明。客户端不应该解析访问令牌,因为它只能由资源服务器使用。

sub声明取决于IdP策略和客户端配置。 sub声明对于应用程序(或应用程序组)可能是唯一的。请参阅规范的Subject Identifier Types部分。