我正在使用“资源所有者密码”授予流程,并且也在请求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令牌之间有所不同。
答案 0 :(得分:2)
主题(sub
)声明对于用户和令牌所针对的服务是唯一的(由受众群体(aud
声明所标识)。
通常,ID令牌和访问令牌的受众不同:ID令牌的受众是用户登录的客户端应用,访问令牌的受众是客户端应用将尝试访问的资源服务器(代表的登录用户)。
答案 1 :(得分:1)
根据OpenID规范,不应将“资源所有者密码凭证”授予类型用于用户身份验证,只有通过authorization endpoint与用户进行交互的流才可以这样做(即,隐式,授权撰写本文时,代码,混合和无授权类型流)。
如果您使用ROPC流程接收到ID令牌,则身份提供者会提出超出OpenID Connect规范范围且可能具有特定和非标准功能的特定方法,应予以记录。
在任何情况下,在客户端,您都应仅依赖ID令牌中的sub
声明。客户端不应该解析访问令牌,因为它只能由资源服务器使用。
sub
声明取决于IdP策略和客户端配置。 sub
声明对于应用程序(或应用程序组)可能是唯一的。请参阅规范的Subject Identifier Types部分。