本文示範 Java Spring Boot Web 應用程式,此應用程式會使用 適用於 Java 的 Microsoft Entra ID Spring Boot Starter 用戶端連結庫,在Microsoft Entra ID 租使用者上登入使用者。 它會使用 OpenID Connect 通訊協定。

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

Diagram that shows the topology of the app. 顯示應用程式拓撲的圖表。

用戶端應用程式會使用適用於 Java 的 Microsoft Entra ID Spring Boot Starter 用戶端連結庫來登入使用者,並從 Microsoft Entra ID 取得標識符令牌。 標識元令牌會證明使用者已使用 Microsoft Entra ID 進行驗證,並讓使用者存取受保護的路由。

  • JDK 17 版。 此範例是在 Java 17 的系統上開發,但可能與其他版本相容。
  • Maven 3
  • 建議使用適用於Visual Studio Code的 Java 擴充套件,在Visual Studio Code 中執行此範例。
  • Microsoft Entra ID 租用戶。 如需詳細資訊,請參閱 如何取得Microsoft Entra ID 租使用者
  • 您Microsoft Entra ID 租使用者中的用戶帳戶。 此範例不適用於個人Microsoft帳戶。 因此,如果您使用個人帳戶登入 Azure 入口網站 ,而且目錄中沒有用戶帳戶,您現在必須建立一個帳戶。
  • Visual Studio Code
  • 適用於 Visual Studio Code 的 Azure 工具
  • 一些熟悉 Spring Framework
  • 一些熟悉 Linux/OSX 終端機。
  • jwt.ms 檢查令牌。
  • Fiddler 用於監視您的網路活動和疑難解答。
  • 請遵循Microsoft Entra ID 部落格 ,隨時掌握最新的發展。
  • 下列各節說明如何設定範例應用程式。

    複製或下載範例存放庫

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

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

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

    若要避免 Windows 上的路徑長度限制,建議您複製到磁碟驅動器根目錄附近的目錄。

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

    此範例中有一個專案。 下列各節說明如何使用 Azure 入口網站 註冊應用程式。

    選擇要在其中建立應用程式的Microsoft Entra ID 租使用者

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

  • 登入 Azure 入口網站

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

    註冊應用程式 (java-spring-webapp-auth)

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

  • 流覽至 Azure 入口網站,然後選取 [Microsoft Entra ID]。

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

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

  • 在 [ 名稱] 區段中,輸入有意義的應用程式名稱,以顯示給應用程式的使用者 ,例如 java-spring-webapp-auth
  • 在 [支援的帳戶類型] 底下,選取 [僅在此組織目錄中的帳戶]
  • 在 [ 重新導向 URI (選擇性)] 區段中,選取 下拉式方塊中的 [Web ],然後輸入下列重新導向 URI: http://localhost:8080/login/oauth2/code/
  • 選取 [暫存器] 以建立應用程式。

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

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

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

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

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

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

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

    設定應用程式 (java-spring-webapp-auth) 以使用您的應用程式註冊

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

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

  • 在 IDE 中開啟專案。

  • 開啟 src\main\resources\application.yml 檔案。

  • 尋找佔位元元 Enter_Your_Tenant_ID_Here ,並以您的 Microsoft Entra 租使用者標識碼取代現有的值。

  • 尋找佔位元元Enter_Your_Client_ID_Here,並將現有的值取代為從 Azure 入口網站 複製的應用程式識別碼或clientIdjava-spring-webapp-auth應用程式。

  • 尋找佔位元Enter_Your_Client_Secret_Here,並將現有值取代為您在建立java-spring-webapp-auth從 Azure 入口網站 複製期間儲存的值。

    部署至 Azure Container Apps 在本機執行
  • Azure 帳戶。 如果您沒有訂用帳戶,請建立免費帳戶。 您需要 Azure 訂用帳戶的 ContributorOwner 許可權,才能繼續進行。 如需詳細資訊,請參閱使用 Azure 入口網站指派 Azure 角色
  • Azure CLI
  • Azure Container Apps CLI 擴充功能、版本或更新版本 0.3.47 。 若要安裝最新版本,請使用 az extension add --name containerapp --upgrade --allow-preview 命令。
  • Java 開發工具組 17 版或更高版本。
  • Maven.
  • 準備 Spring 專案

    使用下列步驟來準備專案:

  • 使用下列 Maven 命令來建置專案:

    mvn clean verify
    
  • 使用下列命令在本機執行範例專案:

    mvn spring-boot:run
    

    若要從 CLI 登入 Azure,請執行下列命令並遵循提示來完成驗證流程。

    az login
    

    若要確定您執行的是最新版本 CLI,請執行升級命令。

    az upgrade
    

    接下來,安裝或更新 CLI 的 Azure 容器應用程式延伸模組。

    如果您在 Azure CLI 中執行 az containerapp 命令時收到遺漏參數的錯誤,請確定您已安裝最新版的 Azure Container Apps 擴充功能。

    az extension add --name containerapp --upgrade
    

    從 2024 年 5 月開始,Azure CLI 延伸模組預設不會再啟用預覽功能。 若要存取容器應用程式預覽功能,請使用 --allow-preview true 安裝容器應用程式延伸模組。

    az extension add --name containerapp --upgrade --allow-preview true
    

    現在已安裝目前的延伸模組或模組,請註冊 Microsoft.AppMicrosoft.OperationalInsights 命名空間。

    Azure 容器應用程式資源已從 Microsoft.Web 命名空間移轉至 Microsoft.App 命名空間。 如需詳細資訊,請參閱 2022 年 3 月將命名空間從 Microsoft.Web 移轉至 Microsoft.App

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    

    建立 Azure Container Apps 環境

    現在您的 Azure CLI 設定已完成,接下來您可以定義本文中使用的環境變數了。

    在您的 Bash 殼層中定義下列變數。

    export RESOURCE_GROUP="ms-identity-containerapps"
    export LOCATION="canadacentral"
    export ENVIRONMENT="env-ms-identity-containerapps"
    export API_NAME="ms-identity-api"
    export JAR_FILE_PATH_AND_NAME="./target/ms-identity-spring-boot-webapp-0.0.1-SNAPSHOT.jar"
    

    建立資源群組。

    az group create  \
        --name $RESOURCE_GROUP \
        --location $LOCATION \
    

    使用自動產生的Log Analytics工作區建立環境。

    az containerapp env create \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION
    

    顯示容器應用程式環境的預設網域。 記下此網域以供稍後章節使用。

    az containerapp env show \
        --name $ENVIRONMENT \
        --resource-group $RESOURCE_GROUP \
        --query properties.defaultDomain
    

    準備應用程式以進行部署

    當您將應用程式部署至 Azure Container Apps 時,您的重新導向 URL 會變更為 Azure Container Apps 中已部署應用程式實例的重新導向 URL。 使用下列步驟來變更application.yml檔案中的這些設定:

  • 流覽至應用程式的 src\main\resources\application.yml 檔案,並將 的值 post-logout-redirect-uri 變更為已部署應用程式的功能變數名稱,如下列範例所示。 請務必以您的實際值取代 <API_NAME><default-domain-of-container-app-environment> 。 例如,使用上一個步驟中 Azure Container App 環境的預設網域,以及 ms-identity-api 針對您的應用程式名稱,您將用於 https://ms-identity-api.<default-domain>post-logout-redirect-uri 值。

    post-logout-redirect-uri: https://<API_NAME>.<default-domain-of-container-app-environment>
    
  • 儲存此檔案之後,請使用下列命令重建您的應用程式:

    mvn clean package
    

    應用程式的 application.yml 檔案目前在 參數中 client-secret 保留客戶端密碼的值。 將此值保留在這個檔案中並不好的做法。 如果您將檔案認可至 Git 存放庫,您可能也會冒險。 如需建議的方法,請參閱 管理 Azure Container Apps 中的秘密。

    更新您的 Microsoft Entra ID 應用程式註冊

    由於重新導向 URI 會變更至 Azure Container Apps 上已部署的應用程式,因此您也需要變更 Microsoft Entra ID 應用程式註冊中的重新導向 URI。 請使用下列步驟來進行此變更:

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

  • 使用搜尋方塊來搜尋您的應用程式註冊 ,例如 java-servlet-webapp-authentication

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

  • 從選單中選擇 驗證

  • 在 [Web - 重新導向 URI] 區段中,選取 [新增 URI]。

  • 填寫應用程式的 URI,並附加 /login/oauth2/code/ -例如 https://<containerapp-name>.<default domain of container app environment>/login/oauth2/code/

  • 選取儲存

    部署應用程式

    將 JAR 套件部署至 AAzure 容器應用程式。

    如有必要,您可以在 Java 建置環境變數中指定 JDK 版本。 如需詳細資訊,請參閱 在 Azure Container Apps 中建置 Java 的環境變數。

    現在您可以使用 az containerapp up CLI 命令來部署 WAR 檔案。

    az containerapp up \
        --name $API_NAME \
        --resource-group $RESOURCE_GROUP \
        --location $LOCATION \
        --environment $ENVIRONMENT \
        --artifact <JAR_FILE_PATH_AND_NAME> \
        --ingress external \
        --target-port 8080 \
        --query properties.configuration.ingress.fqdn
    

    預設的 JDK 版本為 17。 如果您需要變更 JDK 版本以與您的應用程式相容,可以使用 --build-env-vars BP_JVM_VERSION=<YOUR_JDK_VERSION> 引數來調整版本號碼。

    如需更多建置環境變數,請參閱 在 Azure Container Apps 中建置 Java 的環境變數。

    驗證應用程式

    在此範例中 containerapp up ,命令包含 --query properties.configuration.ingress.fqdn 自變數,其會傳回完整功能變數名稱 (FQDN),也稱為應用程式的 URL。 使用下列步驟來檢查應用程式的記錄,以調查任何部署問題:

  • [部署] 區段的 [輸出] 頁面存取輸出應用程式 URL。

  • 從 [Azure Container Apps 實例 概觀 ] 頁面的瀏覽窗格中,選取 [ 記錄 ] 以檢查應用程式的記錄。

  • 請開啟瀏覽器,然後瀏覽至 http://localhost:8080。 您應該會看到含有文字 You're signed in! Click here to get your ID Token Details的畫面。

    Screenshot of the sample app.範例應用程式的螢幕快照。

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

  • 請注意畫面中央顯示的已登入或註銷狀態。
  • 選取角落中的上下文相關按鈕。 當您第一次執行應用程式時,此按鈕會 讀取 [登入 ]。 或者,選取 令牌詳細數據。 由於此頁面受到保護且需要驗證,因此會自動重新導向至登入頁面。
  • 在下一個頁面上,遵循指示,並使用 Microsoft Entra ID 租使用者中的帳戶登入。
  • 在同意畫面上,請注意所要求的範圍。
  • 順利完成登入流程時,您應該重新導向至首頁 -- 顯示 登入狀態 - 或 令牌詳細 數據頁面,視觸發登入流程的按鈕而定。
  • 請注意,內容相關按鈕現在會顯示 [註銷 ] 並顯示您的用戶名稱。
  • 如果您是在首頁上,請選取 [標識符令牌詳細數據 ],以查看部分標識符令牌已譯碼的宣告。
  • 使用角落中的按鈕註銷。狀態頁面會反映新狀態。
  • 關於程式碼

    此範例示範如何使用 適用於 Java 的 Microsoft Entra ID Spring Boot Starter 用戶端連結庫,將使用者登入您的 Microsoft Entra ID 租使用者。 此範例也會使用 Spring Oauth2 用戶端和 Spring Web 開機入門。 此範例會使用從 Microsoft Entra ID 取得之標識碼令牌的宣告,以顯示已登入使用者的詳細數據。

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

    檔案/資料夾 src/main/java/com/microsoft/azuresamples/msal4j/msidentityspringbootwebapp/ 此目錄包含主要應用程式進入點、控制器和設定類別。 .../MsIdentitySpringBootWebappApplication.java 主要類別。 .../SampleController.java 具有端點對應的控制器。 .../SecurityConfig.java 安全性設定 - 例如,需要驗證的路由。 .../Utilities.java 公用程式類別 - 例如篩選識別碼令牌宣告。 CHANGELOG.md 範例的變更清單。 CONTRIBUTING.md 參與範例的指導方針。 範例的授權。

    標識元令牌宣告

    為了擷取令牌詳細數據,應用程式會在要求對應中使用 Spring Security 的 AuthenticationPrincipalOidcUser 物件,如下列範例所示。 如需此應用程式如何使用標識元令牌宣告的完整詳細數據,請參閱範例控制器

    import org.springframework.security.oauth2.core.oidc.user.OidcUser;
    import org.springframework.security.core.annotation.AuthenticationPrincipal;
    //...
    @GetMapping(path = "/some_path")
    public String tokenDetails(@AuthenticationPrincipal OidcUser principal) {
        Map<String, Object> claims = principal.getIdToken().getClaims();
    
    

    針對登入,應用程式會向 Microsoft Entra ID Spring Boot Starter 用戶端連結庫 for Java 自動設定Microsoft Entra ID 登入端點提出要求,如下列範例所示:

    <a class="btn btn-success" href="/oauth2/authorization/azure">Sign In</a>
    

    針對註銷,應用程式會向 logout 端點提出POST要求,如下列範例所示:

    <form action="#" th:action="@{/logout}" method="post">
      <input class="btn btn-warning" type="submit" value="Sign Out" />
    </form>
    

    驗證相依 UI 元素

    應用程式在UI範本頁面中有一些簡單的邏輯,可用來根據使用者是否已驗證來判斷要顯示的內容,如下列使用 Spring Security Thymeleaf 標籤的範例所示:

    <div sec:authorize="isAuthenticated()">
      this content only shows to authenticated users
    <div sec:authorize="isAnonymous()">
      this content only shows to not-authenticated users
    

    使用 AADWebSecurityConfigurerAdapter 保護路由

    根據預設,應用程式會保護 [ 標識符令牌詳細 數據] 頁面,以便只有登入的使用者才能存取它。 應用程式會使用app.protect.authenticated來自 application.yml 檔案的 屬性來設定這些路由。 若要設定應用程式的特定需求,請將 AadWebApplicationHttpSecurityConfigurer#aadWebApplication 方法套用至 HttpSecurity 實例。 如需範例,請參閱此應用程式的 SecurityConfig 類別,如下列程式代碼所示:

    @Configuration
    @EnableWebSecurity
    @EnableMethodSecurity
    public class SecurityConfig  {
        @Value("${app.protect.authenticated}")
        private String[] allowedOrigins;
        @Bean
        public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
            // @formatter:off
            http.apply(AadWebApplicationHttpSecurityConfigurer.aadWebApplication())
                .and()
                .authorizeHttpRequests(auth -> auth
                    .requestMatchers(allowedOrigins).authenticated()
                    .anyRequest().permitAll()
            // @formatter:on
            return http.build();
        @Bean
        @RequestScope
        public ServletUriComponentsBuilder urlBuilder() {
            return ServletUriComponentsBuilder.fromCurrentRequest();
    

    其他相關資訊

  • Microsoft 身分識別平台 (適用於開發人員的Microsoft項目識別碼)
  • Microsoft驗證連結庫概觀 (MSAL)
  • 快速入門:使用 Microsoft 身分識別平台來註冊應用程式
  • 快速入門:設定用戶端應用程式以存取 Web API
  • 瞭解Microsoft Entra ID 應用程式同意體驗
  • 瞭解使用者和系統管理員同意
  • Microsoft Entra 中的應用程式和服務主體物件 (機器翻譯)
  • MSAL 程式代碼範例
  • Microsoft適用於 Java 的 Entra ID Spring Boot Starter 用戶端連結庫
  • Microsoft Java 驗證連結庫 (MSAL4J)
  • MSAL4J Wiki
  • 識別碼權杖
  • Microsoft 身分識別平台內的存取權杖
  • 如需 OAuth 2.0 通訊協定在此案例和其他案例中運作方式的詳細資訊,請參閱 Microsoft Entra ID 的驗證案例。

  •