使用开发人员帐户在本地开发期间向 Azure 服务验证 Python 应用的身份
当开发人员创建云应用程序时,他们通常会在本地工作站上调试和测试应用程序。 在本地开发期间,当应用程序在开发人员的工作站上运行时,它仍然必须向应用使用的任何 Azure 服务进行身份验证。 本文介绍如何在本地开发期间使用开发人员的 Azure 凭据对访问 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 为 bbbbbbbb-1111-2222-3333-cccccccccccc
的组成员在 ID 为 aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
的订阅中对 msdocs-python-sdk-auth-example 资源组中的所有存储帐户中的 Azure 存储 blob 容器和数据进行读取、写入和删除访问,你可以使用以下命令将存储 Blob 数据参与者角色分配给该组。
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 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 代码,你需要:
- 从
azure.identity
模块中导入DefaultAzureCredential
类。 - 创建
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)