Azure OAuth2 代码流 - 没有组在访问令牌中声明(也没有 "hasgroups")
Azure OAuth2 Code Flow - no groups claim in access token (and no "hasgroups" either)
我正在使用 OAuth2 代码流并尝试将用户组恢复到我的访问令牌中。我正在阅读的所有内容都说我应该看到 groups 声明或 hasgroups 声明,但我都没有看到。
我已经为我的客户端应用更改了应用注册清单中的以下字段:
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": [
"dns_domain_and_sam_account_name"
]
}
],
"saml2Token": []
},
这是我的登录重定向查询字符串示例 url (login.microsoftonline.com)...
client_id=<clientId>
&response_type=code
&redirect_uri=<redirectUri>
&response_mode=query
&scope=<appScope>%20offline_access
&state=67890
这是我使用 authCode (login.microsoftonline.com/{tenantId}/oauth2/v2.0/token)
请求令牌的查询字符串示例
client_id=<clientId>
&scope=<uriEncodedScopes>%20offline_access
&redirect_uri=<uriEncodedRedirectUri>
&code=<authCode>
&client_secret=<uriEncodedClientSecret>
&grant_type=authorization_code
一切正常,但我不知道如何在我的令牌中取回群组信息。
更新
我在两个 url 中都将 %20openid 添加到我的范围,现在我得到一个 id_token,但我仍然没有看到 "groups" 或 "hasgroups" 在任一标记中。
更新
我刚刚将相同的清单更改(groupMembership、optionalClaims)添加到我的 API 应用程序注册(而不是我的客户端)- 公开范围的 API,我没有看到任何变化.访问令牌和 ID 令牌根本没有对组的任何引用。
根据我的测试,它应该可以工作。而你只需要在你的API应用程序注册中配置groupMembershipClaims
,optionalClaims
,参考下面的reason。
你可以参考我下面的测试示例,我用工作帐户或个人帐户尝试过,都可以。
请求授权码(api://3e013fde-xxxxxxa422f3/User.Test
是我的API权限):
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize?
client_id=xxxxxxxxxxxxxxx
&response_type=code
&redirect_uri=https://localhost
&response_mode=query
&scope=openid offline_access api://3e013fde-xxxxxxa422f3/User.Test
&state=12345
请求令牌:
解码 https://jwt.io/ 中的令牌,包含 groups
声明。
注:
我的客户端应用和API应用都是今天创建的,我想在old App Registration(it is not existing in the portal currently)
、app registration portal(it has been moved to the new App Registrations)
、new App Registration(the
中创建的应用可能会有一些差异应用注册in portal currently)
。
从这个 doc:
在我的测试中还有一个奇怪的事情,当我创建一个新的API App Registration时,只设置"groupMembershipClaims": "SecurityGroup"
而不设置optionalClaims
,清单将如下所示。
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [],
"saml2Token": []
}
则Access token
不包含groups
,ID token
有groups
。
如果我用你的设置,Access token
就会有 groups
。
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": [
"dns_domain_and_sam_account_name"
]
}
],
"saml2Token": []
}
但是当我将它 return 设置为
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [],
"saml2Token": []
}
Access token
还有groups
。
来自门户 - Token configuration (preview)
和此文档 - Configure group claims for applications with Azure Active Directory (Public Preview)
,该功能应该处于预览状态,它可能是一个错误(我不确定)。
所以综上所述,我推荐大家使用两款新的App试试看。
我正在使用 OAuth2 代码流并尝试将用户组恢复到我的访问令牌中。我正在阅读的所有内容都说我应该看到 groups 声明或 hasgroups 声明,但我都没有看到。
我已经为我的客户端应用更改了应用注册清单中的以下字段:
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": [
"dns_domain_and_sam_account_name"
]
}
],
"saml2Token": []
},
这是我的登录重定向查询字符串示例 url (login.microsoftonline.com)...
client_id=<clientId>
&response_type=code
&redirect_uri=<redirectUri>
&response_mode=query
&scope=<appScope>%20offline_access
&state=67890
这是我使用 authCode (login.microsoftonline.com/{tenantId}/oauth2/v2.0/token)
请求令牌的查询字符串示例client_id=<clientId>
&scope=<uriEncodedScopes>%20offline_access
&redirect_uri=<uriEncodedRedirectUri>
&code=<authCode>
&client_secret=<uriEncodedClientSecret>
&grant_type=authorization_code
一切正常,但我不知道如何在我的令牌中取回群组信息。
更新
我在两个 url 中都将 %20openid 添加到我的范围,现在我得到一个 id_token,但我仍然没有看到 "groups" 或 "hasgroups" 在任一标记中。
更新
我刚刚将相同的清单更改(groupMembership、optionalClaims)添加到我的 API 应用程序注册(而不是我的客户端)- 公开范围的 API,我没有看到任何变化.访问令牌和 ID 令牌根本没有对组的任何引用。
根据我的测试,它应该可以工作。而你只需要在你的API应用程序注册中配置groupMembershipClaims
,optionalClaims
,参考下面的reason。
你可以参考我下面的测试示例,我用工作帐户或个人帐户尝试过,都可以。
请求授权码(api://3e013fde-xxxxxxa422f3/User.Test
是我的API权限):
https://login.microsoftonline.com/<tenant-id>/oauth2/v2.0/authorize?
client_id=xxxxxxxxxxxxxxx
&response_type=code
&redirect_uri=https://localhost
&response_mode=query
&scope=openid offline_access api://3e013fde-xxxxxxa422f3/User.Test
&state=12345
请求令牌:
解码 https://jwt.io/ 中的令牌,包含 groups
声明。
注:
我的客户端应用和API应用都是今天创建的,我想在old App Registration(it is not existing in the portal currently)
、app registration portal(it has been moved to the new App Registrations)
、new App Registration(the
中创建的应用可能会有一些差异应用注册in portal currently)
。
从这个 doc:
在我的测试中还有一个奇怪的事情,当我创建一个新的API App Registration时,只设置"groupMembershipClaims": "SecurityGroup"
而不设置optionalClaims
,清单将如下所示。
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [],
"saml2Token": []
}
则Access token
不包含groups
,ID token
有groups
。
如果我用你的设置,Access token
就会有 groups
。
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [
{
"name": "groups",
"source": null,
"essential": false,
"additionalProperties": [
"dns_domain_and_sam_account_name"
]
}
],
"saml2Token": []
}
但是当我将它 return 设置为
"groupMembershipClaims": "SecurityGroup",
"optionalClaims": {
"idToken": [],
"accessToken": [],
"saml2Token": []
}
Access token
还有groups
。
来自门户 - Token configuration (preview)
和此文档 - Configure group claims for applications with Azure Active Directory (Public Preview)
,该功能应该处于预览状态,它可能是一个错误(我不确定)。
所以综上所述,我推荐大家使用两款新的App试试看。