共用方式為


使用 MSAL4J 搭配 Azure Active Directory B2C 啟用 Java WebLogic 應用程式的登入

本文示範 Java Servlet 應用程式,使用適用於 Java 的 Microsoft 驗證連結庫來驗證 使用者對 Azure Active Directory B2C (Azure AD B2C) 的使用者。

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

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

應用程式會使用 MSAL4J 來登入使用者,並從 Azure AD B2C 取得標識碼 令牌 。 標識元令牌會證明用戶已針對 Azure AD B2C 租用戶進行驗證。

必要條件

建議

設定範例

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

複製或下載範例存放庫

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

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

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

重要

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

向 Azure AD B2C 租用戶註冊範例應用程式

此範例隨附預先註冊的應用程式以供測試之用。 如果您想要使用自己的 Azure AD B2C 租使用者和應用程式,請遵循下列各節中的步驟,在 Azure 入口網站 中註冊和設定應用程式。 否則,請繼續進行執行範例的步驟

選擇您想要在其中建立應用程式的 Azure AD B2C 租使用者

若要選擇您的租使用者,請使用下列步驟:

  1. 登入 Azure 入口網站

  2. 如果您的帳戶存在於多個 Azure AD B2C 租使用者中,請在 Azure 入口網站 的角落選取您的配置檔,然後選取 [切換目錄] 將會話變更為所需的 Azure AD B2C 租使用者。

建立使用者流程和自定義原則

若要建立常見的使用者流程,例如註冊、登入、配置檔編輯和密碼重設,請參閱 教學課程:在 Azure Active Directory B2C 中建立使用者流程。

您也應該考慮在 Azure Active Directory B2C 中建立自定義原則,不過,這已超出本教學課程的範圍。

新增外部識別提供者

請參閱 教學課程:在 Azure Active Directory B2C 中將識別提供者新增至您的應用程式。

註冊應用程式 (ms-identity-b2c-java-servlet-webapp-authentication)

