【问题标题】:The 'sub' claim value is different between Access and Id tokensAccess 和 Id 令牌之间的“sub”声明值不同
【发布时间】:2019-03-23 10:04:31
【问题描述】:

我正在使用资源所有者密码授权流程并请求 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 令牌之间是不同的。

【问题讨论】:

  • 嗯,Id 令牌适用于您的应用程序,即 sub 声明对于您的应用程序是唯一的。并且访问令牌适用于您正在调用的某些 API,因此 sub 声明在其中是唯一的。您可以将其中任何一个用作用户的不可变标识符,但如果您想在例如引用用户时需要 oid MS 图形 API。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    无论如何,在客户端,您应该只依赖 ID 令牌中的 sub 声明。客户端不应该解析访问令牌,因为它仅供资源服务器使用。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-28
      • 2016-11-15
      • 2020-06-29
      • 1970-01-01
      • 2020-06-20
      • 2012-03-12
      • 1970-01-01
      • 2021-04-30
      相关资源
      最近更新 更多