使用 Microsoft Entra 識別碼啟用 Java WebSphere 應用程式的登入

此範例示範一個 Java WebSphere 應用程式,該程式會使用 適用於 Java 的 Microsoft 驗證資源庫 (MSAL),讓使用者登入您的 Microsoft Entra ID 租用戶。

下圖顯示應用程式的拓撲:

顯示應用程式拓撲的圖表。

用戶端應用程式會使用 MSAL for Java (MSAL4J) 讓使用者登入其自己的 Microsoft Entra ID 租用戶,並從 Microsoft Entra ID 取得 ID 權杖。 ID 權杖可證明使用者已透過此租用戶完成驗證。 應用程式會根據使用者的驗證狀態保護其路由。

必要條件

  • JDK 版本 8 或更新版本
  • Maven 3
  • Microsoft Entra ID 租用戶。 如需更多資訊,請參閱 如何取得 Microsoft Entra ID 租用戶。
  • 如果您只想使用組織目錄中的帳戶,也就是以單一租用戶模式運作,則請使用您自己的 Microsoft Entra ID 租用戶中的使用者帳戶。 如果您尚未在 Microsoft Entra ID 租使用者中建立使用者帳戶,您應該先這樣做,再繼續。 如需更多資訊,請參閱 如何建立、邀請和刪除使用者。
  • 如果您想要使用任何組織目錄中的帳戶(也就是在多租用戶模式下),則需要有任何組織的 Microsoft Entra ID 租用戶中的使用者帳戶。 您必須修改此範例,才能使用個人Microsoft帳戶。 如果您尚未在Microsoft Entra ID 租使用者中建立用戶帳戶,您應該先這樣做,再繼續。 如需更多資訊,請參閱 如何建立、邀請和刪除使用者。
  • 如果您想要使用個人 Microsoft 帳戶,則需使用個人 Microsoft 帳戶(例如 Xbox、Hotmail、Live 等)。
  • WebSphere
  • Visual Studio Code
  • 適用於 Visual Studio Code 的 Azure 工具

建議

  • 對 Java / Jakarta Servlets 有一些基本了解。
  • 對 Linux/OSX 終端機操作有基本了解。
  • jwt.ms 用於檢查您的權杖。
  • Fiddler 用於監控您的網路活動及進行疑難排解。
  • 關注 Microsoft Entra 部落格,隨時掌握最新發展。

設定範例

下列各節說明如何設定範例應用程式。

複製或下載範例存放庫

若要複製範例,請開啟Bash視窗,並使用下列命令:

git clone https://github.com/Azure-Samples/ms-identity-msal-java-samples.git
cd 3-java-servlet-web-app/1-Authentication/sign-in

或者,瀏覽至 ms-identity-msal-java-samples 存放庫,然後將其下載為 .zip 檔案,並解壓縮到您的硬碟。

重要

若要避免 Windows 上的檔案路徑長度限制,請將存放庫複製到硬碟根目錄附近的目錄中。

在 Microsoft Entra ID 租用戶中註冊範例應用程式

此範例中有一個專案。 本節說明如何註冊應用程式。

首先,請依照 快速入門:使用 Microsoft 身分識別平台註冊應用程式 中的指示,在 Azure 入口網站中註冊應用程式。

