Azure广告:如何使代币具有;hasgroups";索赔?
我们的应用程序允许为组分配权限,这意味着对于每个用户,我们必须可靠地确定组成员身份。用户提供使用ADAL定期获取的令牌(一些使用.NET,其他使用NodeJS,其他使用CLI) 某些用户似乎正在发送具有以下声明的令牌:Azure广告:如何使代币具有;hasgroups";索赔?,azure,azure-active-directory,claims-based-identity,adal,azure-security,Azure,Azure Active Directory,Claims Based Identity,Adal,Azure Security,我们的应用程序允许为组分配权限,这意味着对于每个用户,我们必须可靠地确定组成员身份。用户提供使用ADAL定期获取的令牌(一些使用.NET,其他使用NodeJS,其他使用CLI) 某些用户似乎正在发送具有以下声明的令牌: "hasgroups": true, 该声明记录在页面中 我们希望为此添加一个测试用例,但在完成以下步骤和步骤后,我们始终会得到一个具有以下声明的令牌: "_claim_names": { "groups": "src1" }, "_claim_sources": {
"hasgroups": true,
该声明记录在页面中
我们希望为此添加一个测试用例,但在完成以下步骤和步骤后,我们始终会得到一个具有以下声明的令牌:
"_claim_names": {
"groups": "src1"
},
"_claim_sources": {
"src1": {
"endpoint": "https://graph.windows.net/{redacted}/users/{redacted}/getMemberObjects"
}
},
我们的设置有什么问题?为什么我们不能得到hasgroups
索赔
以下是一些附加信息:
- 应用程序类型为本机(不是WebApi)
- 清单显示“oauth2AllowImplicitFlow”:true
- 该应用程序被授予访问Azure Key Vault的权限
和\u用户名
来自具有多个组的用户\u密码
是本机应用程序的应用程序id,即带有\u clientId
“oauth2AllowImplicitFlow”:true的应用程序id
是\u资源
https://vault.azure.net
\u索赔\u名称
和\u索赔\u来源
,而不是hasgroups
其中:•_用户名和_密码来自具有多个组的用户
由于用户是许多组的一部分(假设这里有6个或更多)。。Azure AD token将返回一个groups overage指示器,而不是“groups”声明中的实际组ID。我想你知道这一点,因此故意这么做
由于您使用C#代码在基于.NET的应用程序中获取令牌,因此令牌响应的长度实际上没有限制(就像web SPA的情况一样,它作为URI片段返回,URL长度有限制)
查看文档,“hasgroups”和“groups:src1”声明都有相同的意图,即告诉您作为令牌的一部分返回的组太多了。尽管有细微的区别:
- 在URL限制适用的情况下,“hasgroups”将作为true发送(如SPA的隐式授权流)
- 在长度不受限制的情况下(如您的情况),Azure AD仍然不会返回所有组,以确保令牌不会变得太大,但它会通过发送有关如何查询所有组的信息来发送有关如何访问所有组的更多信息。在本例中,它发送带有源信息的“groups:src1”和“\u claim\u sources”,而不仅仅是“hasgroups”
任何人都可以了解更多信息。请参阅文件 注意
资料来源:这很有道理。您知道AAD如何“知道”令牌请求是否有长度限制吗?我正在查看,但找不到限制请求的参数。我应该使用一些标准的HTTP头吗?我想这将根据使用哪种OAuth授权来决定。因此,URL限制将仅与SPA根据文件规定的隐式授权流相关,我怀疑这是根据
response\u mode
参数决定的。我发现ADAL for.NET没有发送它,而隐式授权要求它是片段:。但我还没有测试以确认。不幸的是没有。似乎获得这种令牌的唯一方法是使用基于web的交互式登录。。。
var userCredential = new UserCredential( _userName, _password );
result = context.AcquireToken( _resource, _clientId, userCredential );
var userCredential = new UserCredential( _userName, _password );
result = context.AcquireToken( _resource, _clientId, userCredential );