如何在ASP.NET应用中访问API密钥以实现业务逻辑判断
ASP.NET 控制器访问API密钥的实现方案
API密钥一般由调用方放在请求头中传递,你可以通过以下几种方式获取使用:
1. 直接在接口内提取(最简便,适合单接口使用场景)
你可以直接从当前请求的Headers中读取调用方传递的密钥,同时通过依赖注入读取你预设的客户密钥做比对,修改后的代码如下:
namespace ProductList.Api.Controllers { [Route("api/[controller]")] public class ProductController : Controller { private readonly IConfiguration _config; private readonly IProductService _productService; // 构造函数注入配置服务和你的商品服务 public ProductController(IConfiguration config, IProductService productService) { _config = config; _productService = productService; } [HttpGet("productlist")] public async Task<IActionResult> ProductList() { // 从请求头读取调用方传递的API密钥,头名可根据你们的约定修改 if (!Request.Headers.TryGetValue("X-Api-Key", out var requestApiKey)) { return Unauthorized("请求缺少必填的API密钥"); } // 读取预设的客户专属密钥,也可以改为从数据库查询对应用户的密钥 var customerKey = _config.GetValue<string>("CustomerApiKey"); if(requestApiKey.ToString().Trim() == customerKey.Trim()) { return Ok(_productService.CustomerList()); } else { return Ok(_productService.StandardList()); } } } }
你需要在appsettings.json中添加预设的客户密钥配置:
{ "CustomerApiKey": "你的客户专属API密钥值" }
2. 全局预解析(适合多接口共用密钥场景)
如果你的项目有多个接口都需要读取API密钥,可以通过自定义过滤器/中间件提前把密钥解析后存入HttpContext上下文,控制器中直接读取即可:
第一步:定义API密钥解析过滤器
public class ApiKeyExtractFilter : IActionFilter { public void OnActionExecuting(ActionExecutingContext context) { if (context.HttpContext.Request.Headers.TryGetValue("X-Api-Key", out var apiKey)) { context.HttpContext.Items["RequestApiKey"] = apiKey.ToString().Trim(); } } public void OnActionExecuted(ActionExecutedContext context) { // 无需实现 } }
第二步:在Program.cs中注册过滤器
builder.Services.AddControllers(options => { options.Filters.Add<ApiKeyExtractFilter>(); });
第三步:控制器中直接读取密钥
var apiKey = HttpContext.Items["RequestApiKey"]?.ToString();
注意事项
- 生产环境不要把API密钥硬编码在代码中,建议放在环境变量、专用密钥管理服务中
- API密钥传输必须使用HTTPS协议,避免明文传输导致密钥泄露
内容的提问来源于stack exchange,提问作者SørenHN
相关产品推荐
相关产品推荐