若要註冊應用程式,請使用下列步驟:

  1. 流覽至 Azure 入口網站,然後選取 [Azure AD B2C]。

  2. 在瀏覽窗格中選取 [應用程式註冊 ],然後選取 [ 新增註冊]。

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

    • 在 [ 名稱] 區段中,輸入有意義的應用程式名稱,以顯示給應用程式的使用者 ,例如 ms-identity-b2c-java-servlet-webapp-authentication
    • 在 [支援的帳戶類型] 底下,選取 [任何組織目錄中的帳戶和個人Microsoft帳戶(例如Skype、Xbox、Outlook.com)。
    • 在 [ 重新導向 URI (選擇性)] 區段中,選取 下拉式方塊中的 [Web ],然後輸入下列重新導向 URI: http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_redirect
  4. 選取 [暫存器] 以建立應用程式。

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

  6. 選取儲存以儲存變更。

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

  8. 用戶端密碼區段底下,選取新增用戶端密碼

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

  10. 選取其中一個可用的持續時間: 在1年2年內永不過期

  11. 選取 [新增]。 產生的值隨即顯示。

  12. 複製並儲存產生的值,以供後續步驟使用。 您需要此值才能用於程式代碼的組態檔。 此值不會再次顯示,而且您無法透過任何其他方式加以擷取。 因此,請務必先從 Azure 入口網站 儲存它,再流覽至任何其他畫面或窗格。

設定應用程式 (ms-identity-b2c-java-servlet-webapp-authentication) 以使用您的應用程式註冊

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

注意

在下列步驟中,ClientID與 或 AppId相同Application ID

  1. 在 IDE 中開啟專案。

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

  3. 尋找 屬性,aad.clientId並將現有的值取代為應用程式標識碼,或clientIdms-identity-b2c-java-servlet-webapp-authentication從 Azure 入口網站 的應用程式。

  4. 尋找 屬性,aad.secret並將現有的值取代為您在從 Azure 入口網站 建立ms-identity-b2c-java-servlet-webapp-authentication應用程式期間儲存的值。

  5. 尋找 屬性, aad.scopes 並將現有的應用程式 clientId 取代為您在本節的步驟 1 中放入 aad.clientId 的值。

  6. 尋找 屬性,aad.authority並將 的第一個實例fabrikamb2c取代為您在 Azure 入口網站 中建立ms-identity-b2c-java-servlet-webapp-authentication應用程式的 Azure AD B2C 租用戶名稱。

  7. 尋找 屬性,aad.authority並將的第二個實例fabrikamb2c取代為您在 Azure 入口網站 中建立ms-identity-b2c-java-servlet-webapp-authentication應用程式的 Azure AD B2C 租用戶名稱。

  8. aad.signInPolicy尋找 屬性,並將它取代為您在 azure AD B2C 租使用者中建立的註冊/登入使用者流程原則名稱,並在其中在 Azure 入口網站 中建立ms-identity-b2c-java-servlet-webapp-authentication應用程式。

  9. aad.passwordResetPolicy尋找 屬性,並將它取代為您在 azure AD B2C 租使用者中建立的應用程式在 Azure 入口網站 中建立ms-identity-b2c-java-servlet-webapp-authentication的應用程式名稱。

  10. aad.editProfilePolicy尋找 屬性,並將它取代為您在 azure AD B2C 租使用者中建立的編輯配置檔使用者流程原則名稱,您在 Azure 入口網站 中建立ms-identity-b2c-java-servlet-webapp-authentication應用程式。

建置範例

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

mvn clean package

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

執行範例

這些指示假設您已安裝 WebLogic 並設定某些伺服器網域。

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

  1. 在範例中,尋找 您設定用戶端標識符、租使用者、重新導向 URL 等的 application.propertiesauthentication.properties 檔案。

  2. 在此檔案中,變更 WebLogic 執行之 URL 和埠的參考localhost:8080localhost:8443,其預設應該是 localhost:7001

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

使用下列步驟,透過 Web 控制台將範例部署至 WebLogic:

  1. 使用 DOMAIN_NAME\bin\startWebLogic.cmd 啟動 WebLogic 伺服器。

  2. 在瀏覽器中 http://localhost:7001/console流覽至 WebLogic Web 控制台。

  3. 移至 [網域結構 > 部署],選取 [安裝],選取 [上傳您的檔案],然後尋找您使用 Maven 建置的 .war 檔案。

  4. 選取 [安裝此部署為應用程式],選取 [下一步],選取 [完成],然後選取 [ 儲存]。

  5. 大部分的預設設定都應該沒問題,不同之處在於您應該將應用程式命名為符合您在範例組態或 Azure 應用程式註冊中設定的重新導向 URI。 也就是說,如果重新導向 URI 是 http://localhost:7001/msal4j-servlet-auth,則您應該將應用程式 msal4j-servlet-auth命名為 。

  6. 返回網域結構>部署,然後啟動您的應用程式。

  7. 應用程式啟動之後,流覽至 http://localhost:7001/<application-name>/,您應該能夠存取應用程式。

探索範例

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

  1. 請注意畫面中央顯示的已登入或註銷狀態。
  2. 選取角落中的上下文相關按鈕。 當您第一次執行應用程式時,此按鈕會 讀取 [登入 ]。
  3. 在下一個頁面上,遵循指示,並使用所選身分識別提供者的帳戶登入。
  4. 請注意,上下文相關按鈕現在會顯示 [註銷 ] 並顯示您的用戶名稱。
  5. 選取 [ 標識符令牌詳細數據 ],以查看一些標識符令牌已譯碼的宣告。
  6. 您也可以選擇編輯設定檔。 選取連結以編輯詳細數據,例如您的顯示名稱、居住地和職業。
  7. 使用角落中的按鈕註銷。
  8. 註銷之後,流覽至令牌詳細數據頁面的下列 URL: http://localhost:8080/ms-identity-b2c-java-servlet-webapp-authentication/auth_token_details。 您可以在這裏觀察應用程式 401: unauthorized 顯示錯誤的方式,而不是標識元令牌宣告。

關於程式碼

此範例示範如何使用 MSAL4J 將使用者登入您的 Azure AD B2C 租使用者。

目錄

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

檔案/資料夾 描述
AuthHelper.java 驗證的協助程式函式。
Config.java 在啟動時執行,並設定屬性讀取器和記錄器。
authentication.properties Microsoft Entra 識別碼和程序設定。
AuthenticationFilter.java 將未經驗證的要求重新導向至受保護的資源至 401 頁面。
MsalAuthSession 使用 HttpSession具現化。 將所有 MSAL 相關的工作階段屬性儲存在工作階段屬性中。
____Servlet.java 所有可用的端點都定義於以____Servlet.java結尾的類別.java類別中。
CHANGELOG.md 範例的變更清單。
CONTRIBUTING.md 參與範例的指導方針。
許可證 範例的授權。

ConfidentialClientApplication

ConfidentialClientApplication實例會在 AuthHelper.java 檔案中建立,如下列範例所示。 此物件有助於製作 Azure AD B2C 授權 URL,並協助交換存取令牌的驗證令牌。

IClientSecret secret = ClientCredentialFactory.createFromSecret(SECRET);
confClientInstance = ConfidentialClientApplication
                     .builder(CLIENT_ID, secret)
                     .b2cAuthority(AUTHORITY + policy)
                     .build();

下列參數用於具現化:

  • 應用程式的用戶端識別碼。
  • 客戶端密碼,這是機密用戶端應用程式的需求。
  • 與適當的 UserFlowPolicy Azure AD B2C 授權單位串連,適用於註冊、登入、配置檔編輯或密碼重設。

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

逐步解說

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

  1. 登入程式的第一個步驟是將要求傳送至 /authorize Azure Active Directory B2C 租使用者的端點。 MSAL4J ConfidentialClientApplication 實例可用來建構授權要求 URL,而應用程式會將瀏覽器重新導向至此 URL,如下列範例所示:

    final ConfidentialClientApplication client = getConfidentialClientInstance(policy);
    final AuthorizationRequestUrlParameters parameters = AuthorizationRequestUrlParameters
        .builder(REDIRECT_URI, Collections.singleton(SCOPES)).responseMode(ResponseMode.QUERY)
        .prompt(Prompt.SELECT_ACCOUNT).state(state).nonce(nonce).build();
    
    final String redirectUrl = client.getAuthorizationRequestUrl(parameters).toString();
    Config.logger.log(Level.INFO, "Redirecting user to {0}", redirectUrl);
    resp.setStatus(302);
    resp.sendRedirect(redirectUrl);
    

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

    • AuthorizationRequestUrlParameters:必須設定的參數,才能建置 AuthorizationRequestUrl。

    • REDIRECT_URI:在收集使用者認證之後,Azure AD B2C 會重新導向瀏覽器以及驗證碼。

    • SCOPES範圍 是應用程式要求的許可權。

      一般而言,這三個範圍 openid profile offline_access 就足以接收標識符令牌回應。 不過,MSAL4J 要求來自 Azure AD B2C 的所有回應也包含存取令牌。

      為了讓 Azure AD B2C 分配存取令牌和標識碼令牌,要求必須包含額外的資源範圍。 因為此應用程式實際上不需要外部資源範圍,所以它會將自己的用戶端標識元新增為第四個範圍,以接收存取令牌。

      您可以在 authentication.properties 檔案中找到應用程式所要求的範圍完整清單。

    • ResponseMode.QUERY:Azure AD B2C 可以將響應當做 HTTP POST 要求中的表單參數傳回,或做為 HTTP GET 要求中的查詢字串參數。

    • Prompt.SELECT_ACCOUNT:Azure AD B2C 應該要求用戶選取他們打算驗證的帳戶。

    • state:應用程式在每個令牌要求上設定的唯一變數,並在收到對應的 Azure AD B2C 重新導向回呼之後終結。 狀態變數可確保對的 Azure AD B2C 要求 /auth_redirect endpoint 實際上是來自此應用程式和此會話的 Azure AD B2C 授權要求,進而防止 CSRF 攻擊。 這會在 AADRedirectServlet.java 檔案中完成。

    • nonce:應用程式在每個令牌要求上設定為會話的唯一變數,並在收到對應的令牌之後終結。 此 Nonce 會轉譯為已分配 Azure AD B2C 的結果令牌,以確保不會發生令牌重新執行攻擊。

  2. 使用者會看到 Azure Active Directory B2C 的登入提示。 如果登入嘗試成功,則會將使用者的瀏覽器重新導向至應用程式的重新導向端點。 對這個端點的有效要求包含 授權碼

  3. 然後,實例會 ConfidentialClientApplication 交換此授權碼,以取得來自 Azure Active Directory B2C 的標識元令牌和存取令牌,如下列範例所示:

    final AuthorizationCodeParameters authParams = AuthorizationCodeParameters
                        .builder(authCode, new URI(REDIRECT_URI))
                        .scopes(Collections.singleton(SCOPES)).build();
    
    final ConfidentialClientApplication client = AuthHelper
            .getConfidentialClientInstance(policy);
    final Future<IAuthenticationResult> future = client.acquireToken(authParams);
    final IAuthenticationResult result = future.get();
    

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

    • AuthorizationCodeParameters:必須設定的參數,才能交換標識符和/或存取令牌的授權碼。
    • authCode:在重新導向端點收到的授權碼。
    • REDIRECT_URI:必須再次傳遞上一個步驟中使用的重新導向 URI。
    • SCOPES:必須再次傳遞上一個步驟中使用的範圍。
  4. 如果 acquireToken 成功,則會擷取令牌宣告,且 nonce 宣告會針對儲存在會話中的 nonce 進行驗證,如下列範例所示:

    parseJWTClaimsSetAndStoreResultInSession(msalAuth, result, serializedTokenCache);
    validateNonce(msalAuth)
    processSuccessfulAuthentication(msalAuth);
    
  5. 如果成功驗證 nonce,驗證狀態會放入伺服器端會話,並利用 類別所 MsalAuthSession 公開的方法,如下列範例所示:

    msalAuth.setAuthenticated(true);
    msalAuth.setUsername(msalAuth.getIdTokenClaims().get("name"));
    

其他相關資訊

如需 OAuth 2.0 通訊協定在此案例和其他案例中運作方式的詳細資訊,請參閱 Microsoft Entra ID 的驗證案例。

後續步驟

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