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

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

此关系图显示了在本地开发过程中 Python 应用如何使用开发人员凭据从本地安装的开发工具获取这些凭据来连接到 Azure。

若要使应用可在本地开发期间使用开发人员的 Azure 凭据向 Azure 进行身份验证,开发人员必须从 Azure CLI、Azure PowerShell 或 Azure 开发人员 CLI 登录到 Azure。 Azure SDK for Python 能够检测到开发人员已从这些工具之一登录,然后从凭据缓存中获取必要的凭据,以登录用户的身份向 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 的组成员在 ID 为 11111111-1111-1111-1111-111111111111 的订阅中对 msdocs-python-sdk-auth-example 资源组中的所有存储帐户中的 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 客户端对象进行身份验证,应用程序应使用 azure.identity 包中的 DefaultAzureCredential 类。 在此方案中,DefaultAzureCredential 将按顺序检查了解开发人员是否已使用 Azure CLI、Azure PowerShell 或 Azure 开发人员 CLI 登录到 Azure。 如果开发人员已使用其中任一工具登录到 Azure,则应用将使用用于登录该工具的凭据向 Azure 进行身份验证。

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

pip install azure-identity

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

  1. azure.identity 模块中导入 DefaultAzureCredential 类。
  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)