在 ASP.NET Core 中,可以使用 IAuthorizationFilter
来实现 API Key 身份验证。这种方式适用于更细粒度的身份验证控制,比如只对特定的 Controller 或 Action 进行 API Key 认证。
1. 创建 ApiKeyAuthorizationFilter
新建一个类 ApiKeyAuthorizationFilter
,实现 IAuthorizationFilter
接口。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Configuration;
using System.Linq;
public class ApiKeyAuthorizationFilter : IAuthorizationFilter
{
private const string ApiKeyHeaderName = "X-API-KEY";
private readonly string _apiKey;
public ApiKeyAuthorizationFilter(IConfiguration configuration)
{
_apiKey = configuration["ApiKey"]; // 从 appsettings.json 读取 API Key
}
public void OnAuthorization(AuthorizationFilterContext context)
{
if (!context.HttpContext.Request.Headers.TryGetValue(ApiKeyHeaderName, out var extractedApiKey))
{
context.Result = new UnauthorizedObjectResult("API Key is missing.");
return;
}
if (!_apiKey.Equals(extractedApiKey.FirstOrDefault()))
{
context.Result = new UnauthorizedObjectResult("Invalid API Key.");
}
}
}
2. 创建 ApiKeyAuthorizeAttribute
为了方便使用,可以创建一个 ApiKeyAuthorize
的特性。
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.DependencyInjection;
public class ApiKeyAuthorizeAttribute : TypeFilterAttribute
{
public ApiKeyAuthorizeAttribute() : base(typeof(ApiKeyAuthorizationFilter))
{
}
}
3. 配置 appsettings.json
在 appsettings.json
添加 API Key:
{
"ApiKey": "MySecretApiKey123"
}
4. 应用到 Controller
在 TestController
里面使用 [ApiKeyAuthorize]
进行 API Key 认证。
using Microsoft.AspNetCore.Mvc;
[ApiController]
[Route("api/[controller]")]
public class TestController : ControllerBase
{
[HttpGet]
[ApiKeyAuthorize] // 只对这个方法启用 API Key 验证
public IActionResult Get()
{
return Ok("API Key is valid");
}
}
5. 发送请求测试
成功请求
请求
GET http://localhost:5000/api/test
请求头
X-API-KEY: MySecretApiKey123
响应
"API Key is valid"
失败情况
- 缺少 API Key
{
"title": "Unauthorized",
"status": 401,
"detail": "API Key is missing."
}
- API Key 错误
{
"title": "Unauthorized",
"status": 401,
"detail": "Invalid API Key."
}
6. 注册 IConfiguration
在 Program.cs
确保 IConfiguration
被正确注入。
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.UseAuthorization();
app.MapControllers();
app.Run();
总结
✅ 为什么使用 IAuthorizationFilter
?
- 适用于 特定的 Controller 或 Action。
- 更清晰的代码组织方式,避免全局身份验证影响整个应用。
- 易于扩展,比如可以根据不同的 API Key 赋予不同的权限。
这是一种简洁高效的 API Key 认证方式,适合你的 ASP.NET Core 项目! 🚀