Azure AD:访问令牌中缺少角色声明
Azure AD: Roles claims missing in access token
对于我的应用程序,我希望用户能够使用他们的 Azure 帐户登录(单点登录)。我还需要一个访问令牌来访问安全后端。
所以我可以同时获得 id_token
和 access_token
,并请求 url:
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 令牌)中拥有角色,但 角色不包含在我收到的令牌中 .
当我使用此 Url 仅获得 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_token
和带有角色声明的 access_token
?
编辑:
这是在应用清单中定义 approles 的方式:
{
"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,
...
}
我也可以重现这个问题。不确定这是错误还是设计使然,我发现此问题仅在我们获取应用程序自身的令牌时才会发生。例如,如果我们用 Azure AD Graph 替换资源,角色声明可以在 id_token 中成功发布。
作为此问题的解决方法,我建议您在第一个请求中获取 id_token。然后您可以使用 adal 库在 iframe 中获取访问令牌,无需用户交互,因为用户已经登录。
对于我的应用程序,我希望用户能够使用他们的 Azure 帐户登录(单点登录)。我还需要一个访问令牌来访问安全后端。
所以我可以同时获得 id_token
和 access_token
,并请求 url:
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 令牌)中拥有角色,但 角色不包含在我收到的令牌中 .
当我使用此 Url 仅获得 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_token
和带有角色声明的 access_token
?
编辑: 这是在应用清单中定义 approles 的方式:
{
"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,
...
}
我也可以重现这个问题。不确定这是错误还是设计使然,我发现此问题仅在我们获取应用程序自身的令牌时才会发生。例如,如果我们用 Azure AD Graph 替换资源,角色声明可以在 id_token 中成功发布。
作为此问题的解决方法,我建议您在第一个请求中获取 id_token。然后您可以使用 adal 库在 iframe 中获取访问令牌,无需用户交互,因为用户已经登录。