通过


使用系统分配的托管标识验证 Azure 托管的 Java 应用程序以访问 Azure 资源

向其他Azure资源验证Azure托管应用的建议方法是使用 managed identity。 大多数Azure服务都支持此方法,包括托管在Azure App Service、Azure Container Apps和Azure Virtual Machines上的应用。 有关详细信息,请参阅Azure支持托管标识的服务和资源类型。 有关不同身份验证技术和方法的详细信息,请参阅 使用 Azure 标识库将 Java 应用程序验证到 Azure 服务

在以下部分中,你将了解:

  • 基本托管标识概念。
  • 如何为应用创建系统分配的托管标识。
  • 如何为系统分配的托管标识分配角色。
  • 如何通过应用代码使用系统分配的托管标识进行身份验证。

基本托管标识概念

托管标识使应用能够安全地连接到其他Azure资源,而无需使用密钥或其他应用程序机密。 在内部,Azure会跟踪身份以及其被允许连接的资源。 Azure使用此信息自动获取应用的Microsoft Entra令牌,以允许它连接到其他Azure资源。

配置托管应用时,需要考虑两种类型的托管标识:

  • 由系统分配的托管标识会直接在 Azure 资源上启用,并关联到其生命周期。 删除资源时,Azure 会自动为您删除身份。 系统分配的标识提供了使用托管标识的极简方法。
  • 用户分配的托管标识作为独立的 Azure 资源创建,并提供更大的灵活性和功能。 它们非常适合涉及需要共享相同标识和权限的多个Azure资源的解决方案。 例如,如果多个虚拟机需要访问同一组Azure资源,则用户分配的托管标识可提供可重用性和优化的管理。

小窍门

在托管标识 最佳做法建议 文章中,详细了解如何选择和管理系统分配的托管标识和用户分配的托管标识。

以下部分介绍了为Azure托管应用启用和使用系统分配的托管标识的步骤。 如果需要使用用户分配的托管标识,请参阅 使用用户分配的托管标识验证 Azure 托管的 Java 应用对 Azure 资源的访问

在Azure托管资源上启用系统分配的托管标识

若要开始在应用中使用系统分配的托管标识,请在托管应用的Azure资源(例如Azure App Service、Azure Container Apps或Azure Virtual Machines实例)上启用标识。

可以使用Azure门户或Azure CLI为Azure资源启用系统分配的托管标识。

  1. 在Azure门户中,导航到托管应用程序代码的资源,例如Azure App Service或Azure Container Apps实例。

  2. 在资源的 概述 页中,展开 设置,并从导航菜单中选择 身份

  3. “身份” 页上,将 “状态” 滑块切换为 “开启”

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

    显示如何在容器应用中启用系统分配的托管标识的屏幕截图。

为托管标识分配角色

接下来,确定应用需要哪些角色并将这些角色分配给托管标识。 你可以为托管标识分配以下范围内的角色:

  • 资源:分配的角色仅适用于该特定资源。
  • 资源组:分配的角色适用于资源组中包含的所有资源。
  • 订阅:被分配的角色适用于订阅中包含的所有资源。

以下示例演示如何在资源组范围内分配角色,因为许多应用使用单个资源组管理其所有相关Azure资源。

  1. 导航到包含具有系统分配托管标识的应用的资源组的 “概述 ”页。

  2. 在左侧导航栏中,选择“访问控制(IAM)”

  3. 访问控制(IAM) 页上,选择顶部菜单上的 + 添加,然后选择 添加角色分配 导航到 添加角色分配 页。

    显示如何访问标识角色分配页的屏幕截图。

  4. “添加角色分配”页展示了一个分步骤的选项卡式工作流程,用于将角色分配给标识。 在初始“角色”选项卡上,使用顶部的搜索框来定位你想要分配给标识的角色。

  5. 从结果中选择角色,然后选择 “下一步” 以进入“成员”选项卡。

  6. 对于“将访问权限分配到”选项,请选择“托管标识”

  7. 对于“成员”选项,请选择“+ 选择成员”,以打开“选择托管标识”面板。

  8. 选择托管标识 面板中,使用 订阅托管标识 下拉列表来筛选标识的搜索结果。 使用 Select 搜索框查找已为托管您应用的 Azure 资源启用的系统标识。

    显示托管标识分配过程的屏幕截图。

  9. 选择标识,并在面板底部选择选择以继续。

  10. 选择页面底部的“查看 + 分配”

  11. 在最终的 审阅 + 分配 选项卡中,选择 审阅 + 分配 以完成整个工作流程。

通过应用向Azure服务进行身份验证

Azure 标识库 提供了各种 凭据 的实现,这些实现适用于支持不同方案和 Microsoft Entra 认证流。 由于托管标识在本地运行时不可用,因此后续步骤演示了在哪种方案中要使用的凭据:

  • 本地开发环境:在仅本地开发期间,请使用名为 defaultAzureCredential 的类,以获取敏捷的预配置凭据链。 DefaultAzureCredential从本地工具或 IDE(例如 Azure CLI 或 Visual Studio Code)中获取用户凭据。 它还为重试、响应等待时间以及支持多个身份验证选项提供了灵活性和便利。 请访问 在本地开发期间对 Azure 服务进行身份验证 一文了解详细信息。
  • Azure托管的应用:当应用在 Azure 中运行时,请使用 ManagedIdentityCredential 安全地发现为应用配置的托管标识。 指定这种确切类型的凭据可防止意外地获取其他可用凭据。

实现代码

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

<dependency>
    <groupId>com.azure</groupId>
    <artifactId>azure-identity</artifactId>
</dependency>

使用各种 Azure SDK 客户端库中的专用客户端类访问 Azure 服务。 下面的代码示例演示如何创建凭据实例并将其与Azure SDK服务客户端一起使用。 在应用程序代码中,完成以下步骤以使用托管标识进行身份验证:

  1. 导入DefaultAzureCredentialBuilderManagedIdentityCredentialBuilderTokenCredential类。
  2. 将适当的 TokenCredential 实例传递给客户端:
    • 在本地运行时使用DefaultAzureCredential
    • 在 Azure 中运行应用时使用ManagedIdentityCredential

以下示例演示如何使用系统分配的托管标识进行身份验证 SecretClient

import com.azure.core.credential.TokenCredential;
import com.azure.identity.DefaultAzureCredentialBuilder;
import com.azure.identity.ManagedIdentityCredentialBuilder;
import com.azure.security.keyvault.secrets.SecretClient;
import com.azure.security.keyvault.secrets.SecretClientBuilder;

TokenCredential credential = null;

// Set up credential based on environment (Azure or local development)
String environment = System.getenv("ENV");

if (environment != null && environment.equals("production")) {
    credential = new ManagedIdentityCredentialBuilder()
        .build();
} else {
    credential = new DefaultAzureCredentialBuilder()
        .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(credential)
    .buildClient();

后续步骤

本文介绍了使用系统分配的托管标识进行身份验证。 这种形式的身份验证是可在Java的Azure SDK中进行身份验证的多种方式之一。 以下文章介绍了其他方法:

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