Azure AD:如何使令牌具有“ hasgroups”声明?

时间:2018-09-18 00:40:56

标签: azure azure-active-directory claims-based-identity adal azure-security

我们的应用程序允许向组分配权限,这意味着对于每个用户,我们必须可靠地确定组成员身份。用户提供定期通过ADAL获得的令牌(某些使用.NET,其他使用NodeJS,其他使用CLI)。

某些用户似乎发送带有以下声明的令牌:

"hasgroups": true,

该声明记录在Azure AD token reference页中。

我们想为此添加一个测试用例,但是在执行步骤herehere之后,我们总是以带有以下声明的令牌结尾:

"_claim_names": {
  "groups": "src1"
},
"_claim_sources": {
  "src1": {
    "endpoint": "https://graph.windows.net/{redacted}/users/{redacted}/getMemberObjects"
  }
},

我们的设置有什么问题?为什么我们无法获得hasgroups声明?

以下是一些其他信息:

  • 应用程序类型是本机(不是WebApi)。
  • 清单说"oauth2AllowImplicitFlow": true
  • 该应用程序有权访问Azure Key Vault。

我们使用以下代码获取令牌(在C#中):

var userCredential = new UserCredential( _userName, _password );
result = context.AcquireToken( _resource, _clientId, userCredential );

位置:

  • _userName_password来自具有很多组的用户。
  • _clientId是本机应用程序的应用程序ID-具有"oauth2AllowImplicitFlow": true的应用程序ID。
  • _resourcehttps://vault.azure.net

令牌已正确发出。唯一的问题是它显示_claim_names_claims_sources而不是hasgroups

2 个答案:

答案 0 :(得分:1)

  

其中:•_userName和_password来自具有多个组的用户。

由于用户是许多组的一部分(此处假定为6个或更多)。.Azure AD令牌将返回一个组超额指示器,而不是“组”声明中的实际组ID。我想您知道这一点,因此是故意这样做的。

var userCredential = new UserCredential( _userName, _password );
result = context.AcquireToken( _resource, _clientId, userCredential );

由于您是在使用C#代码的基于.NET的应用程序中获取令牌的,因此令牌响应的长度实际上不受限制(例如在Web SPA的情况下,令牌响应作为URI片段和URL长度返回)有限制)

查看文档中的“ hasgroups”和“ groups:src1”声明具有相同的意图,即告诉我们有太多的组作为令牌的一部分返回。尽管有细微的差别:

  • 在应用URL限制的情况下,“ hasgroups”将作为true发送(例如SPA的隐式授权流)

  • 在长度不受限制的情况下(如您的情况),Azure AD仍不会返回所有组以确保令牌不会太大,但是它将发送有关的更多信息通过发送有关如何查询所有组的信息来找到所有组。在这种情况下,它将发送带有源信息的“ groups:src1”和“ _claim_sources”,而不仅仅是“ hasgroups”

Claims in id_tokens enter image description here

答案 1 :(得分:-1)

对于任何对此有更多了解的人。请参阅Doc saml-tokens

enter image description here

注意 enter image description here

来源:Azure Sample Link