在 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)。