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

开发人员创建云应用程序时,通常会在本地工作站上调试和测试应用程序。 在本地开发期间,当应用程序在开发人员的工作站上运行时,它仍然必须向应用使用的任何 Azure 服务进行身份验证。 本文介绍如何在本地开发期间使用开发人员的 Azure 凭据对访问 Azure 的应用进行身份验证。

显示本地开发期间 Python 应用如何使用开发人员凭据通过从本地安装的开发工具获取这些凭据连接到 Azure 的关系图。

若要使用开发人员的 Azure 凭据在本地开发期间向 Azure 进行身份验证的应用,开发人员必须从 Azure CLI、Azure PowerShell 或 Azure 开发人员 CLI 登录到 Azure。 用于 Python 的 Azure SDK 能够检测开发人员是否从其中一个工具登录,然后从凭据缓存中获取必要的凭据,以将应用作为登录用户向 Azure 进行身份验证。

这种方法对于开发团队而言最容易设置,因为它利用开发人员的现有 Azure 帐户。 但是,开发人员帐户拥有的权限可能比应用程序所需的权限更多,因此超出了应用在生产环境中运行时使用的权限。 或者,可以 创建应用程序服务主体,以在本地开发期间使用,该主体的范围可以限定为仅具有应用所需的访问权限。

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

由于几乎始终有多个开发人员处理应用程序,因此建议先创建 Microsoft Entra 安全组来封装应用在本地开发中所需的角色(权限)。 此方法具有以下优势。

  • 由于角色是在组级别分配的,因此可以确保为每个开发人员分配相同的角色。
  • 如果应用需要新角色,则只需将其添加到应用的 Microsoft Entra 组。
  • 如果新开发人员加入团队,则只需将其添加到正确的 Microsoft Entra 组即可获取应用工作的正确权限。

如果你拥有开发团队的现有 Microsoft Entra 安全组,则可以使用该组。 否则,请完成以下步骤以创建 Microsoft Entra 安全组。

az ad group create 命令用于在 Microsoft Entra ID 中创建组。 --display-name--main-nickname 参数是必需的。 为组指定的名称应该基于应用程序的名称。 在组的名称中包含类似于“local-dev”的短语来指示组的用途也很有用。

az ad group create \
    --display-name MyDisplay \
    --mail-nickname MyDisplay  \
    --description "<group-description>"

复制命令输出中属性的值 id 。 这是组的对象 ID。 稍后的步骤需要用到它。 还可以使用 az ad group show 命令来检索此属性。

若要将成员添加到组,需要 Azure 用户的对象 ID。 使用 az ad user list 列出可用的服务主体。 --filter 参数命令接受 OData 样式筛选器,可用于按用户显示名称筛选列表,如图所示。 该 --query 参数将输出限制为感兴趣的列。

az ad user list \
    --filter "startswith(displayName, 'Bob')" \
    --query "[].{objectId:id, displayName:displayName}" \
    --output table

然后可以使用 az ad group member add 命令将成员添加到组中。

az ad group member add \
    --group <group-name> \
    --member-id <object-id>

注意

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

2 - 将角色分配给 Microsoft Entra 组

接下来,需要确定应用在哪些资源上需要哪些角色(权限),并将这些角色分配到应用。 在此示例中,角色将分配给在步骤 1 中创建的 Microsoft Entra 组。 可以在资源、资源组或订阅范围内分配角色。 此示例演示如何在资源组范围内分配角色,因为大多数应用程序将其所有 Azure 资源分组到单个资源组中。

使用 az role assignment create 命令在 Azure 中为用户、组或应用程序服务主体分配角色。 可以使用其对象 ID 指定组。

az role assignment create --assignee {objectId} \
    --scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
    --role "{roleName}" 

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

az role definition list --query "sort_by([].{roleName:roleName, description:description}, &roleName)" --output table

例如,若要允许具有对象 ID 的00000000-0000-0000-0000-000000000000组成员读取、写入和删除对订阅中 msdocs-python-sdk-auth-example 资源组11111111-1111-1111-1111-111111111111中所有存储帐户中Azure 存储 blob 容器和数据的访问权限,请使用以下命令将存储 Blob 数据参与者角色分配给该组。

az role assignment create --assignee 00000000-0000-0000-0000-000000000000 \
    --scope /subscriptions/11111111-1111-1111-1111-111111111111/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 CLI 登录到 Azure。

az login

4 - 在应用程序中实现 DefaultAzureCredential

若要向 Azure 验证 Azure SDK 客户端对象,应用程序应使用 DefaultAzureCredential 包中的 azure.identity 类。 在此方案中,DefaultAzureCredential将按顺序检查查看开发人员是否已使用 Azure CLI、Azure PowerShell 或 Azure 开发人员 CLI 登录到 Azure。 如果开发人员使用其中任一工具登录到 Azure,则用于登录该工具的凭据将由应用用来向 Azure 进行身份验证。

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

pip install azure-identity

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

  1. DefaultAzureCredentialazure.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)