使用中转身份验证在本地开发期间向 Azure 服务验证 Python 应用

中转身份验证使用系统身份验证代理收集用户凭据,以对应用进行身份验证。 系统身份验证代理是在用户计算机上运行的应用,用于管理所有连接的帐户的身份验证握手和令牌维护。

中转身份验证具有以下优势:

  • 启用单点登录(SSO): 使应用能够简化用户使用 Microsoft Entra ID 进行身份验证,并保护 Microsoft Entra ID 刷新令牌免受外泄和滥用。
  • 增强的安全性: 许多安全增强功能都随中转站一起提供,无需更新应用逻辑。
  • 增强的功能支持: 在代理的帮助下,开发人员可以访问丰富的 OS 和服务功能。
  • 系统集成: 运用内置帐户选择器的代理即插即用应用程序,允许用户快速选择现有帐户,而无需反复输入相同的凭据。
  • 令牌保护: 确保刷新令牌已绑定设备,并使应用能够获取设备绑定访问令牌。 请参阅 令牌保护

Windows 提供名为 Web 帐户管理器(WAM)的身份验证代理。 WAM 使标识提供者(如 Microsoft Entra ID)能够原生集成到操作系统中,并为应用程序提供安全的登录服务。 中介身份验证使应用程序能够执行交互式登录凭据允许的所有操作。

支持个人Microsoft帐户和工作或学校帐户。 在受支持的 Windows 版本中,基于浏览器的默认 UI 替换为更流畅的身份验证体验,类似于内置 Windows 应用。

macOS 本身不包括内置身份验证代理。 Azure 标识客户端库使用特定于平台的机制实现中转身份验证功能,并且可以在管理设备时与Microsoft公司门户等应用集成。 有关详细信息,请参阅 适用于 Apple 设备的Microsoft企业 SSO 插件

Linux 使用 Microsoft Linux 单一登录 作为其身份验证代理。

配置应用进行代理身份验证

若要在应用程序中启用中转身份验证,请执行以下步骤:

  1. Azure 门户中,导航到 Microsoft Entra ID ,然后选择左侧菜单中 的应用注册

  2. 选择应用注册,然后选择“身份验证”

  3. 通过平台配置将适当的重定向 URI 添加到应用注册:

    1. “平台配置”下,选择“ + 添加平台”。

    2. “配置平台”下,选择应用程序类型(平台)的磁贴以配置其设置,例如 移动和桌面应用程序

    3. 自定义重定向 URI 中,输入平台的以下重定向 URI:

      平台 重定向 URI
      Windows 10+ 或 WSL ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}
      macOS msauth.com.msauth.unsignedapp://auth 适用于未签名的应用
      msauth.{bundle_id}://auth 用于已签名的应用
      Linux https://login.microsoftonline.com/common/oauth2/nativeclient

      从应用注册的{your_client_id}窗格中,将{bundle_id}替换为应用程序(客户端)ID

    4. 选择配置

    若要了解详细信息,请参阅 向应用注册添加重定向 URI

  4. 返回“身份验证”窗格,在“高级设置下,选择“是”以允许公共客户端流

  5. 选择保存以应用更改。

  6. 若要授权应用程序使用特定资源,请导航到相关的资源,选择“API 权限”,然后启用 Microsoft Graph 和其他要访问的资源。

    重要

    你还必须是租户的管理员,才能在首次登录时同意应用程序。

分配角色

若要使用中转身份验证成功运行应用代码,请使用 Azure 基于角色的访问控制(RBAC)授予用户帐户权限。 为用户帐户分配相应的 Azure 服务角色。 例如:

  • Azure Blob 存储:分配存储帐户数据贡献者角色。
  • Azure Key Vault:分配 Key Vault Secrets Officer 角色。

如果指定了应用,则必须为 user_impersonation访问 Azure 存储 设置 API 权限(上一部分中的步骤 6)。 此 API 权限允许应用在登录期间授予同意后代表已登录用户访问 Azure 存储。

实现代码

以下示例演示了如何使用 InteractiveBrowserCredential 通过 SubscriptionClient 进行身份验证:

  1. 安装这些包。 pywin32 将在 Windows 中用于检索当前在前台的窗口。

    pip install azure-identity-broker pywin32
    
  2. 获取对父窗口的引用,其中应显示帐户选取器对话框。 在下面的代码示例中,这一行将是:

    current_window_handle = win32gui.GetForegroundWindow()
    
  3. 创建一个InteractiveBrowserBrokerCredential实例,并传入父窗口引用。 在最终的代码示例中,这将是该行:

    credential = InteractiveBrowserBrokerCredential(parent_window_handle=current_window_handle)
    
  4. credential使用 Azure 服务访问此示例中的 Blob 存储。

下面是最终代码示例:

import win32gui
from azure.identity.broker import InteractiveBrowserBrokerCredential
from azure.storage.blob import BlobServiceClient

# Get the handle of the current window
current_window_handle = win32gui.GetForegroundWindow()

# To authenticate and authorize with an app, use the following line to get a credential and
# substitute the <app_id> and <tenant_id> placeholders with the values for your app and tenant.
# credential = InteractiveBrowserBrokerCredential(parent_window_handle=current_window_handle, client_id=<app_id>, tenant_id=<tenant_id>)
credential = InteractiveBrowserBrokerCredential(parent_window_handle=current_window_handle)
client = BlobServiceClient("https://<storage-account-name>.blob.core.windows.net/", credential=credential)

