使用用于 Python 的 Azure SDK 对 Azure 服务的 Python 应用进行身份验证

当应用程序需要访问 Azure 资源(如 Azure 存储、Azure 密钥保管库或 Azure 认知服务)时,必须向 Azure 对应用程序进行身份验证。 此要求适用于所有应用程序,无论它们是部署到 Azure、部署在本地还是在本地开发人员工作站上正在开发的应用程序。 本文介绍在使用用于 Python 的 Azure SDK 时向 Azure 验证应用的建议方法。

对 Azure 资源进行身份验证时,对应用使用基于令牌的身份验证,而不是连接字符串。 Azure SDK for Python 提供支持基于令牌的身份验证的类。 无论应用是在本地开发中、部署到 Azure 还是部署到本地服务器,应用都可以无缝地向 Azure 资源进行身份验证。

应用用于对 Azure 资源进行身份验证的特定类型的基于令牌的身份验证取决于应用运行的位置。 下图显示了基于令牌的身份验证的类型。

显示应用的建议基于令牌的身份验证策略的示意图,具体取决于应用的运行位置。

  • 当开发人员在本地开发期间运行应用时: 应用使用用于本地开发的应用程序服务主体或开发人员的 Azure 凭据向 Azure 进行身份验证。 本地开发期间的身份验证部分中讨论了这些选项。
  • 当应用托管在 Azure 上时: 应用使用托管标识对 Azure 资源进行身份验证。 服务器 环境中的身份验证部分中讨论了此选项。
  • 在本地托管和部署应用时: 应用使用应用程序服务主体对 Azure 资源进行身份验证。 服务器 环境中的身份验证部分中讨论了此选项。

DefaultAzureCredential

Azure SDK 提供的 DefaultAzureCredential 类允许应用根据运行应用的环境使用不同的身份验证方法。 这样,无需更改代码即可将应用从本地开发提升到测试环境到生产环境。

为每个环境配置适当的身份验证方法,并 DefaultAzureCredential 自动检测并使用该身份验证方法。 使用 DefaultAzureCredential 优先于手动编码条件逻辑或功能标志,以在不同的环境中使用不同的身份验证方法。

有关使用 DefaultAzureCredential 类的详细信息,请参阅 在应用程序中使用 DefaultAzureCredential 部分。

基于令牌的身份验证的优势

生成适用于 Azure 的应用时,请使用基于令牌的身份验证,而不是使用连接字符串。 与使用连接字符串进行身份验证时,基于令牌的身份验证具有以下优势:

  • 使用本文中所述的基于令牌的身份验证方法,可以建立应用在 Azure 资源上所需的特定权限。 这种做法遵循 最小特权原则。 相比之下,连接字符串授予对 Azure 资源的完全权限。
  • 任何人或任何具有连接字符串的应用都可以连接到 Azure 资源,但基于令牌的身份验证方法将资源访问权限的范围限定为仅打算访问该资源的应用。
  • 使用托管标识时,无需存储应用程序机密。 应用更安全,因为没有可能泄露的连接字符串或应用程序机密。
  • Azure SDK 中的 azure.identity 包在幕后为你管理令牌。 托管令牌使基于令牌的身份验证与连接字符串一样易于使用。

将连接字符串的使用限制为不访问生产或敏感数据的初始概念证明应用或开发原型。 否则,在对 Azure 资源进行身份验证时,Azure SDK 中提供的基于令牌的身份验证类始终是首选类。

在服务器环境中进行身份验证

在服务器环境中托管时,将为每个应用程序分配一个唯一 的应用程序标识 ,每个运行应用程序的环境。 在 Azure 中,应用标识由 服务主体表示。 此特殊类型的安全主体标识应用并对其进行 Azure 身份验证。 要用于应用的服务主体类型取决于应用的运行位置:

身份验证方法 说明
Azure 中托管的应用 Azure 中托管的应用应使用 托管标识服务主体。 托管标识旨在表示 Azure 中托管的应用的标识,并且只能与 Azure 托管的应用一起使用。

例如,托管在 Azure 应用服务 中的 Django Web 应用将分配托管标识。 然后,分配给应用的托管标识将用于向其他 Azure 服务对应用进行身份验证。

托管在 Azure 外部的应用
例如, (本地应用)
托管在 Azure (外部的应用例如,需要连接到 Azure 服务的本地应用) 应使用 应用程序服务主体。 应用程序服务主体表示 Azure 中应用的标识,并通过应用程序注册过程创建。

