共用方式為


測試受保護的 ASP.NET Core Web API

適用於:白色複選標記符號的 綠色圓圈。 企業員工租戶 綠色圓圈與白色複選標記符號。 外部租戶(深入瞭解

本教學課程是一系列的最後一個部分,示範如何建置及測試已在 Microsoft Entra 租用戶中註冊的受保護 Web API。 在 本系列的第 1 部分中,您已建立 ASP.NET Core Web API 並保護其端點。 您現在會建立輕量型精靈應用程式、在您的租用戶中註冊它,並使用精靈應用程式來測試您所建置的Web API。

在本教學課程中,您將瞭解如何:

  • 註冊精靈應用程式
  • 將應用程式角色指派給精靈應用程式
  • 建置精靈應用程式
  • 執行精靈應用程式以呼叫受保護的 Web API

先決條件

註冊精靈應用程式

下列步驟示範如何在 Microsoft Entra 系統管理中心註冊您的精靈應用程式:

  1. 以至少 應用程式開發人員身分登入 Microsoft Entra 系統管理中心

  2. 如果您有多個租使用者的存取權,請使用頂端功能表中的 [設定] 圖示 ,從 [目錄 + 訂用帳戶] 功能表切換至外部租使用者。

  3. 瀏覽至 身分識別>應用程式>應用程式註冊

  4. 選擇 + 新註冊

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

    1. 在 [名稱] 區段中,輸入將向用戶顯示有意義的應用程式名稱,例如 ciam-client-app

    2. 支援的帳戶類型下,選取 僅此組織目錄中的帳戶

  6. 選取 寄存器

  7. 註冊完成時,會顯示應用程式的 [概觀] 窗格。 記錄 目錄(租使用者)標識碼應用程式(用戶端)標識碼,以用於您的應用程式原始程式碼。

建立已註冊應用程式的客戶端密碼。 應用程式會在要求令牌時,使用用戶端密碼來證明其身分識別:

  1. 從 [應用程式註冊] 頁面中,選取您建立的應用程式(例如 Web 應用程式用戶端密碼),以開啟其 概觀 頁面。
  2. 在 [管理] 底下,選取 [憑證 & 密碼>[客戶端密碼]>[新增客戶端密碼]
  3. 在 [描述] 方塊中,輸入客戶端密碼的描述(例如,Web 應用程式用戶端密碼)。
  4. 在 [到期] 底下,選取秘密的有效期(根據貴組織的安全規則),然後選取 [新增]。
  5. 記錄秘密的 。 您可以在稍後的步驟中使用此值進行設定。 離開 憑證和秘密頁面後,秘密值將不再顯示,並且無法以任何方式檢索。 確保你有記錄下來。

將應用程式角色指派給精靈應用程式

自行驗證的應用程式需要應用程式許可權。

  1. 從 [應用程式註冊] 頁面中,選取您建立的精靈應用程式。

  2. 在 [管理] 下,選取 [API 許可權]

  3. 設定的許可權下,選取 新增許可權

  4. 選取 API 我組織使用的 標籤。

  5. 在 API 清單中,選取您稍早註冊的 Web API。

  6. 請選擇 應用程式許可權 選項。 我們會選取此選項,因為應用程式會以本身身分登入,但不代表使用者登入。

  7. 從許可權清單中,選取(Forecast.Read),如有需要,請使用搜尋方塊。

  8. 選擇 新增許可權 按鈕。

  9. 此時,您已正確賦予權限。 不過,由於精靈應用程式不允許使用者與其互動,因此使用者本身無法同意這些許可權。 若要解決此問題,身為系統管理員必須代表租使用者中的所有使用者同意這些許可權:

    1. 選取 [授與 <你的租戶名稱>的系統管理員同意],然後選取 [是]
    2. 選取 [重新整理],然後確認您的租用戶名稱 [授與 <]> 是否顯示在 [許可權] 狀態 底下。

建置精靈應用程式

  1. 初始化 .NET 控制台應用程式,並流覽至其根資料夾:

    dotnet new console -o MyTestApp
    cd MyTestApp
    
  2. 執行下列命令來安裝 MSAL.NET,以協助處理驗證:

    dotnet add package Microsoft.Identity.Client
    
  3. 執行您的 API 專案,並記下其執行所在的埠。

  4. 開啟 Program.cs 檔案,並以下列程序代碼取代 「Hello world」 程序代碼。

    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    HttpClient client = new HttpClient();
    
    var response = await client.GetAsync("http://localhost:<your-api-port>/weatherforecast");
    Console.WriteLine("Your response is: " + response.StatusCode);
    

    瀏覽至精靈應用程式根目錄,並使用 命令執行應用程式 dotnet run。 此程式代碼會傳送沒有存取令牌的要求。 您應該會看到字串:您的回應為:未經授權的 列印在控制台中。

  5. 拿掉步驟 4 中的程式碼,並使用下列程式代碼取代 ,以使用有效的存取令牌傳送要求來測試您的 API。 此精靈應用程式會使用用戶端認證流程來取得存取令牌,因為它在沒有使用者互動的情況下進行驗證。

    using Microsoft.Identity.Client;
    using System;
    using System.Net.Http;
    using System.Net.Http.Headers;
    
    HttpClient client = new HttpClient();
    
    var clientId = "<your-daemon-app-client-id>";
    var clientSecret = "<your-daemon-app-secret>";
    var scopes = new[] {"api://<your-web-api-application-id>/.default"};
    var tenantName= "<your-tenant-name>";
    var authority = $"https://{tenantName}.ciamlogin.com/"; 
    
    var app = ConfidentialClientApplicationBuilder
        .Create(clientId)
        .WithAuthority(authority)
        .WithClientSecret(clientSecret)
        .Build();
    
    var result = await app.AcquireTokenForClient(new string[] { scopes }).ExecuteAsync();
    Console.WriteLine($"Access Token: {result.AccessToken}");
    
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
    var response = await client.GetAsync("http://localhost:/<your-api-port>/weatherforecast");
    var content = await response.Content.ReadAsStringAsync();
    
    Console.WriteLine("Your response is: " + response.StatusCode);
    Console.WriteLine(content);
    

    瀏覽至精靈應用程式根目錄,並使用 命令執行應用程式 dotnet run。 此程式碼會傳送具有有效存取令牌的要求。 您應該會看到字串:您的回應是:OK 顯示在控制台中,以及來自我們簡約 API 的一些虛擬天氣預報數據。

    Your response is: OK
    [{"date":"2025-03-01","temperatureC":45,"summary":"Warm","temperatureF":112},
    {"date":"2025-03-02","temperatureC":7,"summary":"Freezing","temperatureF":44},
    {"date":"2025-03-03","temperatureC":48,"summary":"Sweltering","temperatureF":118},
    {"date":"2025-03-04","temperatureC":-20,"summary":"Chilly","temperatureF":-3},
    {"date":"2025-03-05","temperatureC":12,"summary":"Scorching","temperatureF":53}]