在 AAD 访问令牌的组声明中,为什么我得到的 GUID 不是 AAD 租户中任何组的 objectId?
In the groups claims of an AAD access token, why do I get a GUID that is not the objectId of any group in the AAD tenant?
使用 node.js 的 Microsoft MSAL 快速入门的修改版本(原始 here),我使用隐式流成功收到了 Azure 存储 API 的访问令牌。该令牌包含组声明,但声明中的一个 GUID 似乎与租户中的任何组都不相关。从每个组中删除用户后,声明仍然包含该 GUID(并且不再有其他人):
"groups": [
"2cb3a5e8-4606-4407-9a97-616246393b5d"
],
Google 搜索那个 GUID 没有结果,所以我假设它不是某种众所周知的 GUID。
为什么我在群组声明中得到这个 "unknown" GUID?
涉及的AAD租户是一个非常小的租户,专门供我学习AAD和鉴权使用。因此,它只包含一个组。涉及的用户不是该组的成员。
我查看了 Azure 门户中的用户页面,确实显示该用户是 "not a member of any groups"。 Azure CLI 还显示用户不是任何组的成员:
$ az ad user get-member-groups --upn jurjen@stupendous.org
[]
$
此租户中的完整组列表仅包含一个组,如您所见,其 ObjectID 与我在声明中获得的 GUID 不匹配:
$ az ad group list --query [].objectId --output tsv
b1cc46de-8ce9-4395-9c7c-e4e90b3c0036
$
我还创建了另一个应用程序注册并让它公开一个虚拟 API。当使用那个虚拟 API 作为范围时,我再次成功收到
一个访问令牌,但这个令牌再次包含与单个组声明相同的未知 GUID。
以下是代码中希望相关的部分。
如上所述,首先我检索了 Azure 存储的访问令牌:
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);
});
}
令牌是在这里获取的。我知道 callMSGraph
鉴于令牌的范围在这里不起作用。我从浏览器控制台日志中获取令牌并使用 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);
});
}
});
}
您还将获得组中的目录角色 ID(从访问令牌中获得)。您可以请求https://graph.microsoft.com/v1.0/me/memberOf
查看详情。 Here 是图形浏览器。
使用 node.js 的 Microsoft MSAL 快速入门的修改版本(原始 here),我使用隐式流成功收到了 Azure 存储 API 的访问令牌。该令牌包含组声明,但声明中的一个 GUID 似乎与租户中的任何组都不相关。从每个组中删除用户后,声明仍然包含该 GUID(并且不再有其他人):
"groups": [
"2cb3a5e8-4606-4407-9a97-616246393b5d"
],
Google 搜索那个 GUID 没有结果,所以我假设它不是某种众所周知的 GUID。
为什么我在群组声明中得到这个 "unknown" GUID?
涉及的AAD租户是一个非常小的租户,专门供我学习AAD和鉴权使用。因此,它只包含一个组。涉及的用户不是该组的成员。
我查看了 Azure 门户中的用户页面,确实显示该用户是 "not a member of any groups"。 Azure CLI 还显示用户不是任何组的成员:
$ az ad user get-member-groups --upn jurjen@stupendous.org
[]
$
此租户中的完整组列表仅包含一个组,如您所见,其 ObjectID 与我在声明中获得的 GUID 不匹配:
$ az ad group list --query [].objectId --output tsv
b1cc46de-8ce9-4395-9c7c-e4e90b3c0036
$
我还创建了另一个应用程序注册并让它公开一个虚拟 API。当使用那个虚拟 API 作为范围时,我再次成功收到 一个访问令牌,但这个令牌再次包含与单个组声明相同的未知 GUID。
以下是代码中希望相关的部分。
如上所述,首先我检索了 Azure 存储的访问令牌:
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);
});
}
令牌是在这里获取的。我知道 callMSGraph
鉴于令牌的范围在这里不起作用。我从浏览器控制台日志中获取令牌并使用 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);
});
}
});
}
您还将获得组中的目录角色 ID(从访问令牌中获得)。您可以请求https://graph.microsoft.com/v1.0/me/memberOf
查看详情。 Here 是图形浏览器。