使用系统分配的托管标识向 Azure 资源验证 Azure 托管的 Python 应用

向其他 Azure 资源验证 Azure 托管应用的建议方法是使用 托管标识。 大多数 Azure 服务 都支持此方法,包括 Azure 应用服务、Azure 容器应用和 Azure 虚拟机上托管的应用。 在 身份验证概述 页上详细了解不同的身份验证技术和方法。 在前面的部分中,你将了解:

  • 基本托管标识概念
  • 如何为应用创建系统分配的托管标识
  • 如何将角色分配给系统分配的托管标识
  • 如何通过应用代码使用系统分配的托管标识进行身份验证

基本托管标识概念

托管标识使应用能够安全地连接到其他 Azure 资源,而无需使用密钥或其他应用程序机密。 在内部,Azure 会跟踪身份以及其被允许连接的资源。 Azure 使用此信息自动获取应用的 Microsoft Entra 令牌,以允许它连接到其他 Azure 资源。

配置托管应用时,需要考虑两种类型的托管标识:

  • 系统分配的托管身份是在 Azure 资源上直接启用的,并绑定于其生命周期。 当资源被删除时,Azure 会自动为你删除标识。 系统分配的标识提供了使用托管标识的极简方法。
  • 用户分配的 托管标识作为独立的 Azure 资源创建,提供更高的灵活性和更多的功能。 它们非常适合涉及多个需要共享相同标识和权限的 Azure 资源的解决方案。 例如,如果多个虚拟机需要访问同一组 Azure 资源,则用户分配的托管标识可提供可重用性和优化管理。

小窍门

在托管标识 最佳做法建议 文章中,详细了解如何选择和管理系统分配的托管标识和用户分配的托管标识。

前面的部分介绍了为 Azure 托管应用启用和使用系统分配的托管标识的步骤。 如果需要使用用户分配的托管标识,请访问 用户分配的托管标识 文章以了解详细信息。

在 Azure 托管资源上启用系统分配的托管标识

若要开始在应用中使用系统分配的托管标识,请在托管应用的 Azure 资源上启用标识,例如 Azure 应用服务、Azure 容器应用或 Azure 虚拟机。

可以使用 Azure 门户或 Azure CLI 为 Azure 资源启用系统分配的托管标识。

  1. 在 Azure 门户中,导航到托管应用程序代码的资源,例如 Azure 应用服务或 Azure 容器应用实例。

  2. 在资源的 概述 页中,展开 设置,并从导航菜单中选择 身份

  3. “标识 ”页上,将 “状态 ”滑块切换为 “打开”。

  4. 选择保存以应用更改。

    显示如何在容器应用中启用系统分配的托管标识的屏幕截图。

为托管标识分配角色

接下来,确定应用需要哪些角色并将这些角色分配给托管标识。 你可以为托管标识分配以下范围内的角色:

  • 资源:分配的角色仅适用于该特定资源。
  • 资源组:分配的角色适用于资源组中包含的所有资源。
  • 订阅:被分配的角色适用于订阅中包含的所有资源。

以下示例演示如何在资源组范围内分配角色,因为许多应用使用单个资源组管理其所有相关的 Azure 资源。

  1. 导航到包含具有系统分配托管标识的应用的资源组的 “概述 ”页。

  2. 在左侧导航栏中,选择“访问控制(IAM)”

  3. 访问控制(IAM) 页上,选择顶部菜单上的 + 添加,然后选择 添加角色分配 导航到 添加角色分配 页。

    显示如何访问标识角色分配页的屏幕截图。

  4. “添加角色分配”页展示了一个分步骤的选项卡式工作流程,用于将角色分配给标识。 在初始“角色”选项卡上,使用顶部的搜索框来定位你想要分配给标识的角色。

  5. 从结果中选择角色,然后选择 “下一步” 以进入“成员”选项卡。

  6. 对于“将访问权限分配到”选项,请选择“托管标识”

  7. 对于“成员”选项,请选择“+ 选择成员”,以打开“选择托管标识”面板。

  8. 选择托管标识 面板中,使用 订阅托管标识 下拉列表来筛选标识的搜索结果。 使用 “选择 搜索”框查找为托管应用的 Azure 资源启用的系统标识。

    显示托管标识分配过程的屏幕截图。

  9. 选择标识,并在面板底部选择选择以继续。

  10. 选择页面底部的“查看 + 分配”

  11. 在最终的 审阅 + 分配 选项卡中,选择 审阅 + 分配 以完成整个工作流程。

从应用向 Azure 服务进行身份验证

Azure 标识库提供各种凭据-适用于支持不同方案和Microsoft Entra 身份验证流的实现TokenCredential。 由于托管标识在本地运行时不可用,因此后续步骤演示了在哪种方案中要使用的凭据:

  • 本地开发环境:在仅本地开发期间,请使用名为 defaultAzureCredential 的类,以获取敏捷的预配置凭据链。 DefaultAzureCredential 从本地工具或开发环境(如 Azure CLI 或 Visual Studio Code)中发现用户凭据。 它还为重试、响应等待时间以及支持多个身份验证选项提供了灵活性和便利。 访问 本地开发期间对 Azure 服务的身份验证 文章以了解详细信息。
  • Azure 托管的应用:在 Azure 中运行应用时,请使用 ManagedIdentityCredential 安全地发现为应用配置的托管标识。 指定这种确切类型的凭据可防止意外地获取其他可用凭据。

实现代码

通过导航到应用程序项目目录并运行以下命令,将 azure 标识 包添加到应用程序:

pip install azure-identity

Azure 服务使用各种 Azure SDK 客户端库中的专用客户端类进行访问。 下面的代码示例演示如何创建凭据实例并将其用于 Azure SDK 服务客户端。 在应用程序代码中,完成以下步骤以使用托管标识进行身份验证:

  1. ManagedIdentityCredential 模块中导入 azure.identity 类。
  2. 创建 ManagedIdentityCredential 对象。
  3. ManagedIdentityCredential 对象传递给 Azure SDK 客户端构造函数。

以下示例演示如何使用系统分配的托管标识进行身份验证 BlobServiceClient

from azure.identity import ManagedIdentityCredential
from azure.storage.blob import BlobServiceClient

# Authenticate using system-assigned managed identity
credential = ManagedIdentityCredential()

blob_service_client = BlobServiceClient(
    account_url="https://<account-name>.blob.core.windows.net",
    credential=credential
)

在本地开发时,可以使用 DefaultAzureCredential 从本地开发工具获取凭据。 部署到 Azure 时,切换至 ManagedIdentityCredential 以用于生产环境:

import os
from azure.identity import DefaultAzureCredential, ManagedIdentityCredential
from azure.storage.blob import BlobServiceClient

# Use ManagedIdentityCredential in Azure, DefaultAzureCredential locally
if os.getenv("WEBSITE_HOSTNAME"):
    credential = ManagedIdentityCredential()
else:
    credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
    account_url="https://<account-name>.blob.core.windows.net",
    credential=credential
)