【问题标题】:Azure AD v2 roles not included in Access Token访问令牌中不包含 Azure AD v2 角色
【发布时间】:2021-05-26 14:49:45
【问题描述】:

我正在使用https://login.microsoftonline.com/.../oauth2/v2.0/token 使用范围对 azure Ad 进行身份验证(授权码授予):offline_access、openid、profile、User.Read

根据文档,我收到的访问令牌应该包含用户的角色: https://docs.microsoft.com/en-us/azure/active-directory/develop/access-tokens

但是只有身份令牌返回角色:

--Access Token
{
  "typ": "JWT",
  "nonce": "IWTwK2P0vzHoNnv1vvvSsjZSbAYPpSIk8MozY0A4WR0",
  "alg": "RS256",
  "x5t": "nOo3ZDrODXEK1jKWhXslHR_KXEg",
  "kid": "nOo3ZDrODXEK1jKWhXslHR_KXEg"
}.{
...
  "rh": "0.ASgASPp-HouAsUyXCdG05vvfeHAoPPG46TFOoWYsil-LDcsoADw.",
  "scp": "User.Read profile openid email",
...
}.[Signature]

--Identity Token
{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "nOo3ZDrODXEK1jKWhXslHR_KXEg"
}.{
...
  "rh": "0.ASgASPp-HouAsUyXCdG05vvfeHAoPPG46TFOoWYsil-LDcsoADw.",
  "roles": [
    "MyApp.Read",
    "MyApp.Admin",
    "MyApp.Write",
  ],
...
}.[Signature]

有没有办法让访问令牌也包含角色?

【问题讨论】:

  • 你好,卡尔。我会在一天结束之前投票并接受。我只是给其他人时间来回应。
  • 好的,美好的一天:)
  • 嗨,这对你有帮助吗?
  • 默多克,我认为您应该投票并接受答案。我遇到了同样的问题,感谢@CarlZhao 的回答,我设法解决了这个问题。

标签: c# asp.net-core active-directory azure-active-directory azure-ad-graph-api


【解决方案1】:

感谢@juunas 的提示,@juunas 是对的。如果您使用的是自定义 api,则用户令牌还可以包含 roles 声明。

需要在Azure中创建两个应用,一个代表客户端应用,另一个代表api应用,然后使用客户端应用调用api应用.

首先,需要暴露受Azure保护的后端应用的API,并添加客户端应用:

接下来需要设置api应用程序 AppRole,这是你自定义的角色,会显示在manifest中。

然后您可以将角色分配给用户。转到企业应用程序>您的 api 应用程序>用户和组。

接下来,转到客户端应用程序,让您的客户端应用程序访问您的后端 api:

  • 在“API 权限”下点击“添加权限”,然后点击“我的 API”标签。
  • 找到您的后端应用程序并选择适当的范围。
  • 点击“添加权限”。
  • 为您的 API 授予管理员许可。

接下来需要使用auth code flow获取access token,需要登录用户获取授权码,然后使用授权码兑换access token。

解析令牌,它包含scp 声明和roles 声明。

【讨论】:

  • 感谢卡尔。您是否有一些文档或在哪里说明?
  • @Murdock 用户令牌仅包含scp 声明,只有应用程序令牌具有roles 声明。 stackoverflow.com/questions/45956935/…
  • @Murdock 之前回答过类似的问题,可以参考:stackoverflow.com/questions/62542868/…
  • 这是不正确的。它们不在令牌中,因为它是 MS Graph API 令牌。如果用户在应用程序上被分配了角色,用户令牌也可以包含角色声明。要获得它们,OP 需要为其 API 获取令牌,而不是 MS Graph。
  • @CarlZhao 在 API 注册的“公开 API”刀片中授权客户端应用程序的步骤不是此操作所必需的。
【解决方案2】:

不幸的是,AAD 上存在一个错误,即仅在请求令牌时请求 API 范围时才将角色添加到 access_token。

为了让角色发挥作用,您需要进行以下设置:

  • 创建应用程序
  • 使用“公开 API”向应用程序添加范围
  • 在请求令牌时使用在上述步骤中创建的范围

最终结果将是一个令牌

例子:

https://login.microsoftonline.com/{tenantid}/oauth2/v2.0/authorize?client_id={appid}&response_type=token&scope={appid}/{scopename}&nonce=678910

openidemailprofile 范围只能与 id_tokens 一起使用

【讨论】:

    【解决方案3】:

    如果您在 Azure Active Directory 的应用注册中注册 API 应用并通过也在 Azure Active Directory 中注册的 SPA 应用公开该应用,那么-

    1. id 令牌包含在 SPA 应用程序上公开的角色和
    2. 访问令牌包含在 API 应用上公开的角色。

    (这是 Carl Zhao 的回答对我来说很重要的信息)

    【讨论】:

    • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2020-12-25
    • 1970-01-01
    • 2018-02-07
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-12-21
    • 2020-02-13
    • 2016-12-12
    相关资源
    最近更新 更多