然後,使用下列步驟來完成註冊:

  1. 瀏覽至 Microsoft 身分識別平台開發人員適用的 應用程式註冊 頁面。

  2. 選取 新增註冊。

  3. 在出現的 [ 註冊應用程式] 頁面中 ,輸入下列應用程式註冊資訊:

    • 在 名稱 區段中,輸入有意義的應用程式名稱,作為應用程式使用者看到的顯示名稱,例如 。

    • 在 [支持的帳戶類型] 底下,選取下列其中一個選項:

      • 如果您正在建置的應用程式僅供您租用戶中的使用者使用,請選取 僅此組織目錄中的帳戶;也就是說,這是 單一租用戶 應用程式。
      • 如果您希望任何 Microsoft Entra ID 租用戶中的使用者都能使用您的應用程式,請選取任何組織目錄中的帳戶,也就是說,這是多租用戶應用程式。
      • 選取 任何組織目錄中的帳戶和 Microsoft 個人帳戶,以涵蓋最廣泛的客戶群,也就是同時支援 Microsoft 個人帳戶的多租用戶應用程式。
      • 選取 [個人Microsoft帳戶],僅供個人Microsoft帳戶 的使用者使用 -- 例如 Hotmail、Live、Skype 和 Xbox 帳戶。
    • 在 重新導向 URI 區段中,於下拉式方塊選取 Web,然後輸入下列重新導向 URI:。

  4. 選取 註冊 以建立應用程式。

  5. 在應用程式的註冊頁面上,尋找並複製 應用程式 (用戶端) 識別碼 值,以供稍後使用。 您會在應用程式的組態檔或檔案中使用此值。

  6. 在應用程式的註冊頁面上,選取 瀏覽窗格中的 [憑證和秘密 ],以開啟頁面以產生秘密並上傳憑證。

  7. 在用戶端密碼區段底下,選取新增用戶端密碼。

  8. 輸入描述 - 例如, 應用程式秘密。

  9. 選取祕密的到期日,或指定自訂存留期。 用戶端機密的有效期限限制為 24 個月,Microsoft 建議有效期少於 12 個月。 對於生產應用程式,建議使用憑證或聯邦身份憑證,而非用戶端秘密。

  10. 選取新增。 產生的值隨即顯示。

  11. 複製並儲存產生的值,以供後續步驟使用。 您需要此值用於您的程式碼設定檔。 此值不會再次顯示,而且您無法透過任何其他方式加以擷取。 因此,請務必先在 Azure 入口網站中將其儲存,再切換到任何其他畫面或窗格。


設定應用程式,使其使用您的應用程式註冊

使用下列步驟來設定應用程式:

注意

在以下步驟中, 與 或 相同。

  1. 在 IDE 中開啟專案。

  2. 開啟 ./src/main/resources/authentication.properties 檔案。

  3. 找出字串 。 以以下其中一個值取代現有值:

    • 如果您是以 僅限此組織目錄中的帳戶 選項註冊您的應用程式,則為您的 Microsoft Entra ID 租用戶識別碼。
    • 如果您使用 任何組織目錄中的帳戶 選項註冊您的應用程式,則該字為 。
    • 如果您使用 任何組織目錄中的帳戶和個人 Microsoft 帳戶 選項註冊您的應用程式,則會顯示字詞 。
    • 如果您使用個人 Microsoft 帳戶選項註冊應用程式,則該字詞為。
  4. 尋找字串 ,並將現有的值取代為從 Azure 入口網站複製的 應用程式的應用程式識別碼或 。

  5. 尋找字串 ,並將現有值替換為您在 Azure 入口網站中建立 應用程式時所儲存的值。

建置範例

若要使用 Maven 建置範例,請流覽至包含 範例pom.xml 檔案的目錄,然後執行下列命令:

mvn clean package

此命令會產生 您可以在各種應用程式伺服器上執行的 .war 檔案。

執行範例

這些指示假設您已安裝 WebSphere 並設定伺服器。 您可以使用 在 Azure 虛擬機器上部署 WebSphere Application Server(傳統)叢集 中的指引,來進行基本的伺服器設定。

在部署至 WebSphere 之前,請使用下列步驟在範例本身進行一些組態變更,然後建置或重建套件:

  1. 前往應用程式的 authentication.properties 檔案,並將 的值變更為您計畫使用的伺服器 URL 和埠號碼,如下列範例所示:

    # app.homePage is by default set to dev server address and app context path on the server
    # for apps deployed to azure, use https://your-sub-domain.azurewebsites.net
    app.homePage=https://<server-url>:<port-number>/msal4j-servlet-auth/
    
  2. 儲存此檔案之後,請使用下列命令重建您的應用程式:

    mvn clean package
    
  3. 程式代碼完成建置之後,請將 .war 檔案複製到目標伺服器的文件系統。

您也需要在 Azure 應用程式註冊中進行相同的變更,也就是在 Azure 入口網站的 驗證 索引標籤上,將它設定為 重新導向 URI 值。

  1. 瀏覽至 Microsoft 身分識別平台開發人員適用的 應用程式註冊 頁面。

  2. 使用搜尋方塊搜尋您的應用程式註冊,例如 。

  3. 選取應用程式名稱以開啟您的應用程式註冊。

  4. 從選單中選擇 驗證。

  5. 在 Web重新導向 URI 區段中,選取 新增 URI。

  6. 填入您的應用程式 URI,並在後面加上 /auth/redirect;例如:。

  7. 選取 儲存。

