Azure AD:角色声称在访问令牌

时间:2017-08-30 09:38:57

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

对于我的应用程序,我希望用户能够使用他们的Azure帐户登录(单点登录)。我还需要一个访问令牌来访问受保护的后端。 因此,我可以同时获取id_tokenaccess_token这两个请求:

https://login.microsoftonline.com/MY_TENANT_ID/oauth2/authorize?response_type=id_token+token&client_id=MY_CLIENT_ID&state=SOME_STATE&redirect_uri=MY_REDIRECT_URI&scope=openid profile&resource=MY_CLIENT_ID&nonce=SOME_NONCE

这基本上有效,但我也希望在访问令牌中(以及在id令牌中)拥有角色,但在我收到的令牌中角色不包含

当我使用此网址仅获得id_token时,包含角色声明

https://login.microsoftonline.com/MY_TENANT_ID/oauth2/authorize?response_type=id_token&client_id=MY_CLIENT_ID&state=SOME_STATE&redirect_uri=MY_REDIRECT_URI&scope=openid profile&nonce=SOME_NONCE

不同之处在于,我只请求id_token而不是token,并且我省略了resource参数。

我的问题是:为什么角色声明不包含在第一个请求的标记中?我可以选择id_tokenaccess_token获取角色声明吗?

编辑: 这就是在应用程序清单中定义批准的方式:

{
  "appId": "MY_CLIENT_ID",
  "appRoles": [
    {
      "allowedMemberTypes": [
        "User"
      ],
      "displayName": "Admin",
      "id": "c200e304-fff3-49f1-a4df-e406741ea690",
      "isEnabled": true,
      "description": "Bla bla",
      "value": "admin"
    },
    {
      "allowedMemberTypes": [
        "User"
      ],
      "displayName": "Reader",
      "id": "c534f351-b343-48d0-9dd7-ecb4c5cb402d",
      "isEnabled": true,
      "description": "Bla bla",
      "value": "reader"
    }
  ],
  "availableToOtherTenants": false,
  ...
}

1 个答案:

答案 0 :(得分:1)

我也可以重现这个问题。不确定这是一个错误或设计,我发现这个问题只发生在我们获取app self的令牌时。例如,如果我们使用Azure AD Graph替换资源,则可以在id_token中成功发出角色声明。

作为此问题的解决方法,我建议您在第一个请求中获取id_token。然后,您可以使用adal库在iframe中获取访问令牌而无需用户交互,因为用户已经登录。