使用用户凭据进行 Azure 身份验证

本文将介绍 Azure 标识库如何使用用户提供的凭据支持 Microsoft Entra 令牌身份验证。 这种支持是通过本文中讨论的一组 TokenCredential 实现来实现的。

本文介绍以下主题:

若要排查用户凭据身份验证问题,请参阅排查用户凭据身份验证问题

设备代码凭据

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

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

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

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

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

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

你还需要是租户的管理员,才能在首次登录时同意应用程序。

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

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

以下示例演示如何在 IoT 设备上使用 DeviceCodeCredential 对来自适用于 Java 的 Azure Key Vault 机密客户端库SecretClient 进行身份验证。

/**
 * Authenticate with device code credential.
 */
DeviceCodeCredential deviceCodeCredential = new DeviceCodeCredentialBuilder()
    .challengeConsumer(challenge -> {
    // Lets the user know about 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 进行身份验证。

/**
 * Authenticate interactively in the browser.
 */
InteractiveBrowserCredential interactiveBrowserCredential = new InteractiveBrowserCredentialBuilder()
    .clientId("<your app client ID>")
    .redirectUrl("YOUR_APP_REGISTERED_REDIRECT_URL")
    .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();

用户名密码凭据

UsernamePasswordCredential 有助于使用不需要多重身份验证的用户凭据对公共客户端应用程序进行身份验证。 以下示例演示如何使用 UsernamePasswordCredential 对来自 azure-security-keyvault-secrets 客户端库的 SecretClient 进行身份验证。 用户不得启用多重身份验证。

/**
 * Authenticate with username, password.
 */
UsernamePasswordCredential usernamePasswordCredential = new UsernamePasswordCredentialBuilder()
    .clientId("<your app client ID>")
    .username("<your username>")
    .password("<your password>")
    .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(usernamePasswordCredential)
    .buildClient();

有关详细信息,请参阅 Microsoft 标识平台和 OAuth 2.0 资源所有者密码凭据

后续步骤

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

如果遇到与用户凭据身份验证相关的问题,请参阅排查用户凭据身份验证问题

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