.NET 4.5 C# API如何基于环境配置ApiKey授权控制器?
.NET 4.5 Web API 基于ApiKey的授权实现方案
一、配置不同环境的ApiKey(Web.Config转换)
首先在主Web.config的appSettings节点中添加ApiKey配置项:
<appSettings> <add key="ApiKey" value="default-dev-key" /> <!-- 其他配置项 --> </appSettings>
然后针对每个环境创建配置转换文件(Web.Dev.config、Web.UAT.config、Web.Prod.config),替换对应环境的ApiKey值:
以Web.Prod.config为例:
<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform"> <appSettings> <add key="ApiKey" value="prod-secure-api-key" xdt:Transform="Replace" xdt:Locator="Match(key)" /> </appSettings> </configuration>
发布时选择对应环境,配置系统会自动替换ApiKey值。
二、实现自定义ApiKey授权特性
创建继承自System.Web.Http.AuthorizeAttribute的自定义特性,重写OnAuthorization方法完成ApiKey验证:
using System; using System.Linq; using System.Net; using System.Net.Http; using System.Web.Http; using System.Web.Http.Controllers; public class AuthorizeByApiKeyAttribute : System.Web.Http.AuthorizeAttribute { protected override void HandleUnauthorizedRequest(HttpActionContext actionContext) { actionContext.Response = actionContext.Request.CreateResponse(HttpStatusCode.Unauthorized, "Invalid or missing API key"); } public override void OnAuthorization(HttpActionContext actionContext) { // 从配置中获取当前环境的ApiKey var validApiKey = System.Configuration.ConfigurationManager.AppSettings["ApiKey"]; if (string.IsNullOrEmpty(validApiKey)) { HandleUnauthorizedRequest(actionContext); return; } // 从请求头中提取ApiKey(也可从QueryString获取,根据需求调整) var requestApiKey = actionContext.Request.Headers.GetValues("X-Api-Key")?.FirstOrDefault(); if (string.IsNullOrEmpty(requestApiKey) || !requestApiKey.Equals(validApiKey, StringComparison.OrdinalIgnoreCase)) { HandleUnauthorizedRequest(actionContext); return; } // 验证通过,继续执行 base.OnAuthorization(actionContext); } }
三、使用授权特性
方式1:单个控制器/方法使用
直接在控制器上添加特性,和RoutePrefix配合使用:
using System.Web.Http; [AuthorizeByApiKey] [RoutePrefix("api/address")] public class AddressController : ApiController { [Route("{id}")] public IHttpActionResult Get(int id) { // 接口逻辑 return Ok(new { Id = id, Address = "Sample Address" }); } }
方式2:全局注册(所有接口生效)
在WebApiConfig.cs的Register方法中注册全局授权过滤器,无需逐个控制器添加:
using System.Web.Http; public static class WebApiConfig { public static void Register(HttpConfiguration config) { // 添加全局ApiKey授权过滤器 config.Filters.Add(new AuthorizeByApiKeyAttribute()); // Web API 路由配置 config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
四、验证请求
客户端请求时,需要在请求头中携带X-Api-Key字段,值为对应环境的ApiKey:
X-Api-Key: prod-secure-api-key
如果ApiKey无效或缺失,接口会返回401 Unauthorized。
内容的提问来源于stack exchange,提问作者Pratex
相关产品推荐
相关产品推荐