使用下列步驟,使用 WebSphere 的整合式解決方案控制台來部署範例:

  1. 在 [應用程式] 索引標籤上,選取 [新增應用程式],然後選取 [新增企業應用程式]。

  2. 選擇您建置的 .war 檔案,然後選取 下一步,直到您進入 對應 Web 模組的內容根目錄 安裝步驟。 其他預設設定應該沒問題。

  3. 對於內容根,請將其設為與您在範例組態/Azure 應用程式註冊中設定的「重新導向 URI」內埠號後面的值相同。 也就是說,如果重新導向 URI 是 ,則內容根應為 。

  4. 選取 完成。

  5. 應用程式完成安裝之後,請移至 [應用程式] 索引標籤的 [WebSphere 企業應用程式] 區段。

  6. 從應用程式清單中選取您安裝的 .war 檔案,然後選取 [開始部署]。

  7. 部署完成後,瀏覽至 ,您應該就能看到該應用程式。

探索範例

使用下列步驟來探索範例:

  1. 請注意畫面中央顯示的已登入或註銷狀態。
  2. 選取角落中的上下文相關按鈕。 當您第一次執行應用程式時,此按鈕會顯示為登入。
  3. 在下一個頁面上,遵循指示,並使用 Microsoft Entra ID 租使用者中的帳戶登入。
  4. 在同意畫面上,請注意所要求的範圍。
  5. 請注意,上下文相關按鈕現在會顯示 [註銷 ] 並顯示您的用戶名稱。
  6. 選取ID 權杖詳細資料即可查看 ID 權杖部分已解碼的宣告。
  7. 使用角落的按鈕登出。
  8. 登出後,選取 ID Token Details,確認當使用者未獲授權時,應用程式會顯示 錯誤,而不是 ID 權杖宣告內容。

關於程式碼

此範例示範如何使用 MSAL for Java (MSAL4J),讓使用者登入您的 Microsoft Entra ID 租用戶。 如果您想要在自己的應用程式中使用 MSAL4J,您必須使用 Maven 將它新增至專案。

如果您想要重現此範例的行為,可以複製 pom.xml 檔案,以及 src/main/java/com/microsoft/azuresamples/msal4j 資料夾中的 helpers 和 authservlets 資料夾內容。 您也需要 authentication.properties 檔案。 這些類別和檔案包含一般程式代碼,您可以在各種應用程式中使用。 您也可以複製範例的其餘部分,但會特別建置其他類別和檔案,以解決此範例的目標。

目錄

下表顯示範例項目資料夾的內容:

檔案/資料夾 描述
src/main/java/com/microsoft/azuresamples/msal4j/authwebapp/ 此目錄包含定義應用程式後端商業規則的類別。
src/main/java/com/microsoft/azuresamples/msal4j/authservlets/ 此目錄包含用於登入和註銷端點的類別。
*Servlet.java 所有可用的端點都定義在 Java 類別中,名稱結尾為 Servlet。
src/main/java/com/microsoft/azuresamples/msal4j/helpers/ 用於身分驗證的輔助類別。
AuthenticationFilter.java 將對受保護端點的未經驗證請求重新導向至 401 頁面。
src/main/resources/authentication.properties Microsoft Entra 識別碼和程序設定。
src/main/webapp/ 此目錄包含 UI - JSP 範本
CHANGELOG.md 範例的變更清單。
CONTRIBUTING.md 參與範例的指導方針。
許可證 範例的授權條款。

ConfidentialClientApplication

系統會在 AuthHelper.java 檔案中建立 執行個體,如下列範例所示。 此物件可協助建立 Microsoft Entra ID 授權 URL,並協助將驗證權杖交換為存取權杖。

// getConfidentialClientInstance method
IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .authority(AUTHORITY)
                     .build();

下列參數用於具現化:

  • 應用程式的用戶端識別碼。
  • 客戶端密碼,這是機密用戶端應用程式的需求。
  • Microsoft Entra ID 授權單位,其中包含您的 Microsoft Entra ID 租用戶 ID。

在此範例中,這些值會使用 Config.java 檔案中的屬性讀取器,從 authentication.properties 檔案中讀取。

逐步解說

