使用用户凭据进行 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 以及要访问的资源,例如密钥库。

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

如果无法在 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 提供的日志记录功能的信息。