访问令牌中不包含 Azure AD v2 角色

时间:2021-02-24 09:42:17

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

我正在使用 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]

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

1 个答案:

答案 0 :(得分:0)

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

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

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

enter image description here

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

enter image description here

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

enter image description here

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

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

接下来需要使用auth code flow获取访问令牌,需要先登录用户获取授权码,然后使用授权码兑换访问令牌。

>

enter image description here

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

enter image description here