You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 14:56:24