对 Azure 托管的 Java 应用程序进行身份验证
本文介绍 Azure 标识库如何支持 Azure 上托管的应用程序的 Microsoft Entra 令牌身份验证。 这种支持是通过本文中讨论的一组 TokenCredential
实现来实现的。
本文介绍以下主题:
若要排查与 Azure 托管的应用程序相关的身份验证问题,请参阅排查 Azure 托管的应用程序身份验证问题。
默认 Azure 凭据
DefaultAzureCredential
适用于应用程序最终在 Azure 云中运行的大多数方案。 DefaultAzureCredential
将常用于在部署时进行身份验证的凭据与用于在开发环境中进行身份验证的凭据相结合。 DefaultAzureCredential
将依次尝试通过以下机制进行身份验证:
- 环境 -
DefaultAzureCredential
通过环境变量读取指定的帐户信息,并使用该信息进行身份验证。 - 托管标识 - 如果将应用程序部署到了启用了托管标识的 Azure 主机,则
DefaultAzureCredential
将使用该帐户进行身份验证。 - IntelliJ - 如果已通过 Azure Toolkit for IntelliJ 进行身份验证,则
DefaultAzureCredential
将使用该帐户进行身份验证。 - Visual Studio Code - 如果你曾通过 Visual Studio Code Azure 帐户插件进行身份验证,
DefaultAzureCredential
将使用该帐户进行身份验证。 - Azure CLI - 如果你曾通过 Azure CLI
az login
命令对帐户进行身份验证,DefaultAzureCredential
将使用该帐户进行身份验证。
配置 DefaultAzureCredential
DefaultAzureCredential
通过 DefaultAzureCredentialBuilder
或环境变量上的资源库支持一组配置。
- 按照环境变量中的定义设置环境变量
AZURE_CLIENT_ID
、AZURE_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 进行身份验证
以下示例演示了使用 DefaultAzureCredential
从 azure-security-keyvault-secrets 客户端库中对 SecretClient
进行身份验证。
// 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 对用户分配的托管标识进行身份验证
以下示例演示了如何使用部署到 Azure 资源的 DefaultAzureCredential
对 azure-security-keyvault-secrets 客户端库中的 SecretClient
进行身份验证,并配置了用户分配的托管标识。
/**
* 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 中对用户进行身份验证
以下示例演示了在安装了 IntelliJ IDEA 的工作站上,使用 DefaultAzureCredential
对 azure-security-keyvault-secrets 客户端库中的 SecretClient
进行身份验证,并且用户已使用 Azure 帐户登录到 Azure Toolkit for IntelliJ。
有关配置 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 资源的托管标识(系统或用户分配)进行身份验证。 因此,如果应用程序在通过 IDENTITY/MSI
、IMDS
终结点或两者支持托管标识的 Azure 资源内运行,则此凭据将对你的应用程序进行身份验证,并提供出色的无机密身份验证体验。
有关详细信息,请参阅什么是 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();
环境变量
可以使用环境变量配置 DefaultAzureCredential
和 EnvironmentCredential
。 每种类型的身份验证都需要特定变量的值:
具有机密的服务主体
变量名称 | 值 |
---|---|
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 提供的日志记录功能的信息。