教程:在 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。