教程:在 API 中实现受保护的终结点

本教程介绍如何通过在源代码中添加身份验证元素来保护 API 终结点。 保护 API 终结点可确保仅允许经过授权的用户进行访问。 你可以使用未经身份验证的请求来测试 API,确保 API 将访问权限限制在未经授权的用户范围内。 Microsoft 标识平台提供了一种使用 Microsoft.Identity.Web NuGet 包来保护 API 终结点的方法。 本文内容:

  • 将身份验证元素植入到源代码中
  • 添加要 API 显示的天气信息
  • 使用未经身份验证的 GET 请求测试 API

先决条件

实现授权

  1. 打开 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);
    } 
    

测试应用程序

  1. 在 Visual Studio 中,选择“启动且不调试”。

网页 http://localhost:{host} 显示类似于下图的输出。 这是因为在没有身份验证的情况下调用了 API。 若要进行授权调用,请参阅后续步骤以获取操作指南,了解如何访问受保护的 Web API。

显示网页启动时出现 401 错误的屏幕截图。

后续步骤