【发布时间】:2018-02-07 23:06:16
【问题描述】:
对于我的应用程序,我希望用户能够使用他们的 Azure 帐户登录(单点登录)。我还需要一个访问令牌来访问受保护的后端。
所以我可以同时获得id_token 和access_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 令牌)中拥有角色,但我收到的令牌中不包含角色。
当我使用此 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,
...
}
【问题讨论】:
-
我从未见过实际使用过
token参数。您是否尝试过对授权码授予流程做同样的事情? IE。response_type=id_token+code,然后将代码交换为访问令牌。 -
我会试一试的。那么你认为这是一个错误吗?
-
不确定,不过看起来很奇怪。
-
好的,我试过
response_type=id_token+code。通过代码,我从令牌端点获取了令牌,它给了我 access_token、refresh_token 和 id_token。access_token和id_token都再次缺少角色声明。 :( -
您能否补充一下您在问题中如何定义您的角色?例如清单的一部分。
标签: azure oauth-2.0 jwt azure-active-directory openid-connect