使用开发人员帐户在本地开发期间向 Azure 服务验证 Python 应用的身份

开发云应用程序时,开发人员通常会在本地生成、测试和调试其代码,然后再将其部署到 Azure。 但是,即使在本地开发期间,应用程序也需要通过它与之交互的任何 Azure 服务(例如 Key Vault、存储或数据库)进行身份验证。

本文介绍如何将应用程序配置为在本地开发期间使用开发人员的 Azure 凭据进行身份验证。 此方法可实现无缝且安全的开发体验,而无需嵌入机密或编写特定于环境的逻辑。

使用开发人员帐户进行本地开发身份验证概述

开发使用适用于 Python 的 Azure 标识库的应用程序时,可以使用开发人员的 Azure 帐户在本地开发期间向 Azure 服务进行身份验证。 此方法通常是在本地开发期间向 Azure 服务进行身份验证的最简单方法,因为它不需要创建和管理服务主体或机密。

本示意图展示了在本地开发期间,Python 应用如何通过使用开发者凭据(从本地安装的开发工具中获取)连接到 Azure。

若要使应用程序能够在使用开发人员自己的 Azure 凭据进行本地开发期间向 Azure 进行身份验证,开发人员必须先使用受支持的命令行工具之一登录:

  • Azure CLI (az login
  • Azure 开发人员命令行界面(azd login
  • Azure PowerShell (Connect-AzAccount

登录后,用于 Python 的 Azure 标识库可以自动检测活动会话,并从凭据缓存中检索必要的令牌。 此功能允许应用以已登录用户的身份向 Azure 服务进行身份验证,而无需任何其他配置或硬编码的机密。

使用 DefaultAzureCredential时会启用此行为,该行为以透明方式回退到本地环境中的基于 CLI 的凭据。

使用开发人员的已登录 Azure 凭据是用于本地开发的最简单设置。 它利用每个团队成员的现有 Azure 帐户,无需其他配置即可无缝访问 Azure 服务。

但是,开发人员帐户通常具有比应用程序在生产中应具有的更广泛的权限。 这些更广泛的权限可能会导致测试不一致,或无意中允许应用程序执行在生产环境中无权进行的操作。 若要密切镜像生产权限并提高安全状况,可以改为创建特定于应用程序的服务主体进行本地开发。 这些身份:

  • 只能分配应用程序所需的角色和权限
  • 最低特权支持原则
  • 跨环境提供对与访问相关的行为的一致测试

开发人员可以将本地环境配置为通过环境变量使用服务主体,并 DefaultAzureCredential 自动选取它。 有关详细信息,请参阅使用 服务主体在本地开发期间向 Azure 服务验证 Python 应用的文章

1 - 创建用于本地开发的 Microsoft Entra 安全组

在大多数开发方案中,多个开发人员为同一应用程序做出贡献。 为了简化访问控制并确保整个团队的权限一致,我们建议首先创建一个特定于应用程序的本地开发需求的Microsoft Entra 安全组。

在组级别分配 Azure 角色(而不是向单个用户)提供几个主要优势:

  • 一致的角色分配

    组中的所有开发人员都会自动继承相同的角色和权限,确保统一开发环境。

  • 简化的角色管理

    当应用程序需要新角色时,只需将它一次添加到组。 无需更新单个用户权限。

  • 轻松入职

    只需将新开发人员添加到组即可授予所需的权限。 无需手动分配角色。

如果组织已有适合开发团队的Microsoft Entra 安全组,则可以重复使用它。 否则,可以专门为应用创建新组。

若要在 Microsoft Entra ID 中创建安全组,请使用 az ad group createe Azure CLI 命令。

此命令需要以下参数:

--display-name:便于用户使用的组名称

--mail-nickname:用于电子邮件和内部引用的唯一标识符

建议以应用程序名称为基础来命名组,并添加类似 -local-dev 的后缀以清楚地表明其用途。

#!/bin/bash
az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"
# PowerShell syntax
az ad group create `
    --display-name MyDisplay `
    --mail-nickname MyDisplay `
    --description "<group-description>"

运行az ad group create命令后,从命令输出中复制id属性的值。 在本文后面的步骤中,你需要 Microsoft Entra 安全组的 Object ID 来分配角色。 若要稍后再次检索Object ID,请使用以下 az ad group show 命令: az ad group show --group "my-app-local-dev" --query id --output tsv

若要将用户添加到组,首先需要获取要添加的 Azure 用户帐户的 Object ID。 使用带参数的 az ad user list 命令 --filter 按显示名称搜索特定用户。 该 --query 参数有助于将输出限制为相关字段:

#!/bin/bash
az ad user list \
--filter "startswith(displayName, 'Bob')" \
--query "[].{objectId:id, displayName:displayName}" \
--output table
# PowerShell syntax
az ad user list `
    --filter "startswith(displayName, 'Bob')" `
    --query "[].{objectId:id, displayName:displayName}" `
    --output table

获得 Object ID 用户后,可以使用 az ad group member add 命令将其添加到组中。

#!/bin/bash
az ad group member add \
    --group <group-name> \
    --member-id <object-id>
# PowerShell syntax
az ad group member add `
    --group <group-name> `
    --member-id <object-id>

注意

默认情况下,Microsoft Entra 安全组的创建仅限于目录中的某些特权角色。 如果无法创建组,请联系目录的管理员。 如果无法将成员添加到现有组,请联系组所有者或目录管理员。 若要了解详细信息,请参阅管理 Microsoft Entra 组和组成员身份

2 - 将角色分配给 Microsoft Entra 组

创建Microsoft Entra 安全组并添加成员后,下一步是确定应用程序所需的角色(权限),并将这些角色分配给相应范围内的组。

  • 确定所需的角色

    确定应用正常运行所需的角色。 常见示例包括:

    • Key Vault 机密用户 – 从 Azure Key Vault 读取机密
    • 存储队列数据贡献者——发送消息到 Azure 队列存储

    有关更多选项,请参阅内置角色定义。

  • 选择角色分配的范围

    可以在不同的范围内分配角色:

    • 资源级别(例如单个 Key Vault 或存储帐户)
    • 资源组级别(建议用于大多数应用)
    • 订阅级别 (谨慎使用 — 最广泛的访问权限)

在此示例中,我们在资源组范围内分配角色,当所有应用程序资源都分组到一个资源组下时,这是典型的。

使用 az role assignment create 命令为用户、组或应用程序服务主体分配 Azure 中的角色。 可以通过其Object ID指定一个组。

#!/bin/bash
az role assignment create --assignee <objectId> \
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> \
    --role "<roleName>" 
# PowerShell syntax
az role assignment create `
    --assignee <objectId> `
    --scope /subscriptions/<subscriptionId>/resourceGroups/<resourceGroupName> `
    --role "<roleName>"

若要获取可以分配的角色名称,请使用 az role definition list 命令。

#!/bin/bash
az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table
# PowerShell syntax
az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table

若要授予对特定资源组中所有存储帐户的 Azure 存储 Blob 容器和数据的读取、写入和删除访问权限,请将存储 Blob 数据参与者角色分配给Microsoft Entra 安全组。

#!/bin/bash
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc \
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example \
    --role "Storage Blob Data Contributor"
# PowerShell syntax
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc `
    --scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-python-sdk-auth-example `
    --role "Storage Blob Data Contributor"

有关使用 Azure CLI 在资源或订阅级别分配权限的信息,请参阅使用 Azure CLI 分配 Azure 角色一文。

3 - 使用 Azure CLI、Azure PowerShell、Azure 开发人员 CLI 或在浏览器中登录到 Azure

若要使用 Azure 帐户进行身份验证,请选择以下方法之一:

在开发人员工作站上打开终端,然后从 Azure CLI 登录到 Azure。

az login

4 - 在应用程序中实现 DefaultAzureCredential

若要使用 Azure 对 Azure SDK 客户端对象进行身份验证,应用程序应使用 DefaultAzureCredential 包中的 azure-identity 类。 这是针对本地开发和生产部署的建议身份验证方法。

在本地开发方案中, DefaultAzureCredential 按顺序检查可用的身份验证源。 具体而言,它会在以下工具中查找正在进行的会话:

  • Azure CLI (az login)
  • Azure PowerShell (Connect-AzAccount)
  • Azure 开发人员 CLI (azd auth login)

如果开发人员使用其中任何工具登录到 Azure, DefaultAzureCredential 则会自动检测会话,并使用这些凭据通过 Azure 服务对应用程序进行身份验证。 这样,开发人员就可以安全地进行身份验证,而无需存储机密或修改不同环境的代码。

首先将 azure.identity 包添加到应用程序中。

pip install azure-identity

接下来,对于在应用中创建 Azure SDK 客户端对象的任何 Python 代码,需要:

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

以下代码片段中显示了这些步骤的示例。

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

# Acquire a credential object
token_credential = DefaultAzureCredential()

blob_service_client = BlobServiceClient(
        account_url="https://<my_account_name>.blob.core.windows.net",
        credential=token_credential)