Azure广告:如何使代币具有;hasgroups";索赔?

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": {

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

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

"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的权限
我们使用以下代码来获取令牌(用C#):

其中:

  • \u用户名
    \u密码
    来自具有多个组的用户
  • \u clientId
    是本机应用程序的应用程序id,即带有
    “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 );