例如,假设在本地托管的 Django Web 应用使用 Azure Blob 存储。 你将使用应用注册过程为应用创建应用程序服务主体。 AZURE_CLIENT_IDAZURE_TENANT_IDAZURE_CLIENT_SECRET 将全部存储为环境变量,由应用程序在运行时读取,并允许应用使用应用程序服务主体向 Azure 进行身份验证。

在本地开发期间进行身份验证

当应用程序在本地开发期间在开发人员的工作站上运行时,它仍必须向应用使用的任何 Azure 服务进行身份验证。 在本地开发期间,向 Azure 验证应用有两种主要策略:

身份验证方法 说明
创建在本地开发期间要使用的专用应用程序服务主体对象。 在此方法中,专用 应用程序服务主体 对象是使用应用注册过程设置的,以便在本地开发期间使用。 然后,服务主体的标识将存储为环境变量,当应用在本地开发中运行时,应用将对其进行访问。

使用此方法可将应用所需的特定资源权限分配给开发人员在本地开发期间使用的服务主体对象。 这种做法可确保应用程序仅有权访问它所需的特定资源,并复制应用在生产环境中拥有的权限。

此方法的缺点是需要为每个处理应用程序的开发人员创建单独的服务主体对象。

在本地开发期间,使用开发人员的凭据向 Azure 验证应用。 在此方法中,开发人员必须从 Azure CLI 或在本地工作站上Azure PowerShell登录到 Azure。 然后,应用程序可以访问凭据存储中的开发人员凭据,并使用这些凭据从应用访问 Azure 资源。

此方法的优点是设置更简单,因为开发人员只需在 Azure CLI 中登录到其 Azure 帐户。 此方法的缺点是开发人员帐户的权限可能多于应用程序所需的权限。 因此,应用程序无法准确复制在生产环境中运行的权限。

在应用程序中使用 DefaultAzureCredential

若要在 Python 应用中使用 DefaultAzureCredential ,请将 azure.identity 包添加到应用程序。

pip install azure-identity

下面的代码示例演示如何实例化 DefaultAzureCredential 对象并将其与 Azure SDK 客户端类一起使用。 在本例中,它是BlobServiceClient用于访问Azure Blob 存储的对象。

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

# Acquire a credential object
credential = DefaultAzureCredential()

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

对象 DefaultAzureCredential 会自动检测为应用配置的身份验证机制,并获取向 Azure 对应用进行身份验证所需的令牌。 如果应用程序使用多个 SDK 客户端,则可以对每个 SDK 客户端对象使用相同的凭据对象。

使用 DefaultAzureCredential 时的身份验证方法序列

在内部,DefaultAzureCredential 实现凭据提供程序链,以便对访问 Azure 资源的应用程序进行身份验证。 每个凭据提供程序都可以检测是否为应用配置了该类型的凭据。 对象 DefaultAzureCredential 按顺序检查每个提供程序,并使用配置了凭据的第一个提供程序的凭据。

以下关系图和表中显示了查找凭据的顺序 DefaultAzureCredential

此图显示了 DefaultAzureCredential 检查以查看为应用程序配置的身份验证源的顺序。

凭据类型 说明
环境 对象 DefaultAzureCredential 读取一组环境变量,以确定是否为应用设置了应用程序服务主体 (应用程序用户) 。 如果是,则 DefaultAzureCredential 将使用这些值对访问 Azure 的应用进行身份验证。

此方法最常用于服务器环境,但也可以在本地开发时使用它。
托管标识 如果应用程序部署到启用了托管标识的 Azure 主机, DefaultAzureCredential 则会使用该托管标识向 Azure 对应用进行身份验证。 服务器环境中的身份验证部分中讨论了使用托管标识 进行身份验证

仅当使用 Azure 应用服务、Azure Functions 或 Azure 虚拟机 等服务在 Azure 中托管应用程序时,此方法才可用。
Azure CLI 如果已使用 az login Azure CLI 中的 命令向 Azure 进行身份验证, DefaultAzureCredential 则使用同一帐户向 Azure 对应用进行身份验证。
Azure PowerShell 如果已使用 Connect-AzAccount Azure PowerShell 中的 cmdlet 向 Azure 进行身份验证,DefaultAzureCredential请使用同一帐户向 Azure 对应用进行身份验证。
交互 如果启用, DefaultAzureCredential 则通过当前系统的默认浏览器以交互方式对你进行身份验证。 默认情况下禁用此选项。