开发云应用程序时,开发人员通常会在本地生成、测试和调试其代码,然后再将其部署到 Azure。 但是,即使在本地开发期间,应用程序也需要通过它与之交互的任何 Azure 服务(例如 Key Vault、存储或数据库)进行身份验证。
本文介绍如何将应用程序配置为在本地开发期间使用开发人员的 Azure 凭据进行身份验证。 此方法可实现无缝且安全的开发体验,而无需嵌入机密或编写特定于环境的逻辑。
使用开发人员帐户进行本地开发身份验证概述
开发使用适用于 Python 的 Azure 标识库的应用程序时,可以使用开发人员的 Azure 帐户在本地开发期间向 Azure 服务进行身份验证。 此方法通常是在本地开发期间向 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 代码,需要:
- 从
DefaultAzureCredential
模块中导入azure.identity
类。 - 创建
DefaultAzureCredential
对象。 - 将
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)