ASP.NET Core Web API 的授权指南 - Auth0

作者:API传播员 · 2025-11-01 · 阅读时间:5分钟

控制谁可以访问您的 API 是确保应用程序安全的重要环节。本文将为您详细介绍如何限制对 ASP.NET Core Web API 的访问,仅允许授权用户操作。


设置 Web API 应用程序

首先,克隆示例应用程序代码库:

git clone --branch starter --single-branch https://github.com/auth0-blog/glossary-web-api-aspnet.git

该 ASP.NET 应用程序提供了一个 CRUD Web API,用于管理术语表。下载代码后,进入 glossary-web-api-aspnet 文件夹,并运行以下命令启动应用程序:

dotnet run

启动后,打开浏览器访问 https://localhost:5001/swagger,您将看到如下交互式 API 测试页面:

该 Web API 支持以下功能:

  • 获取术语定义列表或单个术语定义
  • 创建新定义
  • 修改或删除现有定义

目前,API 的所有操作对任何用户开放。为了更安全,您可以限制仅授权用户才能创建、更新和删除术语表项,而允许所有人获取术语表内容。


使用 Auth0 注册 Web API

要保护 API,首先需要在 Auth0 上注册您的 Web API:

  1. 登录 Auth0 仪表板,点击 创建 API
  2. 输入 API 名称(如 Glossary API)和唯一标识符(如 https://glossary.com)。
  3. 保持签名算法为 RS256,点击 创建

完成后,Auth0 将记录您的 API 并允许您控制访问权限。

您也可以通过 Auth0 CLI 注册 API:

auth0 apis create --name "Glossary API" --identifier https://glossary.com --scopes ""

运行后,您将看到类似以下的输出:

===  API created ID 60ac3b89f0cd4a003d42e850 NAME Glossary API IDENTIFIER https://glossary.com SCOPES

请记录 <YOUR_AUTH0_DOMAIN> 和唯一标识符的值,后续配置需要用到。


启用授权支持

接下来,调整 ASP.NET Core Web API 的代码以支持 Auth0 授权服务。

配置 Web API

打开 appsettings.json 文件,将内容替换为以下内容:

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "Auth0": {
    "Domain": "YOUR_AUTH0_DOMAIN",
    "Audience": "YOUR_UNIQUE_IDENTIFIER"
  }
}

YOUR_AUTH0_DOMAIN 替换为 Auth0 域名,将 YOUR_UNIQUE_IDENTIFIER 替换为 API 的唯一标识符(如 https://glossary.com)。

与 Auth0 集成

安装 JWT Bearer 身份验证包:

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

然后,打开 Startup.cs 文件,添加以下命名空间:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.OpenApi.Models;

Startup 类的 ConfigureServices 方法中,添加以下代码以启用 JWT 身份验证:

public void ConfigureServices(IServiceCollection services)
{
    services.AddAuthentication(options =>
    {
        options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
    }).AddJwtBearer(options =>
    {
        options.Authority = $"https://{Configuration["Auth0:Domain"]}/";
        options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
        {
            ValidAudience = Configuration["Auth0:Audience"],
            ValidIssuer = $"{Configuration["Auth0:Domain"]}",
            ValidateLifetime = true,
        };
    });

    services.AddControllers();
    services.AddSwaggerGen(c =>
    {
        c.SwaggerDoc("v1", new OpenApiInfo { Title = "Glossary", Version = "v1" });
    });
}

Configure 方法中,添加以下代码以启用身份验证:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseHttpsRedirection();
    app.UseRouting();
    app.UseAuthentication(); // 启用身份验证
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllers();
    });
}

确保 API 端点的安全

为了限制对敏感操作的访问,打开 Controllers/GlossaryController.cs 文件,添加以下命名空间:

using Microsoft.AspNetCore.Authorization;

然后,在需要保护的操作方法上添加 [Authorize] 属性。例如,Delete 方法应如下所示:

[HttpDelete]
[Route("{term}")]
[Authorize] // 仅授权用户可访问
public ActionResult Delete(string term)
{
    var glossaryItem = Glossary.Find(item => item.Term.Equals(term, StringComparison.InvariantCultureIgnoreCase));
    if (glossaryItem == null)
    {
        return NotFound();
    }
    else
    {
        Glossary.Remove(glossaryItem);
        return NoContent();
    }
}

测试安全 Web API

测试未经授权的访问

运行应用程序,访问 https://localhost:5001/swagger,尝试通过 POST 操作添加新术语表项。此时,您应收到 401 Unauthorized 错误。

测试授权访问

要测试授权访问,需在 Swagger 文档中配置访问令牌支持。编辑 Startup.cs 文件,更新 ConfigureServices 方法:

services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "Glossary", Version = "v1" });

    var securitySchema = new OpenApiSecurityScheme
    {
        Description = "Using the Authorization header with the Bearer scheme.",
        Name = "Authorization",
        In = ParameterLocation.Header,
        Type = SecuritySchemeType.Http,
        Scheme = "bearer",
        Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" }
    };

    c.AddSecurityDefinition("Bearer", securitySchema);
    c.AddSecurityRequirement(new OpenApiSecurityRequirement
    {
        { securitySchema, new[] { "Bearer" } }
    });
});

重新启动应用程序,打开 Swagger 页面,点击 Authorize 按钮,输入从 Auth0 获取的访问令牌。此时,您可以成功通过 POST 操作添加术语表项,并收到 201 Created 响应。


回顾

本文介绍了如何保护 ASP.NET Core Web API,防止未经授权的用户访问敏感端点。通过使用 Auth0,您可以轻松实现 API 的注册和授权配置,并利用 Swagger 提供交互式文档进行测试。现在,您的 Web API 已准备好安全地供客户端使用。

原文链接: https://auth0.com/blog/aspnet-web-api-authorization/