# Prompt for credentials appears on first use of the client
for container in client.list_containers():
    print(container.name)

若要进行更精确的控制,例如设置超时,你可以向 InteractiveBrowserBrokerCredential 提供特定参数,例如 timeout

若要使代码成功运行,必须在存储帐户上为用户帐户分配一个 Azure 角色,该角色允许访问 Blob 容器,例如 存储帐户数据参与者。 如果指定了应用,则必须为 user_impersonation访问 Azure 存储 设置 API 权限(上一部分中的步骤 6)。 此 API 权限允许应用在登录期间授予同意后代表已登录用户访问 Azure 存储。

以下屏幕截图显示了备用的交互式中转身份验证体验:

这是一个屏幕截图,显示了在使用启用代理的 InteractiveBrowserCredential 实例对用户进行身份验证时,Windows 登录体验的情况。

重要

macOS 支持存在于 azure-identity-broker 版本 1.3.0 及更高版本中。

以下示例演示如何使用 InteractiveBrowserBrokerCredentialBlobServiceClient 进行身份验证。

  1. 进行包的安装。 msal (Microsoft身份验证库)用于为参数提供常量 parent_window_handle

    pip install azure-identity-broker msal
    
  2. 创建一个 InteractiveBrowserBrokerCredential 的实例,并传入父窗口引用。 这要求你获取父窗口的引用,该窗口在其顶层应显示由 msal 模块提供的帐户选取器对话框。 在下面的代码示例中,那一行就是:

    credential = InteractiveBrowserBrokerCredential(
        parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE
    )
    
  3. 使用 credential 访问 Azure 服务,本例中为 Blob 存储。

下面是最终代码示例:

from azure.identity.broker import InteractiveBrowserBrokerCredential
from azure.storage.blob import BlobServiceClient
import msal

credential = InteractiveBrowserBrokerCredential(
    parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE
)

client = BlobServiceClient("https://<storage-account-name>.blob.core.windows.net/", credential=credential)

# Prompt for credentials appears on first use of the client
for container in client.list_containers():
    print(container.name)

有关在 macOS 上将 MSAL Python 与身份验证代理配合使用的详细信息,请参阅 将 MSAL Python 与 macOS 上的身份验证代理配合使用

若要进行更精确的控制,例如设置超时,你可以向 InteractiveBrowserBrokerCredential 提供特定参数,例如 timeout

若要使代码成功运行,必须在存储帐户上为用户帐户分配一个 Azure 角色,该角色允许访问 Blob 容器,例如 存储帐户数据参与者。 如果指定了应用,则必须为 user_impersonation访问 Azure 存储 设置 API 权限(上一部分中的步骤 6)。 此 API 权限允许应用在登录期间授予同意后代表已登录用户访问 Azure 存储。

以下屏幕截图显示了备用的交互式中转身份验证体验:

一张屏幕截图显示了在使用启用代理的 InteractiveBrowserCredential 实例对用户进行身份验证时的 macOS 登录体验。

重要

Linux 支持存在于 azure-identity-broker 版本 1.3.0 及更高版本中。

以下示例演示了如何使用 InteractiveBrowserCredential 通过 SubscriptionClient 进行身份验证:

  1. 安装这些包。 msal (Microsoft身份验证库)用于为参数提供常量 parent_window_handle

    pip install azure-identity-broker msal
    
  2. 创建 InteractiveBrowserBrokerCredential 实例,并传入父窗口引用。 需要你获取父窗口的引用,其上应显示(由 msal 模块提供的)帐户选取器对话框。 在下面的代码示例中,那将是这一行:

    credential = InteractiveBrowserBrokerCredential(
        parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE
    )
    
  3. 使用credential来访问 Azure 服务,在此示例中为 Blob 存储。

下面是最终代码示例:

from azure.identity.broker import InteractiveBrowserBrokerCredential
from azure.storage.blob import BlobServiceClient
import msal

credential = InteractiveBrowserBrokerCredential(
    parent_window_handle=msal.PublicClientApplication.CONSOLE_WINDOW_HANDLE
)

client = BlobServiceClient("https://<storage-account-name>.blob.core.windows.net/", credential=credential)

# Prompt for credentials appears on first use of the client
for container in client.list_containers():
    print(container.name)

运行此代码示例之前,请确保已在 Linux 分发版上安装 Linux 依赖项 。 此外,对于不同的发行版,WSL 有单独的说明。

若要进行更精确的控制,例如设置超时,你可以向 InteractiveBrowserBrokerCredential 提供特定参数,例如 timeout

若要使代码成功运行,必须在存储帐户上为用户帐户分配一个 Azure 角色,该角色允许访问 Blob 容器,例如 存储帐户数据参与者。 如果指定了应用,则必须为 user_impersonation访问 Azure 存储 设置 API 权限(上一部分中的步骤 6)。 此 API 权限允许应用在登录期间授予同意后代表已登录用户访问 Azure 存储。

以下视频显示了备用的交互式中转身份验证体验:

一个动画 gif,展示用户使用支持代理的 InteractiveBrowserCredential 实例进行身份验证时的 Linux 登录体验。