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

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

本文介绍以下主题:

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

DefaultAzureCredential

DefaultAzureCredential 将常用于在部署时进行身份验证的凭据与用于在开发环境中进行身份验证的凭据相结合。 有关详细信息,请参阅 DefaultAzureCredential 概述

配置 DefaultAzureCredential

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

  • 按照环境变量中的定义设置环境变量 AZURE_CLIENT_IDAZURE_CLIENT_SECRETAZURE_TENANT_ID,配置 DefaultAzureCredential 作为值指定的服务主体进行身份验证。
  • 在生成器或环境变量AZURE_CLIENT_ID上设置.managedIdentityClientId(String)配置为DefaultAzureCredential以用户分配的托管标识进行身份验证,同时将其留空,将其配置为作为系统分配的托管标识进行身份验证。
  • 在生成器或环境变量AZURE_TENANT_ID上设置.tenantId(String)配置为DefaultAzureCredential对共享令牌缓存或 IntelliJ IDEA 的特定租户进行身份验证。
  • 设置环境变量 AZURE_USERNAME 会配置 DefaultAzureCredential 从共享令牌缓存中选取相应的缓存令牌。

使用 DefaultAzureCredential 进行身份验证

以下示例演示如何使用DefaultAzureCredential以下命令对 SecretClient azure-security-keyvault-secrets 客户端库进行身份验证:

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

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

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

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

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

ManagedIdentityCredential

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

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

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

以下示例演示如何在 ManagedIdentityCredential Azure 上使用虚拟机、App 服务、Functions 应用、Cloud Shell、Service Fabric、Arc 或 AKS 环境(启用了系统分配或用户分配的托管标识)从 azure-security-keyvault-secrets 客户端库进行身份验证SecretClient

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

// Azure SDK client builders accept the credential as a parameter.
SecretClient client = new SecretClientBuilder()
  .vaultUrl("https://<KEY_VAULT_NAME>.vault.azure.net")
  .credential(credential)
  .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_CERTIFICATE_PASSWORD (可选)证书文件的密码(如果有)。
AZURE_CLIENT_SEND_CERTIFICATE_CHAIN (可选)在 x5c 标头中发送证书链以支持基于使用者名称/基于颁发者的身份验证。

用户名和密码

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

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

后续步骤

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

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

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