Java 开发环境中的 Azure 身份验证

本文概述了 Azure 标识库对 Microsoft Entra 令牌身份验证的支持。 此支持通过一组 TokenCredential 实现,为在开发人员计算机上本地运行的应用程序启用身份验证。

本文介绍以下主题:

若要排查开发环境身份验证问题,请参阅 排查开发环境身份验证问题

设备代码凭据

设备代码凭据以交互方式在具有有限 UI 的设备上对用户进行身份验证。 它的工作原理是提示用户在应用程序尝试进行身份验证时访问启用浏览器的计算机的登录 URL。 然后,用户输入提及说明中的设备代码及其登录凭据。 身份验证成功后,请求身份验证的应用程序将在其运行的设备上成功进行身份验证。

有关详细信息,请参阅 Microsoft 标识平台和 OAuth 2.0 设备授权流

为应用程序启用设备代码流

若要通过设备代码流对用户进行身份验证,请执行以下步骤:

  1. 转到Azure 门户中的 Microsoft Entra ID 并查找应用注册。
  2. 导航到“身份验证”部分。
  3. 在“建议的重定向 URI”下,检查以 /common/oauth2/nativeclient 结尾的 URI
  4. 在“默认客户端类型”下,为“将应用程序视为公共客户端”选择“是”

这些步骤使应用程序能够进行身份验证,但仍无权登录 Microsoft Entra ID,或代表你访问资源。 若要解决此问题,请导航到“API 权限”,并启用 Microsoft Graph 和要访问的资源

首次登录时,还必须是租户的管理员,才能向应用程序授予许可。

如果无法在 Microsoft Entra ID 上配置设备代码流选项,则可能需要应用成为多租户。 若要使你的应用成为多租户应用,请导航到“身份验证”面板,然后选择“任何组织目录中的帐户”。 然后,为“将应用程序作为公共客户端”选择“是”

使用设备代码流对用户帐户进行身份验证

以下示例演示如何在 IoT 设备上使用 DeviceCodeCredential 对来自 azure-security-keyvault-secrets 客户端库的 SecretClient 进行身份验证。

DeviceCodeCredential deviceCodeCredential = new DeviceCodeCredentialBuilder()
  .challengeConsumer(challenge -> {
    // lets user know of the challenge
    System.out.println(challenge.getMessage());
  }).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(deviceCodeCredential)
  .buildClient();

交互式浏览器凭据

此凭据使用默认的系统浏览器以交互方式对用户进行身份验证,并通过让你使用自己的凭据对应用程序进行身份验证来提供流畅的身份验证体验。

为应用程序启用交互式浏览器 OAuth 2 流

若要使用 InteractiveBrowserCredential,需要在 Microsoft Entra ID 中注册应用程序,并有权代表用户登录。 按照设备代码流的前面步骤注册应用程序。 如前所述提及,租户的管理员必须先向应用程序授予许可,然后任何用户帐户才能登录。

你可能会注意到在 InteractiveBrowserCredentialBuilder 中需要重定向 URL。 将重定向 URL 添加到已注册的 Microsoft Entra 应用程序的“身份验证”部分下的“重定向 URI”子节。

在浏览器中以交互方式对用户帐户进行身份验证

以下示例演示如何使用 InteractiveBrowserCredential 对来自 azure-security-keyvault-secrets 客户端库的 SecretClient 进行身份验证。

InteractiveBrowserCredential interactiveBrowserCredential = new InteractiveBrowserCredentialBuilder()
  .clientId("<your client ID>")
  .redirectUrl("http://localhost:8765")
  .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(interactiveBrowserCredential)
  .buildClient();

Azure CLI 凭据

Azure CLI 凭据在开发环境中使用 Azure CLI 中已启用的用户或服务主体进行身份验证。 它使用给定用户已登录到 Azure CLI,并使用 CLI 针对 Microsoft Entra ID 对应用程序进行身份验证。

为 AzureCliCredential 登录 Azure CLI

使用以下 Azure CLI 命令以用户身份登录:

az login

使用以下命令以服务主体身份登录:

az login \
    --service-principal \
    --username <client-ID> \
    --password <client-secret> \
    --tenant <tenant-ID>

