ASP .NET Core 中的 Api Key 身份验证之一【IAuthorizationFilter】

在 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 项目! 🚀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值