使用用于 Python 的 Azure SDK 向 Azure 服务验证 Python 应用

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

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

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

A diagram that shows the recommended token-based authentication strategies for an app depending on where it's running.

  • 当开发人员在本地开发期间运行应用时: 应用使用用于本地开发的应用程序服务主体或开发人员的 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 中的应用标识,并通过应用程序注册过程创建。

例如,请考虑使用 Azure Blob 存储 托管在本地的 Django Web 应用。 你将使用应用注册过程为应用创建应用程序服务主体。 这 AZURE_CLIENT_ID一点 AZURE_TENANT_ID,并且 AZURE_CLIENT_SECRET 全部存储为环境变量,供应用程序在运行时读取,并允许应用使用应用程序服务主体向 Azure 进行身份验证。

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

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

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

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

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

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

此方法的优势是更容易设置,因为开发人员只需从 Visual Studio Code 或 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 对象会自动检测为应用配置的身份验证机制,并获取对应用进行身份验证所需的令牌。 如果应用程序使用多个 SDK 客户端,则可以将同一凭据对象与每个 SDK 客户端对象一起使用。

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

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

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

A diagram that shows the sequence in which DefaultAzureCredential checks to see what authentication source is configured for an application.

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

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

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