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

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

本文涉及的主题包括:

设备代码凭据

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

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

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

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

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

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

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

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

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

以下示例演示如何在 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,你需要在 Azure Active Directory 中注册具有代表用户登录的权限的应用程序。 请按照上述设备代码流步骤注册应用程序。 如前所述,租户的管理员必须向你的应用程序授予许可,然后用户帐户才能登录。

你可能会注意到在 InteractiveBrowserCredentialBuilder 中需要重定向 URL。 将重定向 URL 添加到已注册的 Azure AD 应用程序的“身份验证”部分下的“重定向 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 根据 Azure Active Directory 对应用程序进行身份验证。

为 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 上登录的用户信息,并使用它根据 Azure Active Directory 对应用程序进行身份验证。

为 IntelliJCredential 登录 Azure Toolkit for IntelliJ

请执行以下所述的步骤:

  1. 在 IntelliJ 窗口中,打开文件>设置>插件
  2. 在市场中搜索“Azure Toolkit for IntelliJ”。 安装并重新启动 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 中登录的用户信息,并使用它根据 Azure Active Directory 对应用程序进行身份验证。

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

Visual Studio Code 身份验证由与 Azure 帐户扩展的集成来处理。 若要使用此形式的身份验证,请安装 Azure 帐户扩展,然后使用 视图 > 命令面板 执行 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 提供的日志记录功能的信息。