下列步驟提供應用程式的功能的逐步解說:

  1. 登入程序的第一個步驟,是向您 Microsoft Entra ID 租用戶上的 端點傳送要求。 MSAL4J 實例用於建構授權請求 URL。 應用程式會將瀏覽器重新導向至此 URL,也就是使用者登入的位置。

    final ConfidentialClientApplication client = getConfidentialClientInstance();
    AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters.builder(Config.REDIRECT_URI, Collections.singleton(Config.SCOPES))
            .responseMode(ResponseMode.QUERY).prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String authorizeUrl = client.getAuthorizationRequestUrl(parameters).toString();
    contextAdapter.redirectUser(authorizeUrl);
    

    下列清單描述此程式碼的功能:

    • :為了建置 AuthorizationRequestUrl 而必須設定的參數。

    • :Microsoft Entra ID 在收集使用者認證資訊後,將瀏覽器連同授權碼重新導向至此處。 其必須與 Azure 入口網站 中 Microsoft Entra ID 應用程式註冊內的重新導向 URI 相符。

    • :範圍是應用程式要求的權限。 一般而言,三個範圍 即足以接收 ID 權杖回應。

      您可以在 authentication.properties 檔案中找到應用程式所要求的範圍完整清單。 您可以新增更多範圍,例如 。

  2. 使用者會看到 Microsoft Entra ID 發出的登入提示。 如果登入嘗試成功,則會將使用者的瀏覽器重新導向至應用程式的重新導向端點。 對此端點的有效請求包含授權碼。

  3. 接著, 執行個體會使用此授權碼,向 Microsoft Entra ID 換取 ID 權杖和存取權杖。

    // First, validate the state, then parse any error codes in response, then extract the authCode. Then:
    // build the auth code params:
    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
            .builder(authCode, new URI(Config.REDIRECT_URI)).scopes(Collections.singleton(Config.SCOPES)).build();
    
    // Get a client instance and leverage it to acquire the token:
    final ConfidentialClientApplication client = AuthHelper.getConfidentialClientInstance();
    final IAuthenticationResult result = client.acquireToken(authParams).get();
    

    下列清單描述此程式碼的功能:

    • :為了將授權碼交換為 ID 權杖和/或存取權杖而必須設定的參數。
    • :重新導向端點所接收的授權碼。
    • :必須再次傳入上一步中使用的重新導向 URI。
    • :必須再次傳入前一步驟中使用的範圍。
  4. 如果 成功,則會擷取權杖宣告。 如果 nonce 檢查通過,結果會放入 (即 的一個執行個體)中,並儲存至工作階段。 然後,應用程式可以在每當需要存取它時,透過 的執行個體從工作階段中建立 的執行個體,如下列程式碼所示:

    // parse IdToken claims from the IAuthenticationResult:
    // (the next step - validateNonce - requires parsed claims)
    context.setIdTokenClaims(result.idToken());
    
    // if nonce is invalid, stop immediately! this could be a token replay!
    // if validation fails, throws exception and cancels auth:
    validateNonce(context);
    
    // set user to authenticated:
    context.setAuthResult(result, client.tokenCache().serialize());
    

保護路由

如需範例應用程式如何篩選路由存取的資訊,請參閱 AuthenticationFilter.java。 在 authentication.properties 檔案中, 屬性包含以逗號分隔的路由,只有已驗證的使用者可以存取這些路由,如下列範例所示:

# for example, /token_details requires any user to be signed in and does not require special roles claim(s)
app.protect.authenticated=/token_details

範圍

範圍會告知 Microsoft Entra ID 應用程式所要求的存取權層級。

根據要求的範圍,Microsoft Entra ID 會在登入時向用戶顯示同意對話。 如果使用者同意一個或多個範圍並取得權杖,則已同意的範圍會編碼到產生的 中。

如需應用程式要求的範圍,請參閱 authentication.properties。 MSAL 會要求這三個範圍,且預設會由 Microsoft Entra ID 提供。

其他相關資訊

  • 適用於 Java 的 Microsoft 驗證程式庫 (MSAL)
  • MSAL Java 參考文件
  • Microsoft 身分識別平台(適用於開發人員的 Microsoft Entra ID)
  • 快速入門:在 Microsoft 身分識別平台中註冊應用程式
  • 瞭解 Microsoft Entra ID 應用程式同意體驗
  • 了解使用者和系統管理員同意
  • MSAL 程式碼範例

後續步驟

將 Java WebSphere 應用程式部署至 Azure 虛擬機器上的 Traditional WebSphere