对于我的应用程序,我希望用户能够使用其Azure帐户登录(单点登录)。我还需要一个访问令牌来访问安全的后端。所以我可以通过对这个URL的请求来获得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
?
edit:这是approles在应用的manifest中定义的方式:
{
"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,
...
}
2条答案
按热度按时间xuo3flqw1#
我也可以复制这个问题。不确定这是一个错误还是设计,我发现这个问题只发生在我们为应用程序本身获取令牌时。例如,如果我们使用Azure AD Graph替换资源,则角色声明可以在id_token中成功发出。
作为解决这个问题的方法,我建议您在第一个请求中获取id_token。然后你可以使用adal库在iframe中获取访问令牌,而无需用户交互,因为用户已经登录。
nfg76nw02#
要获取访问令牌中的“roles”声明以授权后端中的用户请求,请按照本指南中的步骤操作:https://github.com/Azure-Samples/ms-identity-javascript-tutorial/blob/main/3-Authorization-II/1-call-api/README.md
您将注册2个应用程序,一个用于客户端(浏览器),一个用于服务器(API)。
然后完成指南中的步骤后最重要的事情:
转到您的服务器应用程序注册“manifest”>从“optional_claims.access_token”对象中删除“emit_as_roles”:
现在,角色声明将出现在access_token中