你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn 。
Azure 容器应用中的托管标识
本文内容
Microsoft Entra ID 中的托管标识允许容器应用访问其他受 Microsoft Entra 保护的资源。 有关 Microsoft Entra ID 中的托管标识的详细信息,请参阅 Azure 资源的托管标识 。
可为容器应用授予两种类型的标识:
系统分配的标识与容器应用相关联,删除该容器应用也会删除该标识。 一个应用只能具有一个系统分配的标识。
用户分配的标识 是可以分配给容器应用和其他资源的独立 Azure 资源。 一个容器应用可以有多个用户分配的标识。 用户分配的标识存在,直到删除它们。
为什么使用托管标识?
可以在正在运行的容器应用中使用托管标识向支持 Microsoft Entra 身份验证的任何服务 进行身份验证。
使用托管标识:
常见用例
系统分配的标识最适合用于具有以下特征的工作负载:
用户分配的标识非常适合用于具有以下特征的工作负载:
在多个资源上运行并可共享单个标识
需要预先获取对安全资源的授权
限制
不支持在缩放规则中使用托管标识。 需要在缩放规则的secretRef
中包含连接字符串或键。
初始化容器 无法访问托管标识。
可通过以下方式配置托管标识:
Azure 门户
Azure CLI
Azure 资源管理器 (ARM) 模板
在正在运行的容器应用中添加、删除或修改托管标识时,该应用不会自动重启,且不会创建新的修订版。
注意
将托管标识添加到在 2022 年 4 月 11 日之前部署的容器应用时,必须创建新的修订版。
添加系统分配的标识
在 Azure 门户中转到你的容器应用。
在“设置”组中,选择“标识” 。
在“系统分配的”选项卡中,将“状态”切换为“启用” 。
选择“保存” 。
运行 az containerapp identity assign
命令以创建系统分配标识:
az containerapp identity assign --name myApp --resource-group myResourceGroup --system-assigned
ARM 模板可用于自动部署容器应用和资源。 若要添加系统分配的标识,请将 identity
节添加到 ARM 模板。
"identity": {
"type": "SystemAssigned"
}
添加系统分配的标识将告知 Azure 为应用程序创建和管理标识。 有关完整的 ARM 模板示例,请参阅 ARM API 规范 。
某些 Azure CLI 命令(包括 az containerapp create
和 az containerapp job create
)支持 YAML 文件进行输入。 要添加系统分配的标识,请将 identity
部分添加到 YAML 文件。
identity:
type: SystemAssigned
添加系统分配的标识将告知 Azure 为应用程序创建和管理标识。 有关完整的 YAML 模板示例,请参阅 ARM API 规范 。
添加用户分配的标识
为容器应用配置用户分配的标识需要先创建该标识,然后将其资源标识符添加到该容器应用的配置。 可以通过 Azure 门户或 Azure CLI 创建用户分配的标识。 有关创建和管理用户分配的标识的信息,请参阅管理用户分配的托管标识 。
首先,需要创建用户分配的标识资源。
根据管理用户分配的托管标识 中介绍的步骤创建用户分配的托管标识资源。
在 Azure 门户中转到你的容器应用。
在“设置”组中,选择“标识” 。
在“用户分配”选项卡中,选择“添加”。
搜索并选择之前创建的标识。
选择 添加 。
创建用户分配的标识。
az identity create --resource-group <GROUP_NAME> --name <IDENTITY_NAME> --output json
记下新标识的 id
属性。
运行 az containerapp identity assign
命令以将标识分配给应用。 identities 参数是一个空格分隔列表。
az containerapp identity assign --resource-group <GROUP_NAME> --name <APP_NAME> \
--user-assigned <IDENTITY_RESOURCE_ID>
请将 <IDENTITY_RESOURCE_ID>
替换为标识的 id
属性。 若要分配多个用户分配的标识,请在 --user-assigned
参数中提供标识 ID 的空格分隔列表。
若要添加一个或多个用户分配的标识,请将 identity
节添加到 ARM 模板。 请将 <IDENTITY1_RESOURCE_ID>
和 <IDENTITY2_RESOURCE_ID>
替换为要添加的标识的资源标识符。
通过将一个项作为键添加到包含标识资源标识符的 userAssignedIdentities
对象,来指定每个用户分配的标识。 使用空对象作为值。
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"<IDENTITY1_RESOURCE_ID>": {},
"<IDENTITY2_RESOURCE_ID>": {}
}
}
有关完整的 ARM 模板示例,请参阅 ARM API 规范 。
注意
一个应用程序可以同时具有系统分配的标识和用户分配的标识。 在这种情况下,type
属性的值会是SystemAssigned,UserAssigned
。
要添加一个或多个用户分配的标识,请将 identity
部分添加到 YAML 配置文件。 请将 <IDENTITY1_RESOURCE_ID>
和 <IDENTITY2_RESOURCE_ID>
替换为要添加的标识的资源标识符。
通过将一个项作为键添加到包含标识资源标识符的 userAssignedIdentities
对象,来指定每个用户分配的标识。 使用空对象作为值。
identity:
type: UserAssigned
userAssignedIdentities:
<IDENTITY1_RESOURCE_ID>: {}
<IDENTITY2_RESOURCE_ID>: {}
有关完整的 YAML 模板示例,请参阅 ARM API 规范 。
注意
一个应用程序可以同时具有系统分配的标识和用户分配的标识。 在这种情况下,type
属性将为 SystemAssigned,UserAssigned
。
若要添加一个或多个用户分配的标识,请将节 identity
添加到 Bicep 模板。 请将 <IDENTITY1_RESOURCE_ID>
和 <IDENTITY2_RESOURCE_ID>
替换为要添加的标识的资源标识符。
通过将一个项作为键添加到包含标识资源标识符的 userAssignedIdentities
对象,来指定每个用户分配的标识。 使用空对象作为值。
identity: {
type: 'UserAssigned'
userAssignedIdentities: {
<IDENTITY1_RESOURCE_ID>: {}
<IDENTITY2_RESOURCE_ID>: {}
}
}
有关完整的 Bicep 模板示例,请参阅 Microsoft.App containerApps Bicep、ARM 模板和 Terraform AzAPI 参考 。
注意
一个应用程序可以同时具有系统分配的标识和用户分配的标识。 在这种情况下,type
属性将为 SystemAssigned,UserAssigned
。
对于某些资源,需要为应用的托管标识配置角色分配以授予访问权限。 否则,即使对该标识使用有效令牌,应用对服务(例如 Azure 密钥保管库和 Azure SQL 数据库)的调用也会被拒绝。 若要详细了解 Azure 基于角色的访问控制 (Azure RBAC),请参阅什么是 RBAC? 。 若详细了解支持 Microsoft Entra 令牌的资源,请参阅支持 Microsoft Entra 身份验证的 Azure 服务 。
重要
用于托管标识的后端服务将为每个资源 URI 维护缓存约 24 小时。 如果你更新特定目标资源的访问策略并立即检索该资源的令牌,则可以继续获取具有过时权限的缓存令牌,直到该令牌过期。 不支持强制刷新令牌。
在应用代码中连接到 Azure 服务
使用托管标识,应用可以获取令牌来访问使用 Microsoft Entra ID 的 Azure 资源,例如 Azure SQL 数据库、Azure Key Vault 和 Azure 存储。 这些令牌代表访问资源的应用程序,而不是应用程序的任何特定用户。
容器应用提供内部可访问的 REST 终结点 用于检索令牌。 REST 终结点可从具有标准 HTTP GET
请求的应用内使用,可以使用首选语言的通用 HTTP 客户端发送该请求。 对于 .NET、JavaScript、Java 和 Python,Azure 标识客户端库提供基于此 REST 终结点的抽象。 可以将凭据对象添加到特定于服务的客户端,以连接到其他 Azure 服务。
注意
使用 Azure 标识客户端库时,需要明确指定用户分配的托管标识客户端 ID。
使用以下脚本通过指定 Azure 服务的资源 URI 从本地终结点检索令牌。 请将占位符替换为用于获取令牌的资源 URI。
$resourceURI = "https://<AAD-resource-URI>"
$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&api-version=2019-08-01"
$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI
$accessToken = $tokenResponse.access_token
原始 HTTP GET
请求如以下示例所示。
从 IDENTITY_ENDPOINT
环境变量获取令牌终结点 URL。 x-identity-header
包含存储在 IDENTITY_HEADER
环境变量中的 GUID。
GET http://localhost:42356/msi/token?resource=https://vault.azure.net&api-version=2019-08-01 HTTP/1.1
x-identity-header: 853b9a84-5bfa-4b22-a3f3-0b9a43d9ad8a
响应如以下示例所示:
HTTP/1.1 200 OK
Content-Type: application/json
{
"access_token": "eyJ0eXAi…",
"expires_on": "1586984735",
"resource": "https://vault.azure.net",
"token_type": "Bearer",
"client_id": "5E29463D-71DA-4FE0-8E69-999B57DB23B0"
}
此响应与Microsoft Entra 服务到服务访问令牌请求的响应 相同。 要访问密钥保管库,请将access_token
的值添加到客户端与保管库的连接。
REST 终结点参考
使用托管标识的容器应用通过定义两个环境变量来公开标识终结点:
IDENTITY_ENDPOINT
:容器应用可从中请求令牌的本地 URL。
IDENTITY_HEADER
:用于帮助缓解服务器端请求伪造 (SSRF) 攻击的标头。 该值由平台轮换。
要获取资源的令牌,请对该终结点发起 HTTP GET
请求,并包括以下参数:
参数名称
In
说明
resource
查询
应获取其令牌的资源的 Microsoft Entra 资源 URI。 该资源可以是支持 Microsoft Entra 身份验证的 Azure 服务 或任何其他资源 URI 之一。
api-version
查询
要使用的令牌 API 版本。 使用“2019-08-01”或更高版本。
X-IDENTITY-HEADER
标头
IDENTITY_HEADER
环境变量的值。 此标头可以缓解服务器端请求伪造 (SSRF) 攻击。
client_id
查询
(可选)要使用的用户分配的标识的客户端 ID。 不能在包含 principal_id
、mi_res_id
或 object_id
的请求中使用。 如果省略所有 ID 参数(client_id
、principal_id
、object_id
和 mi_res_id
),则使用系统分配的标识。
principal_id
查询
(可选)要使用的用户分配的标识的主体 ID。 object_id
是可以改用的别名。 不能在包含 client_id、mi_res_id 或 object_id 的请求中使用。 如果省略所有 ID 参数(client_id
、principal_id
、object_id
和 mi_res_id
),则使用系统分配的标识。
mi_res_id
查询
(可选)要使用的用户分配的标识的 Azure 资源 ID。 不能在包含 principal_id
、client_id
或 object_id
的请求中使用。 如果省略所有 ID 参数(client_id
、principal_id
、object_id
和 mi_res_id
),则使用系统分配的标识。
重要
如果你要尝试获取用户分配的标识的令牌,必须包含一个可选属性。 否则,令牌服务将尝试为系统分配的标识获取令牌,而该令牌不一定存在。
查看托管标识
可以使用以下 Azure CLI 命令显示系统分配的托管标识和用户分配的托管标识。 输出会显示分配给容器应用的所有托管标识的托管标识类型、租户 ID 和主体 ID。
az containerapp identity show --name <APP_NAME> --resource-group <GROUP_NAME>
删除托管标识
删除系统分配的标识时,会从 Microsoft Entra ID 中删除标识。 删除容器应用资源本身时,系统分配的标识也会从 Microsoft Entra ID 中自动删除。 从容器应用中删除用户分配的托管标识不会导致从 Microsoft Entra ID 中删除这些标识。
在应用页面的左侧导航中,向下滚动到“设置”组。
选择“标识”。 然后,根据标识类型执行以下步骤:
系统分配的标识:在“系统分配”选项卡中,将“状态”切换为“关闭”。 选择“保存” 。
用户分配的标识:选择“用户分配”选项卡,选中该标识的复选框,然后选择“删除”。 请选择“是”以确认。
若要删除系统分配的标识,请执行以下操作:
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> --system-assigned
要删除一个或多个用户分配的标识:
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> \
--user-assigned <IDENTITY1_RESOURCE_ID> <IDENTITY2_RESOURCE_ID>
若要删除所有用户分配的标识,请执行以下操作:
az containerapp identity remove --name <APP_NAME> --resource-group <GROUP_NAME> \
--user-assigned <IDENTITY1_RESOURCE_ID> <IDENTITY2_RESOURCE_ID>
若要删除所有标识,请在 ARM 模板中将容器应用标识的 type
设置为 None
:
"identity": {
"type": "None"
}
要删除所有标识,请将容器应用的标识 type
设置为 YAML 配置文件中的 None
:
identity:
type: None
若要移除所有标识,请将容器应用的标识的 type
设置为 Bicep 模板中的 None
:
identity: {
type: 'None'
}
后续步骤