通过


灵活的联合标识凭据(预览版)

灵活的联合标识凭据是Microsoft Entra 工作负荷 ID 的高级功能,可增强现有的联合标识凭据模型。 本文介绍这些凭据的工作原理、其优点和当前限制。

灵活的联合标识凭据允许使用受限的表达式语言来匹配传入的 subject 声明,并允许包含自定义声明,帮助减少管理开销和解决工作负载标识联合中的规模限制。 如果希望通过 Microsoft Entra 简化外部工作负荷的身份验证,本指南提供了使用此强大功能所需的见解和步骤。

为何使用灵活的联合标识凭据?

在将联合标识凭据中定义的 subjectissueraudience 与发送到 Microsoft Entra 的令牌中包含的 subjectissueraudience 进行比较时,工作负载标识联合内联合标识凭据的当前行为要求显式匹配。 结合给定应用程序或用户分配的托管标识的当前限制为 20 个联合标识凭据时,可以快速达到规模限制。

灵活的联合标识凭据通过允许在与传入 subject 声明匹配时使用受限表达式语言来扩展现有的联合标识凭据模型。 它还可以用于通过在联合标识凭据中包含某些允许的自定义声明,将联合标识凭据授权模型扩展到超出 subjectissueraudience 声明的范围。

在尝试使用 Microsoft Entra 对外部工作负荷进行身份验证时,灵活的联合标识凭据有助于减少管理开销,并解决工作负荷联合身份验证实现中的缩放限制。

灵活联合标识凭据的工作原理是什么?

灵活的联合标识凭据不会更改联合标识凭据提供的基线功能。 这些信任关系仍然用于指示应用程序应信任来自外部身份提供者 (IdP) 的哪些令牌。 相应地,它们通过使某些以前需要多个联合标识凭据的情境可以在一个灵活的联合标识凭据下进行管理,来增强联合标识凭据的功能。 一些示例包括:

  • 具有各种工作流的 GitHub 存储库,每个工作流在不同的分支上运行(或跨分支使用)。 以前,每个分支都需要一个唯一的联合标识凭据,才能跨分支运行工作流。 使用灵活的联合标识凭据,可以在单个联合标识凭据下管理此方案。
  • Terraform 云 run_phases 计划,每个计划都需要唯一的联合标识凭据。 使用灵活的联合标识凭据,可以在单个灵活的联合标识凭据下进行管理。
  • 可重用的 GitHub Actions 工作流,其中通配符可用于 GitHub 的自定义 job_workflow_ref 声明。

注意

目前提供了灵活的联合标识凭据支持,以便与 GitHub、GitLab 和 Terraform Cloud 颁发的令牌进行匹配。 此支持仅适用于当前在应用程序对象上配置的联合标识凭据。 只能通过 Microsoft Graph 或 Azure 门户创建和管理灵活的联合标识凭据。

灵活的联合标识凭据语言结构

灵活的联邦身份凭证表达式由声明查找、运算符和比较对象三个部分组成。 有关每个部分的细分,请参阅下表:

名字 描述
索赔查询 声明查找必须遵循 claims['<claimName>'] 模式 claims['sub']
操作员 运算符部分必须仅包括运算符名称,用单个空格与声明查找和比较字分隔 matches
比较字 比较字包含你打算将查找中指定的声明与之进行比较的内容 - 必须用单引号引起来 'repo:contoso/contoso-repo:ref:refs/heads/*'

组合起来,一个灵活的联合标识凭据表达式类似于以下 JSON 对象:

"claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*'."

通过 Microsoft Graph 设置联合标识凭据

为了适应灵活的联合标识凭据功能,federatedIdentityCredentials 资源正使用新的 claimsMatchingExpression 属性进行扩展。 除此之外,subject 属性现在可为 null。 claimsMatchingExpressionsubject 属性互斥,因此不能在联合标识凭据中定义这两个属性。

  • audiences:可出现在外部令牌中的受众。 此字段是必需的,对于 Microsoft Entra ID 应设置为 api://AzureADTokenExchange。 它表示 Microsoft 标识平台应该在传入令牌的 aud 声明中接受的内容。 此值表示外部标识提供者中的 Microsoft Entra ID,且在标识提供程序中没有固定值。你可能需要在 IdP 中创建新应用程序注册,以用作此令牌的受众。
  • issuer:外部身份提供者的链接地址。 必须与交换的外部令牌的颁发者声明匹配。
  • subject:外部标识提供者中外部软件工作负载的标识符。 与受众值一样,它没有固定格式,因为每个 IdP 都使用自己的格式-有时是 GUID,有时是冒号分隔标识符,有时是任意字符串。 此处的值必须与提供给 Microsoft Entra ID 的令牌中的 sub 声明匹配。 如果定义了 subject,则必须将 claimsMatchingExpression 设置为 null。
  • name:用于标识凭据的唯一字符串。 此属性是备用键,其值可用于通过 GETUPSERT 操作引用联合标识凭据。
  • claimsMatchingExpression:包含两个属性的新复杂类型,valuelanguageVersion。 值用于定义表达式,languageVersion 用于定义所使用的灵活联合标识凭据表达式语言(FFL)的版本。 languageVersion 应始终设置为 1。 如果定义了 claimsMatchingExpression,则必须将 subject 设置为 null。

灵活的联合标识凭据表达式语言功能

灵活的联合标识凭据目前支持在启用的颁发者中使用几个运算符。 在灵活的联合标识凭据表达式语言中,单引号被解释为转义字符。

操作员 描述
matches 允许对指定声明使用单字符(由 ? 表示)和多字符(由 * 表示)通配符匹配 "claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*'"
"claims['sub'] matches 'repo:contoso/contoso-repo-*:ref:refs/heads/????'"
eq 用于明确匹配指定的声明 "claims['sub'] eq 'repo:contoso/contoso-repo:ref:refs/heads/main'"
and 用于将表达式与多个声明组合在一起的布尔运算符 "claims['sub'] eq 'repo:contoso/contoso-repo:ref:refs/heads/main' and claims['job_workflow_ref'] matches 'foo-org/bar-repo /.github/workflows/*@refs/heads/main'"

按平台分类的颁发者 URL、支持的声明和运算符

需要根据所使用的平台,实现不同的颁发者 URL、声明和运算符。 使用以下选项卡选择所选的平台。

支持的颁发者 URL:https://token.actions.githubusercontent.com

每个声明支持的声明和运算符:

  • 声明 sub 支持运算符 eqmatches
  • 声明 job_workflow_ref 支持运算符 eqmatches

Azure CLI、Azure PowerShell 和 Terraform 供应商

Azure CLI、Azure PowerShell 或 Terraform 提供程序中尚不存在显式灵活的联合标识凭据支持。 如果尝试使用任何这些工具配置灵活的联合标识凭据,则会看到错误。 此外,如果通过 Microsoft Graph 或 Azure 门户配置灵活的联合标识凭据,并尝试使用其中任一工具读取该灵活的联合标识凭据,则会看到错误。

可以使用 Azure CLI 的 az rest 方法为灵活的联合标识凭据创建和管理发出 REST API 请求。

az rest --method post \
    --url https://graph.microsoft.com/beta/applications/{objectId}/federatedIdentityCredentials
    --body "{'name': 'FlexFic1', 'issuer': 'https://token.actions.githubusercontent.com', 'audiences': ['api://AzureADTokenExchange'], 'claimsMatchingExpression': {'value': 'claims[\'sub\'] matches \'repo:contoso/contoso-org:ref:refs/heads/*\'', 'languageVersion': 1}}"