使用针对node.js的Microsoft MSAL快速入门的修改版(原始here),我使用隐式流成功接收了Azure存储API的访问 token 。该 token 包括一个组声明,但是该声明中的一个GUID似乎与租户中的任何组都不相关。从每个组中删除用户后,声明仍包含该GUID(并且按预期不再存在):

  "groups": [
    "2cb3a5e8-4606-4407-9a97-616246393b5d"
  ],

Google搜索该GUID并没有带来任何成功,因此我假设它不是某种知名的GUID。

为什么在小组声明中得到此“未知” GUID?

所涉及的AAD租户是一个很小的租户,我专门用于学习AAD和身份验证。因此,它仅包含一个组。涉及的用户不是该单个组的成员。

我查看了Azure门户中的用户页面,该页面确实显示该用户“不是任何组的成员”。 Azure CLI还显示该用户不是任何组的成员:
$ az ad user get-member-groups --upn [email protected]
[]
$

该租户中的组的完整列表仅包含一个组,并且您可以看到其ObjectID与我在声明中得到的GUID不匹配:
$ az ad group list --query [].objectId --output tsv
b1cc46de-8ce9-4395-9c7c-e4e90b3c0036
$

我还创建了另一个应用程序注册,并公开了一个虚拟API。当使用该虚拟API作为范围时,我再次成功接收
一个访问 token ,但该 token 又包含与单个组声明相同的未知GUID。

这是希望的代码相关部分。

如上所述,首先我检索了Azure存储的访问 token :
        var requestObj = {
            scopes: ["https://storage.azure.com/user_impersonation"]
        };

...但是使用虚拟API可以获得完全相同的结果:
        var requestObj = {
            scopes: ["api://7c7f72e9-d63e-44b6-badb-dd0e43df4cb1/user_impersonation"]
        };

该位将用户登录:
        function signIn() {
            myMSALObj.loginPopup(requestObj).then(function (loginResponse) {
                //Successful login
                showWelcomeMessage();
                acquireTokenPopup();
            }).catch(function (error) {
                //Please check the console for errors
                console.log(error);
            });
        }

在这里获取 token 。我知道,鉴于 token 的范围,callMSGraph在这里不起作用。我从浏览器控制台日志中获取 token ,并使用jwt.ms对其进行解码。
        function acquireTokenPopup() {
            //Always start with acquireTokenSilent to obtain a token in the signed in user from cache
            myMSALObj.acquireTokenSilent(requestObj).then(function (tokenResponse) {
                console.log("Access Token from cache: " + JSON.stringify(tokenResponse.accessToken));
                callMSGraph(graphConfig.graphMeEndpoint, tokenResponse.accessToken, graphAPICallback);
            }).catch(function (error) {
                console.log(error);
                // Upon acquireTokenSilent failure (due to consent or interaction or login required ONLY)
                // Call acquireTokenPopup(popup window)
                if (requiresInteraction(error.errorCode)) {
                    myMSALObj.acquireTokenPopup(requestObj).then(function (tokenResponse) {
                        console.log("Access Token after interaction: " + JSON.stringify(tokenResponse.accessToken));
                        callMSGraph(graphConfig.graphMeEndpoint, tokenResponse.accessToken, graphAPICallback);
                    }).catch(function (error) {
                        console.log(error);
                    });
                }
            });
        }

最佳答案

您还将在组中获得directoryRole ID(从访问 token 中获取)。您可以请求https://graph.microsoft.com/v1.0/me/memberOf来检查详细信息。 Here是图浏览器。

azure - 在AAD访问 token 的组声明中,为什么我得到的GUID不是AAD租户中任何组的objectId?-LMLPHP

关于azure - 在AAD访问 token 的组声明中,为什么我得到的GUID不是AAD租户中任何组的objectId?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56207286/

10-16 23:58