本文介绍如何为应用程序或用户分配的托管标识设置 灵活的联合标识凭据 。 可以使用 Azure 门户、用于应用程序的 Microsoft Graph,或用于用户分配的托管标识的 Azure 资源管理器。 在开始之前,请查看 先决条件中的要求。
先决条件
- 具有活动订阅的 Azure 帐户。 如果还没有帐户,请创建一个帐户。
- 对于应用程序, 请创建应用注册。 向该应用程序授予访问您的外部软件工作负载所针对的 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:
- 在 “值”中,输入要使用的声明匹配表达式。 例如,对于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
}
}