如果帐户或服务主体可以访问多个租户,请确保所需租户或订阅在以下命令的输出中处于“已启用”状态:

az account list

在代码中使用 AzureCliCredential 之前,请运行以下命令验证帐户是否已成功配置。

az account get-access-token

根据组织中的刷新令牌有效性,可能需要在特定时间段后重复此过程。 通常,刷新令牌的有效期为几周到几个月。 AzureCliCredential 提示你再次登录。

使用 Azure CLI 对用户帐户进行身份验证

以下示例演示如何在安装并登录了 Azure CLI 的工作站上使用 AzureCliCredential 对来自 azure-security-keyvault-secrets 客户端库的 SecretClient 进行身份验证。

AzureCliCredential cliCredential = new AzureCliCredentialBuilder().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(cliCredential)
  .buildClient();

IntelliJ 凭据

IntelliJ 凭据使用用于 IntelliJ 的 Azure 工具包中的帐户在开发环境中进行身份验证。 它使用 IntelliJ IDE 上的已登录用户信息,并使用它针对 Microsoft Entra ID 对应用程序进行身份验证。

为 IntelliJCredential 登录 Azure Toolkit for IntelliJ

使用以下步骤登录:

  1. 在 IntelliJ 窗口中,打开文件>设置>插件
  2. 在市场中搜索“用于 IntelliJ 的 Azure 工具包”。 安装并重新启动 IDE。
  3. 查找新的菜单项 工具 > Azure > 登录
  4. 设备登录 可帮助以用户帐户身份登录。 按照说明使用设备代码登录 login.microsoftonline.com 网站。 IntelliJ 会提示你选择订阅。 选择包含要访问的资源的订阅。

在 Windows 上,还需要 KeePass 数据库路径来读取 IntelliJ 凭据。 可以在“文件>设置外观和行为>系统>设置>密码”下的 IntelliJ 设置中找到路径。 记下 KeePassDatabase 路径的位置。

使用 IntelliJ IDEA 对用户帐户进行身份验证

以下示例演示如何在安装了 IntelliJ IDEA 并且用户已使用 Azure 帐户登录的工作站上使用 IntelliJCredential 对来自 azure-security-keyvault-secrets 客户端库的 SecretClient 进行身份验证。

IntelliJCredential intelliJCredential = new IntelliJCredentialBuilder()
  // KeePass configuration isrequired only for Windows. No configuration needed for Linux / Mac.
  .keePassDatabasePath("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(intelliJCredential)
  .buildClient();

Visual Studio Code 凭据

Visual Studio Code 凭据在开发环境中启用身份验证,在开发环境中,VS Code 随 VS Code Azure 帐户扩展一起安装。 它使用 VS Code IDE 中的已登录用户信息,并使用它针对 Microsoft Entra ID 对应用程序进行身份验证。

为 VisualStudioCodeCredential 登录 Visual Studio Code Azure 帐户扩展

Nn 与 Azure 帐户扩展 的集成处理 Visual Studio Code 身份验证。 若要使用此形式的身份验证,请安装 Azure 帐户扩展,然后使用 View > 命令面板 执行 Azure:登录 命令。 此命令将打开一个浏览器窗口并显示可以登录 Azure 的页面。 完成登录过程后,可以按指示关闭浏览器。 运行应用程序(在调试器或开发计算机上的任意位置)使用登录中的凭据。

使用 Visual Studio Code 对用户帐户进行身份验证

以下示例演示如何在安装了 Visual Studio Code 并且用户已使用 Azure 帐户登录的工作站上使用 VisualStudioCodeCredential 对来自 azure-security-keyvault-secrets 客户端库的 SecretClient 进行身份验证。

VisualStudioCodeCredential visualStudioCodeCredential = new VisualStudioCodeCredentialBuilder().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(visualStudioCodeCredential)
  .buildClient();

后续步骤

本文介绍了如何在开发过程中使用计算机上可用的凭据进行身份验证。 这种身份验证形式是你可以在 Azure SDK for Java 中进行身份验证的多种方法之一。 下列文章介绍了其他方式:

如果遇到与开发环境身份验证相关的问题,请参阅 开发环境身份验证疑难解答

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