ASP .NET Core 中的 Api Key 身份验证之三【中间件】

ASP.NET Core 中使用 API Key 进行身份验证是一种简单而有效的安全措施,常用于防止未授权访问 API 接口。下面详细介绍如何实现 API Key 身份验证,包括代码示例和配置步骤。

1. 项目配置

假设你已经创建了一个 ASP.NET Core Web API 项目。


2. 创建 ApiKey 认证中间件

新建中间件类 ApiKeyMiddleware
public class ApiKeyMiddleware
{
    
    
    private readonly RequestDelegate _next;
    private const string ApiKeyHeaderName = "X-API-KEY";

    public ApiKeyMiddleware(RequestDelegate next)
    {
    
    
        _next = next;
    }

    public async Task InvokeAsync(HttpContext context, IConfiguration configuration)
    {
    
    
        if (!context.Request.Headers.TryGetValue(ApiKeyHeaderName, out var extractedApiKey))
        {
    
    
            context.Response.StatusCode = 401; // 未授权
            await context.Response.WriteAsync("API Key is missing");
            return;
        }

        var apiKey = configuration.GetValue<string>("ApiSettings:ApiKey");

        if (!apiKey.Equals(extractedApiKey))
        {
    
    
            context.Response.StatusCode = 401; // 未授权
            await context.Response.WriteAsync("Invalid API Key");
            return;
        }

        await _next(context);
    }
}

3. 在 appsettings.json 配置 ApiKey

{
    
    
  "ApiSettings": {
    
    
    "ApiKey": "MySuperSecretApiKey123"
  }
}

4. 注册中间件

Program.cs 文件中配置中间件:

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.UseMiddleware<ApiKeyMiddleware>(); // 添加Api Key中间件

app.MapGet("/", () => "Hello World!");

app.MapGet("/api/data", () => Results.Json(new {
    
     Data = "Secret Data" }));

app.Run();

5. 请求测试

请求示例 (正确的API Key)
GET /api/data HTTP/1.1
Host: localhost:5000
X-API-KEY: MySuperSecretApiKey123

返回:

{
    
    
  "Data": "Secret Data"
}
请求示例 (缺少 API Key)
GET /api/data HTTP/1.1
Host: localhost:5000

返回:

API Key is missing
请求示例 (错误 API Key)
GET /api/data HTTP/1.1
Host: localhost:5000
X-API-KEY: WrongApiKey

返回:

Invalid API Key

6. 说明

  • ApiKeyMiddleware 会拦截所有 HTTP 请求,检查是否携带了正确的 API Key。
  • 通过 IConfiguration 获取配置中的 API Key。
  • 未提供或错误的 API Key 请求将直接返回 401 Unauthorized

7. 安全性提升建议

  • 使用 SHA256 对 API Key 进行哈希存储。
  • 可以将 API Key 存储在 环境变量密钥管理工具(如 Azure Key Vault) 中。
  • 配合 Rate Limiting 限制请求频率,防止暴力破解。

8. 结语

这种方式简单直接,适用于小型项目或内网 API。但对于敏感数据传输,建议搭配 HTTPS 和更高级的认证机制(如 JWT 或 OAuth2)。