共用方式為


在本地開發期間,透過經紀認證將 Java 應用程式驗證至 Azure 服務

代理驗證會使用系統驗證代理程式來收集使用者認證,以驗證應用程式。 系統驗證代理程式是在使用者電腦上執行的應用程式,可管理所有連線帳戶的驗證交握和權杖維護。

代理驗證提供下列優點:

  • 啟用單一 Sign-On(SSO): 讓應用程式簡化使用者與 Microsoft Entra ID 的認證方式,並保護Microsoft Entra ID刷新令牌免於外洩與濫用。
  • 增強安全性: 許多安全性增強功能隨代理程式一起提供,而不需要更新應用程式邏輯。
  • 增強的功能支援: 在代理的幫助下,開發人員可以存取豐富的作業系統和服務功能。
  • 系統整合: 使用代理程式的應用程式可隨插即用,並內建帳戶選擇器,讓使用者快速選擇現有帳戶,而不是一遍又一遍地重新輸入相同的憑證。
  • 代幣保護: 確保更新權杖與裝置系結,並讓應用程式取得與裝置系結的存取權杖。 請參閱 權杖保護

Windows 提供名為 Web Account Manager (WAM) 的認證代理。 WAM 使身份提供者如 Microsoft Entra ID 能原生接入作業系統,並為應用程式提供安全的登入服務。 代理驗證可讓應用程式執行互動式登入認證所允許的所有作業。

支持個人Microsoft帳戶和公司或學校帳戶。 在支援的 Windows 版本中,預設的瀏覽器介面被更流暢的認證體驗取代,類似內建的 Windows 應用程式。

設定應用程式以進行代理驗證

若要在應用程式中啟用代理驗證,請遵循下列步驟:

  1. Azure 入口網站,前往 Microsoft Entra ID,並於左側選單選擇 App registrations

  2. 選取您的應用程式的註冊,然後選取 [驗證]

  3. 透過平台設定,將適當的重新導向 URI 新增至您的應用程式註冊:

    1. [平台組態] 底下,選取 [+ 新增平臺]。

    2. [設定平台] 底下,選取應用程式類型 (平台) 的磚以設定其設定,例如 行動和桌面應用程式

    3. 自訂重定向 URI 中,輸入以下重定向 URI:

      ms-appx-web://Microsoft.AAD.BrokerPlugin/{your_client_id}

      請將應用程式註冊的{your_client_id}窗格中的應用程式(用戶端)ID 替換

    4. 選取[],然後設定[]。

    若要深入瞭解,請參閱 將重新導向 URI 新增至應用程式註冊

  4. 回到 [驗證] 窗格的 [進階設定] 底下,針對 [允許公用用戶端流程] 選取 []。

  5. 選取 [儲存] 以套用變更。

  6. 要授權特定資源的應用程式,請前往該資源,選擇 API 權限,並啟用 Microsoft Graph 及其他你想存取的資源。

    這很重要

    當您第一次登入時,您也必須是租戶的系統管理員,才能授予應用程式同意。

指派角色

要成功執行 App 程式碼並使用經紀驗證,請使用 Azure 角色基礎存取控制(RBAC) 授權使用者帳號權限。 為你的使用者帳號指派一個適當的角色,以支援相關 Azure 服務。 例如:

  • Azure Blob Storage:指派 Storage Account Data Contributor 角色。
  • Azure Key Vault:指派Key Vault 機密管理員角色。

若指定應用程式,必須設定 API 權限來設定 user_impersonation Access Azure Storage(前一節第 6 步)。 此 API 權限允許應用程式在登入時獲得同意後,代表已登入使用者存取 Azure 儲存空間。

實作程式碼

Azure Identity 函式庫支援透過 InteractiveBrowserCredential 進行經紀式認證。 azure-identity-broker 函式庫提供InteractiveBrowserBrokerCredentialBuilder,該InteractiveBrowserCredential能夠使用系統認證代理。 例如,若要在Java控制台應用程式中使用經紀驗證,與 SecretClient 進行Azure Key Vault認證,請依照以下步驟操作:

  1. azure-identity-broker 相依性加入你的 pom.xml 檔案。

    <dependency>
        <groupId>com.azure</groupId>
        <artifactId>azure-identity-broker</artifactId>
    </dependency>
    
  2. 取得父視窗的參考,帳戶選擇器對話方塊應該顯示在其上。 例如,請參見 「取得窗戶把手」。

  3. 建立 InteractiveBrowserCredential 的實例,使用 InteractiveBrowserBrokerCredentialBuilder

    import com.azure.identity.InteractiveBrowserCredential;
    import com.azure.identity.broker.InteractiveBrowserBrokerCredentialBuilder;
    import com.azure.security.keyvault.secrets.SecretClient;
    import com.azure.security.keyvault.secrets.SecretClientBuilder;
    import com.azure.security.keyvault.secrets.models.KeyVaultSecret;
    
    long windowHandle = getWindowHandle(); // See examples below
    
    InteractiveBrowserCredential credential = new InteractiveBrowserBrokerCredentialBuilder()
        .setWindowHandle(windowHandle)
        .useDefaultBrokerAccount()
        .build();
    
    SecretClient client = new SecretClientBuilder()
        .vaultUrl("https://<your-key-vault-name>.vault.azure.net")
        .credential(credential)
        .buildClient();
    
    KeyVaultSecret secret = client.getSecret("MySecret");
    System.out.println("Retrieved secret: " + secret.getName());
    

在前述範例中, useDefaultBrokerAccount 選擇以預設系統帳號進行靜默、經紀式的認證流程。 這樣,用戶就不必重複選擇同一個帳戶。 如果靜默的經紀驗證失敗,則 InteractiveBrowserCredential 會退回到互動式的經紀驗證。

下列螢幕擷取畫面顯示替代互動式代理驗證體驗:

當使用經紀人啟用的 InteractiveBrowserCredential 實例驗證使用者時的 Windows 登入過程截圖。

裝個窗戶把手

當你使用InteractiveBrowserCredential進行互動式認證時,你需要一個父視窗的句柄,確保驗證對話框正確地顯示在發送請求的視窗上。

JavaFX 應用程式

對於 JavaFX 應用程式,使用 JNA(Java Native Access)來取得視窗控制碼:

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.User32;
import com.sun.jna.platform.win32.WinDef;

public long getWindowHandle(Stage stage) {
    WinDef.HWND hwnd = User32.INSTANCE.FindWindow(null, stage.getTitle());
    return Pointer.nativeValue(hwnd.getPointer());
}

主控台應用程式

對於 Windows 上的主控台應用程式,請使用 JNA 取得主控台視窗的控制代碼。

import com.sun.jna.Pointer;
import com.sun.jna.platform.win32.Kernel32;
import com.sun.jna.platform.win32.WinDef;

WinDef.HWND hwnd = Kernel32.INSTANCE.GetConsoleWindow();
long windowHandle = Pointer.nativeValue(hwnd.getPointer());