通过


使用中转身份验证在本地开发期间对Azure服务Java应用进行身份验证

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

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

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

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

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

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

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

  1. Azure 门户中,导航到 Microsoft Entra ID,然后在左侧菜单中选择 App registrations

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

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

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

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

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

      ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}

      {your_client_id} 替换为应用注册的“概述”窗格中的应用程序(客户端)ID

    4. 选择配置

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

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

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

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

    重要

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

分配角色

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

  • Azure Blob Storage:分配存储帐户数据贡献者角色。
  • Azure Key Vault:分配Key Vault 机密管理员角色。

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

实现代码

Azure标识库支持使用 InteractiveBrowserCredential 进行中转身份验证。 azure-identity-broker 库提供InteractiveBrowserBrokerCredentialBuilder,该功能创建了一个可以使用系统身份验证代理的InteractiveBrowserCredential。 例如,要在 Java 控制台应用中使用代理身份验证,通过 SecretClient 对 Azure Key Vault 进行身份验证,请按以下步骤操作:

  1. azure-identity-broker 依赖项添加到 pom.xml 文件:

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-broker</artifactId>
    </dependency>
    
  2. 获取对父窗口的引用,其中应显示帐户选取器对话框。 有关示例,请参阅 “获取窗口句柄”。

  3. 使用InteractiveBrowserBrokerCredentialBuilder创建InteractiveBrowserCredential实例:

    import com.azure.identity.InteractiveBrowserCredential;
    import com.azure.identity.broker.InteractiveBrowserBrokerCredentialBuilder;
    import com.azure.security.keyvault.secrets.SecretClient;
    import com.azure.security.keyvault.secrets.SecretClientBuilder;
    import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
    
    long windowHandle = getWindowHandle(); // See examples below
    
    InteractiveBrowserCredential credential = new InteractiveBrowserBrokerCredentialBuilder()
        .setWindowHandle(windowHandle)
        .useDefaultBrokerAccount()
        .build();
    
    SecretClient client = new SecretClientBuilder()
        .vaultUrl("https://<your-key-vault-name>.vault.azure.net")
        .credential(credential)
        .buildClient();
    
    KeyVaultSecret secret = client.getSecret("MySecret");
    System.out.println("Retrieved secret: " + secret.getName());
    

在前面的示例中, useDefaultBrokerAccount 选择使用默认系统帐户进入无提示的中转身份验证流。 这样,用户就不必重复选择同一帐户。 如果无提示的中转身份验证失败,InteractiveBrowserCredential 将回退到交互式中转身份验证。

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

显示使用启用代理的 InteractiveBrowserCredential 实例来验证用户身份时的 Windows 登录体验的截图。

获取窗口句柄

使用 InteractiveBrowserCredential交互方式进行身份验证时,需要一个父窗口句柄,以确保身份验证对话框在发送请求的窗口中正确显示。

JavaFX 应用程序

对于 JavaFX 应用程序,请使用 JNA(Java Native Access)获取窗口句柄:

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;

public long getWindowHandle(Stage stage) {
    WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, stage.getTitle());
    return Pointer.nativeValue(hwnd.getPointer());
}

控制台应用程序

对于Windows上的控制台应用程序,请使用 JNA 获取控制台窗口句柄:

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef;

WinDef.HWND hwnd = Kernel32.INSTANCE.GetConsoleWindow();
long windowHandle = Pointer.nativeValue(hwnd.getPointer());