教學課程:將受保護的端點實作至 API
在本教學課程中,您會了解如何藉由將驗證元素新增至原始程式碼,來保護 API 端點。 保護 API 端點可確保只允許授權的使用者存取。 您可以使用未經驗證的要求來測試 API,以確保您的 API 會限制未經授權使用者的存取權。 Microsoft 身分識別平台提供使用 Microsoft.Identity.Web NuGet 套件來保護 API 端點的方式。 在本文中,您會:
- 將驗證元素實作至原始程式碼
- 新增天氣資訊讓 API 顯示
- 使用未經驗證的 GET 要求測試 API
必要條件
- 完成教學課程:建立和設定 ASP.NET Core 專案以進行驗證中的必要條件和步驟。
實作授權
開啟 Program.cs 檔案,並以下列程式碼片段取代其中的內容:
using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Authorization; using Microsoft.Identity.Web; var builder = WebApplication.CreateBuilder(args); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddMicrosoftIdentityWebApi(options => { builder.Configuration.Bind("AzureAd", options); options.TokenValidationParameters.NameClaimType = "name"; }, options => { builder.Configuration.Bind("AzureAd", options); }); builder.Services.AddAuthorization(config => { config.AddPolicy("AuthZPolicy", policyBuilder => policyBuilder.Requirements.Add(new ScopeAuthorizationRequirement() { RequiredScopesConfigurationKey = $"AzureAd:Scopes" })); }); // Add services to the container. builder.Services.AddRazorPages(); var app = builder.Build(); app.UseAuthentication(); app.UseAuthorization(); var weatherSummaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; app.MapGet("/weatherforecast", [Authorize(Policy = "AuthZPolicy")] () => { var forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast ( DateTime.Now.AddDays(index), Random.Shared.Next(-20, 55), weatherSummaries[Random.Shared.Next(weatherSummaries.Length)] )) .ToArray(); return forecast; }) .WithName("GetWeatherForecast"); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); app.Run(); record WeatherForecast(DateTime Date, int TemperatureC, string? Summary) { public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); }
測試應用程式
- 在 Visual Studio 中,選取 [啟動但不進行偵錯]。
網頁 http://localhost:{host}
會顯示類似下圖的輸出。 這是因為 API 是在未驗證的情況下呼叫。 若要進行授權的呼叫,請參閱後續步驟,以取得如何存取受保護 Web API 的操作指南。