oauth2.0 Azure AD:访问令牌中缺少角色声明

7gs2gvoe  于 2023-10-15  发布在  其他
关注(0)|答案(2)|浏览(166)

对于我的应用程序,我希望用户能够使用其Azure帐户登录(单点登录)。我还需要一个访问令牌来访问安全的后端。所以我可以通过对这个URL的请求来获得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令牌)中有角色,但我收到的令牌中不包括**角色。
当我使用此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_tokenaccess_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,
  ...
}
xuo3flqw

xuo3flqw1#

我也可以复制这个问题。不确定这是一个错误还是设计,我发现这个问题只发生在我们为应用程序本身获取令牌时。例如,如果我们使用Azure AD Graph替换资源,则角色声明可以在id_token中成功发出。
作为解决这个问题的方法,我建议您在第一个请求中获取id_token。然后你可以使用adal库在iframe中获取访问令牌,而无需用户交互,因为用户已经登录。

nfg76nw0

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中

相关问题