对 Azure 托管的 Java 应用程序进行身份验证

本文介绍 Azure 标识库如何为 Azure 上托管的应用程序支持 Microsoft Entra 令牌身份验证。 通过本文中讨论的一组 TokenCredential 实现可以实现此支持。

本文介绍以下主题:

若要排查与 Azure 托管的应用程序相关的身份验证问题,请参阅 排查 Azure 托管的应用程序身份验证问题

默认 Azure 凭据

DefaultAzureCredential 适用于大多数应用程序最终在 Azure 云中运行的情况。 DefaultAzureCredential 将常用于在部署时进行身份验证的凭据与用于在开发环境中进行身份验证的凭据相结合。 DefaultAzureCredential 尝试按顺序通过以下机制进行身份验证:

DefaultAzureCredential authentication flow

  • 环境 - DefaultAzureCredential 读取通过 环境变量 指定的帐户信息,并使用它进行身份验证。
  • 托管标识 - 如果应用程序部署到启用了托管标识的 Azure 主机, DefaultAzureCredential 请使用该帐户进行身份验证。
  • IntelliJ - 如果已通过用于 IntelliJ 的 Azure 工具包进行身份验证, DefaultAzureCredential 请使用该帐户进行身份验证。
  • Visual Studio Code - 如果已通过 Visual Studio Code Azure 帐户插件进行身份验证, DefaultAzureCredential 请使用该帐户进行身份验证。
  • Azure CLI - 如果已通过 Azure CLI az login 命令对帐户进行身份验证, DefaultAzureCredential 请使用该帐户进行身份验证。

配置 DefaultAzureCredential

DefaultAzureCredential 通过 DefaultAzureCredentialBuilder 或环境变量上的资源库支持一组配置。

  • 设置环境变量 AZURE_CLIENT_IDAZURE_CLIENT_SECRET以及 AZURE_TENANT_ID 环境变量中 定义的环境变量 配置为 DefaultAzureCredential 作为值指定的服务主体进行身份验证。
  • 在生成器或环境变量AZURE_CLIENT_ID上设置.managedIdentityClientId(String)配置为DefaultAzureCredential以用户定义的托管标识进行身份验证,同时将其留空,将其配置为作为系统分配的托管标识进行身份验证。
  • 在生成器或环境变量AZURE_TENANT_ID上设置.tenantId(String)配置为DefaultAzureCredential向特定租户进行身份验证,以便共享令牌缓存、Visual Studio Code 和 IntelliJ IDEA。
  • 设置环境变量 AZURE_USERNAME 配置为 DefaultAzureCredential 从共享令牌缓存中选择相应的缓存令牌。
  • 在生成器上设置 .intelliJKeePassDatabasePath(String) 配置为 DefaultAzureCredential 在使用 IntelliJ 凭据进行身份验证时读取特定的 KeePass 文件。

使用 DefaultAzureCredential 进行身份验证

以下示例演示如何使用 DefaultAzureCredentialSecretClientazure-security-keyvault-secrets 客户端库进行身份验证。

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(new DefaultAzureCredentialBuilder().build())
  .buildClient();

使用 DefaultAzureCredential 对用户分配的托管标识进行身份验证

以下示例演示如何SecretClient使用DefaultAzureCredential部署到配置了用户分配的托管标识的 Azure 资源对 azure-security-keyvault-secrets 客户端库进行身份验证。

/**
 * The default credential uses the user-assigned managed identity with the specified client ID.
 */
DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder()
  .managedIdentityClientId("<managed identity client ID>")
  .build();

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(defaultCredential)
  .buildClient();

使用 DefaultAzureCredential 在 Azure Toolkit for IntelliJ 中对用户进行身份验证

以下示例演示如何SecretClientDefaultAzureCredential安装了 IntelliJ IDEA 的工作站上使用 azure-security-keyvault-secrets 客户端库进行身份验证,并且用户已使用 Azure 帐户登录到用于 IntelliJ 的 Azure 工具包。

有关配置 IntelliJ IDEA 的详细信息,请参阅登录用于 IntelliJCredential 的 Azure Toolkit for IntelliJ

/**
 * The default credential uses the KeePass database path to find the user account in IntelliJ on Windows.
 */
// KeePass configuration is required only for Windows. No configuration needed for Linux / Mac.
DefaultAzureCredential defaultCredential = new DefaultAzureCredentialBuilder()
  .intelliJKeePassDatabasePath("C:\\Users\\user\\AppData\\Roaming\\JetBrains\\IdeaIC2020.1\\c.kdbx")
  .build();

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(defaultCredential)
  .buildClient();

托管标识凭据

托管标识对 Azure 资源的托管标识(系统或用户分配)进行身份验证。 因此,如果应用程序在支持托管标识的 Azure 资源中运行,则此凭据会获得IDENTITY/MSIIMDS应用程序身份验证,并提供出色的无机密身份验证体验。

有关详细信息,请参阅什么是 Azure 资源的托管标识?

在 Azure 中通过托管标识进行身份验证

以下示例演示如何在启用了系统分配或用户分配的托管标识的情况下,使用 Azure 上的虚拟机、应用服务、函数应用、Cloud Shell、service fabric、arc 或 AKS 环境中的 ManagedIdentityCredential 对来自 azure-security-keyvault-secrets 客户端库的 SecretClient 进行身份验证。

/**
 * Authenticate with a managed identity.
 */
ManagedIdentityCredential managedIdentityCredential = new ManagedIdentityCredentialBuilder()
  .clientId("<user-assigned managed identity client ID>") // required only for user-assigned
  .build();

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<your Key Vault name>.vault.azure.net")
  .credential(managedIdentityCredential)
  .buildClient();

环境变量

可以使用环境变量配置 DefaultAzureCredentialEnvironmentCredential。 每种类型的身份验证都需要特定变量的值:

具有机密的服务主体

变量名称
AZURE_CLIENT_ID Microsoft Entra 应用程序的 ID。
AZURE_TENANT_ID 应用程序的 Microsoft Entra 租户的 ID。
AZURE_CLIENT_SECRET 应用程序的客户端机密之一。

具有证书的服务主体

变量名称
AZURE_CLIENT_ID Microsoft Entra 应用程序的 ID。
AZURE_TENANT_ID 应用程序的 Microsoft Entra 租户的 ID。
AZURE_CLIENT_CERTIFICATE_PATH 包括私钥的 PEM 编码的证书文件的路径(无密码保护)。

用户名和密码

变量名称
AZURE_CLIENT_ID Microsoft Entra 应用程序的 ID。
AZURE_USERNAME 用户名(通常为电子邮件地址)。
AZURE_PASSWORD 给定用户名的关联密码。

按此顺序尝试配置。 例如,如果客户端机密和证书的值都存在,则使用客户端机密。

后续步骤

本文介绍了 Azure 中托管的应用程序的身份验证。 这种身份验证形式是你可以在 Azure SDK for Java 中进行身份验证的多种方法之一。 下列文章介绍了其他方式:

如果遇到与 Azure 托管的应用程序身份验证相关的问题,请参阅 排查 Azure 托管的应用程序身份验证问题

掌握身份验证之后,请参阅在 Azure SDK for Java 中配置日志记录,以获取有关 SDK 提供的日志记录功能的信息。