【问题标题】:Azure AD: How to make tokens have the "hasgroups" claim?Azure AD:如何使令牌具有“hasgroups”声明?
【发布时间】:2018-09-18 00:40:56
【问题描述】:

我们的应用程序允许为组分配权限,这意味着对于每个用户,我们必须可靠地确定组成员身份。用户出示通过 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 声明?

以下是一些附加信息:

  • 应用程序类型是 Native(不是 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

【问题讨论】:

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


    【解决方案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

    【讨论】:

    • 这是有道理的。您知道 AAD 如何“知道”令牌请求是否有长度限制吗?我正在查看token REST API 并找不到限制请求的参数。我应该使用一些标准的 HTTP 标头吗?
    • 我认为这将根据使用的 OAuth 授权来决定。因此,根据文档,URL 限制仅与来自 SPA 的隐式授权流相关
    • 我怀疑它是根据response_mode 参数决定的。我发现 ADAL for .NET 不会发送它,并且隐式授权要求它是 fragment:link。但我还没有进行测试以确认。
    • 很遗憾没有。似乎获得此类令牌的唯一方法是使用基于 Web 的交互式登录...
    【解决方案2】:

    对于任何对此有更多了解的人。请参考文档saml-tokens

    注意

    来源:Azure Sample Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-16
      • 2020-02-13
      • 2018-12-31
      • 2022-10-07
      • 2021-09-17
      • 1970-01-01
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多