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 凭据在开发环境中使用 Azure Toolkit for IntelliJ 中的帐户进行身份验证。 它使用 IntelliJ IDE 上的已登录用户信息,并使用它根据 Microsoft Entra ID 对应用程序进行身份验证。

为 IntelliJCredential 登录 Azure Toolkit for IntelliJ

按照以下步骤来登录:

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

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

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

IntelliJCredential intelliJCredential = new IntelliJCredentialBuilder()
  .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();

后续步骤

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

如果遇到与开发环境身份验证相关的问题,请参阅排查开发环境身份验证问题

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