此範例示範一個 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 入口網站中註冊應用程式。
然後,使用下列步驟來完成註冊:
瀏覽至 Microsoft 身分識別平台開發人員適用的 應用程式註冊 頁面。
選取 新增註冊。
在出現的 [ 註冊應用程式] 頁面中 ,輸入下列應用程式註冊資訊:
在 名稱 區段中,輸入有意義的應用程式名稱,作為應用程式使用者看到的顯示名稱,例如 。
在 [支持的帳戶類型] 底下,選取下列其中一個選項:
- 如果您正在建置的應用程式僅供您租用戶中的使用者使用,請選取 僅此組織目錄中的帳戶;也就是說,這是 單一租用戶 應用程式。
- 如果您希望任何 Microsoft Entra ID 租用戶中的使用者都能使用您的應用程式,請選取任何組織目錄中的帳戶,也就是說,這是多租用戶應用程式。
- 選取 任何組織目錄中的帳戶和 Microsoft 個人帳戶,以涵蓋最廣泛的客戶群,也就是同時支援 Microsoft 個人帳戶的多租用戶應用程式。
- 選取 [個人Microsoft帳戶],僅供個人Microsoft帳戶 的使用者使用 -- 例如 Hotmail、Live、Skype 和 Xbox 帳戶。
在 重新導向 URI 區段中,於下拉式方塊選取 Web,然後輸入下列重新導向 URI:。
選取 註冊 以建立應用程式。
在應用程式的註冊頁面上,尋找並複製 應用程式 (用戶端) 識別碼 值,以供稍後使用。 您會在應用程式的組態檔或檔案中使用此值。
在應用程式的註冊頁面上,選取 瀏覽窗格中的 [憑證和秘密 ],以開啟頁面以產生秘密並上傳憑證。
在用戶端密碼區段底下,選取新增用戶端密碼。
輸入描述 - 例如, 應用程式秘密。
選取祕密的到期日,或指定自訂存留期。 用戶端機密的有效期限限制為 24 個月,Microsoft 建議有效期少於 12 個月。 對於生產應用程式,建議使用憑證或聯邦身份憑證,而非用戶端秘密。
選取新增。 產生的值隨即顯示。
複製並儲存產生的值,以供後續步驟使用。 您需要此值用於您的程式碼設定檔。 此值不會再次顯示,而且您無法透過任何其他方式加以擷取。 因此,請務必先在 Azure 入口網站中將其儲存,再切換到任何其他畫面或窗格。
設定應用程式,使其使用您的應用程式註冊
使用下列步驟來設定應用程式:
注意
在以下步驟中, 與 或 相同。
在 IDE 中開啟專案。
開啟 ./src/main/resources/authentication.properties 檔案。
找出字串 。 以以下其中一個值取代現有值:
- 如果您是以 僅限此組織目錄中的帳戶 選項註冊您的應用程式,則為您的 Microsoft Entra ID 租用戶識別碼。
- 如果您使用 任何組織目錄中的帳戶 選項註冊您的應用程式,則該字為 。
- 如果您使用 任何組織目錄中的帳戶和個人 Microsoft 帳戶 選項註冊您的應用程式,則會顯示字詞 。
- 如果您使用個人 Microsoft 帳戶選項註冊應用程式,則該字詞為。
尋找字串 ,並將現有的值取代為從 Azure 入口網站複製的 應用程式的應用程式識別碼或 。
尋找字串 ,並將現有值替換為您在 Azure 入口網站中建立 應用程式時所儲存的值。
建置範例
若要使用 Maven 建置範例,請流覽至包含 範例pom.xml 檔案的目錄,然後執行下列命令:
mvn clean package
此命令會產生 您可以在各種應用程式伺服器上執行的 .war 檔案。
執行範例
這些指示假設您已安裝 WebSphere 並設定伺服器。 您可以使用 在 Azure 虛擬機器上部署 WebSphere Application Server(傳統)叢集 中的指引,來進行基本的伺服器設定。
在部署至 WebSphere 之前,請使用下列步驟在範例本身進行一些組態變更,然後建置或重建套件:
前往應用程式的 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/儲存此檔案之後,請使用下列命令重建您的應用程式:
mvn clean package程式代碼完成建置之後,請將 .war 檔案複製到目標伺服器的文件系統。
您也需要在 Azure 應用程式註冊中進行相同的變更,也就是在 Azure 入口網站的 驗證 索引標籤上,將它設定為 重新導向 URI 值。
瀏覽至 Microsoft 身分識別平台開發人員適用的 應用程式註冊 頁面。
使用搜尋方塊搜尋您的應用程式註冊,例如 。
選取應用程式名稱以開啟您的應用程式註冊。
從選單中選擇 驗證。
在 Web重新導向 URI 區段中,選取 新增 URI。
填入您的應用程式 URI,並在後面加上 /auth/redirect;例如:。
選取 儲存。
使用下列步驟,使用 WebSphere 的整合式解決方案控制台來部署範例:
在 [應用程式] 索引標籤上,選取 [新增應用程式],然後選取 [新增企業應用程式]。
選擇您建置的 .war 檔案,然後選取 下一步,直到您進入 對應 Web 模組的內容根目錄 安裝步驟。 其他預設設定應該沒問題。
對於內容根,請將其設為與您在範例組態/Azure 應用程式註冊中設定的「重新導向 URI」內埠號後面的值相同。 也就是說,如果重新導向 URI 是 ,則內容根應為 。
選取 完成。
應用程式完成安裝之後,請移至 [應用程式] 索引標籤的 [WebSphere 企業應用程式] 區段。
從應用程式清單中選取您安裝的 .war 檔案,然後選取 [開始部署]。
部署完成後,瀏覽至 ,您應該就能看到該應用程式。
探索範例
使用下列步驟來探索範例:
- 請注意畫面中央顯示的已登入或註銷狀態。
- 選取角落中的上下文相關按鈕。 當您第一次執行應用程式時,此按鈕會顯示為登入。
- 在下一個頁面上,遵循指示,並使用 Microsoft Entra ID 租使用者中的帳戶登入。
- 在同意畫面上,請注意所要求的範圍。
- 請注意,上下文相關按鈕現在會顯示 [註銷 ] 並顯示您的用戶名稱。
- 選取ID 權杖詳細資料即可查看 ID 權杖部分已解碼的宣告。
- 使用角落的按鈕登出。
- 登出後,選取 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 檔案中讀取。
逐步解說
下列步驟提供應用程式的功能的逐步解說:
登入程序的第一個步驟,是向您 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 檔案中找到應用程式所要求的範圍完整清單。 您可以新增更多範圍,例如 。
使用者會看到 Microsoft Entra ID 發出的登入提示。 如果登入嘗試成功,則會將使用者的瀏覽器重新導向至應用程式的重新導向端點。 對此端點的有效請求包含授權碼。
接著, 執行個體會使用此授權碼,向 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。
- :必須再次傳入前一步驟中使用的範圍。
如果 成功,則會擷取權杖宣告。 如果 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