測試受保護的 API
本教學課程是系列的最後一個部分,示範如何建置並測試已在外部租用戶中註冊的受保護 Web API。 在此系列的第 1 部分中,您已建立 ASP.NET Core Web API 並保護其端點。 在此最後一個步驟中,您將註冊精靈應用程式,並測試您的 API。
在本教學課程中,您會了解如何:
- 使用呼叫 Web API 的輕量型精靈應用程式來測試受保護的 Web API
必要條件
教學課程:保護已在外部租用戶中註冊的 ASP.NET Web API
註冊精靈應用程式
下列步驟示範如何在 Microsoft Entra 系統管理中心註冊您的精靈應用程式:
至少以應用程式開發人員的身分登入 Microsoft Entra 系統管理中心。
如果您有權存取多個租用戶,請使用頂端功能表中的 [設定] 圖示 ,以從 [目錄 + 訂用帳戶] 功能表切換至您的外部租用戶。
瀏覽至 [身分識別] > [應用程式] > [應用程式註冊]。
選取 + 新增註冊。
在出現的 [註冊應用程式] 頁面 中,輸入應用程式的註冊資訊:
在 [名稱] 區段中,輸入將向應用程式使用者顯示的有意義應用程式名稱,例如 ciam-client-app。
在 [支援的帳戶類型] 底下,選取 [僅在此組織目錄中的帳戶]。
選取註冊。
註冊完成時,將會顯示應用程式的 [概觀] 窗格。 記錄要在應用程式原始程式碼中使用的 [目錄 (租用戶) 識別碼] 和 [應用程式 (用戶端) 識別碼]。
為已註冊的應用程式建立用戶端密碼。 在要求權杖時,應用程式會使用用戶端密碼來證明其身分識別。
- 從 [應用程式註冊] 頁面中,選取您建立的應用程式 (例如 ciam-client-app),以開啟其 [概觀] 頁面。
- 在 [管理] 下,選取 [憑證和密碼]。
- 選取 [新用戶端密碼]。
- 在 [描述] 方塊中,輸入用戶端密碼的描述 (例如「ciam 應用程式用戶端密碼」)。
- 在 [到期] 下方,選取祕密有效的持續時間 (根據組織的安全性規則),然後選取 [新增]。
- 記錄祕密的 [值]。 您將會在稍後的步驟中使用此值進行設定。 在您離開 [憑證和祕密] 之後,祕密值將不會再次顯示,而且無法透過任何方式擷取。 請確保將其妥善記錄。
將應用程式角色指派給您的精靈應用程式
自行驗證的應用程式需要應用程式權限。
從 [應用程式註冊] 頁面中,選取您建立的應用程式 (例如 ciam-client-app)。
在 [管理] 之下選取 [API 權限]。
在 [已設定的權限] 底下,選取 [新增權限]。
選取 [我的組織使用的 API] 索引標籤。
在 API 清單中,選取 API,例如 ciam-ToDoList-api。
選取 [應用程式權限] 選項。 我們選取此選項是因為應用程式會以自身身分 (而不是使用者) 登入。
從權限清單中,選取 [TodoList.Read.All]、[ToDoList.ReadWrite.All] (如有必要,請使用搜尋方塊)。
選取 [新增權限] 按鈕。
此時,您已正確獲指派權限。 不過,因為精靈應用程式不允許使用者與其互動,所以使用者本身無法同意這些權限。 若要解決此問題,身為管理員的您必須代表租用戶中的所有使用者同意這些權限:
- 選取 [代表 <您的租用戶名稱> 授與管理員同意],然後選取 [是]。
- 選取 [重新整理],然後驗證 [已授與 <您的租用戶名稱>] 是否出現在這兩個權限的 [狀態] 下方。
撰寫程式碼
初始化 .NET 主控台應用程式並瀏覽至其根資料夾
dotnet new console -o MyTestApp cd MyTestApp
執行下列命令來安裝 MSAL 以協助您處理驗證:
dotnet add package Microsoft.Identity.Client
執行您的 API 專案,並記下其執行所在的連接埠。
開啟 Program.cs 檔案,並將 "Hello world" 程式碼取代為下列程式碼。
using System; using System.Net.Http; using System.Net.Http.Headers; HttpClient client = new HttpClient(); var response = await client.GetAsync("https://localhost:<your-api-port>/api/todolist"); Console.WriteLine("Your response is: " + response.StatusCode);
瀏覽至精靈應用程式根目錄,並使用命令
dotnet run
執行應用程式。 此程式碼會傳送沒有存取權杖的要求。 您應該會看到字串「您的回應是:未經授權」列印在主控台中。移除步驟 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(scopes).ExecuteAsync(); client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); var response = await client.GetAsync("https://localhost:44351/api/todolist"); Console.WriteLine("Your response is: " + response.StatusCode);
瀏覽至精靈應用程式根目錄,並使用命令
dotnet run
執行應用程式。 此程式碼會傳送含有效存取權杖的要求。 您應該會看到字串「您的回應是:沒問題」列印在主控台中。