设置灵活的联合身份凭证(预览版)

本文介绍如何为应用程序或用户分配的托管标识设置 灵活的联合标识凭据 。 可以使用 Azure 门户、用于应用程序的 Microsoft Graph,或用于用户分配的托管标识的 Azure 资源管理器。 在开始之前,请查看 先决条件中的要求。

先决条件

了解凭据属性

财产 Description
受众 可出现在外部令牌中的目标受众。 此为必填字段,应设置为 api://AzureADTokenExchange Microsoft Entra ID。 它说明 Microsoft 标识平台应接受传入令牌中名为 aud 的声明。 此值在你的外部标识提供者中代表 Microsoft Entra ID,并且在所有标识提供者中没有固定值。因此,你可能需要在 IdP 中创建一个新的应用程序注册,以便用作此令牌的受众。
颁发者 外部标识提供者的 URL。 必须与正在交换的外部令牌的 issuer 声明匹配。
subject 外部身份提供程序中的外部软件工作负载标识符。 与受众值类似,该值没有固定格式,因为每个 IdP 都使用自己的格式,格式有时是 GUID,有时是冒号分隔的标识符,有时是任意字符串。 此处的值必须与提供给 Microsoft Entra ID 的令牌中的 sub 声明匹配。 如果已定义 subject,则 claimsMatchingExpression 必须设置为 null。
name 用于标识凭据的唯一字符串。 对于应用程序,此属性是备用密钥,你可以使用它通过 GET 操作引用凭据。 对于用户分配的托管标识,凭据名称是 Azure 资源管理器 资源路径的一部分。
claimsMatchingExpression 包含 value 和 languageVersion 两个属性的新复杂类型。 值用于定义表达式,languageVersion 用于定义所使用的灵活联合标识凭据表达式语言(FFL)的版本。 languageVersion 应始终设置为 1。 如果定义了 claimsMatchingExpression,则必须将 subject 设为 null。

设置灵活的联合标识凭据

对于 GitHub,灵活的联合身份凭据必须与 sub 声明以及以下一个或两个不可变声明相匹配:

  • repository_id 标识工作流运行位置的存储库。
  • repository_owner_id 标识存储库所有者。

无论 sub 使用的是基于名称的、自定义的还是不可变的格式,这些声明都是必需的。

在 GitLab 中使用可变主题时,灵活的联合标识凭据表达式必须与声明匹配subproject_id。

若要在Azure门户中创建凭据,请执行以下操作:

  • 导航到 Microsoft Entra ID,然后选择要在其中配置联合标识凭据的应用程序。
  • 在左侧导航窗格中,选择“证书和密码”。
  • 在“联合凭据”选项卡中,选择“+ 添加凭据”。
  • 在显示的“添加凭据”窗口中,从“联合凭据方案”旁边的下拉菜单中选择“其他颁发者”。
  • 在 “连接帐户”下,输入外部标识提供者的 颁发者 URL。 例如:
    • GitHub:https://token.actions.githubusercontent.com
    • GitLab:https://gitlab.example.com
    • Terraform Cloud:https://app.terraform.io
  • 在 “值”中,输入要使用的声明匹配表达式。 例如,对于GitHub,请输入 claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*' and claims['repository_id'] eq '456789'。
  • 选择“添加”以保存凭据。

灵活联合标识凭据的更多示例

灵活联合标识凭据可以使用不同的颁发者,例如 GitHub、GitLab 和 Terraform Cloud。 使用以下选项卡为每个颁发者设置灵活联合标识凭据。

此示例演示如何为 GitHub 设置灵活的联合身份凭据,并为 job_workflow_ref 声明设置表达式。 从 GitHub OpenID Connect(OIDC)令牌中获取 repository_id 和 repository_owner_id 的数值。 用于 repository_id 将凭据绑定到存储库。

{
  "audiences": [
    "api://AzureADTokenExchange"
  ],
  "name": "MyGitHubFlexibleFIC",
  "issuer": "https://token.actions.githubusercontent.com",
  "claimsMatchingExpression": {
    "value": "claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*' and claims['repository_id'] eq '456789' and claims['job_workflow_ref'] matches 'contoso/contoso-prod/.github/workflows/*.yml@refs/heads/main'",
    "languageVersion": 1
  }
}

若要要求存储库与特定所有者一起保留,还需匹配 repository_owner_id:

{
  "audiences": [
    "api://AzureADTokenExchange"
  ],
  "name": "MyGitHubOwnerFlexibleFIC",
  "issuer": "https://token.actions.githubusercontent.com",
  "claimsMatchingExpression": {
    "value": "claims['sub'] matches 'repo:contoso/contoso-repo:ref:refs/heads/*' and claims['repository_id'] eq '456789' and claims['repository_owner_id'] eq '123456' and claims['job_workflow_ref'] matches 'contoso/contoso-prod/.github/workflows/*.yml@refs/heads/main'",
    "languageVersion": 1
  }
}