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

ASP.NET Web API自定义Authorization过滤器无法获取前端SecurityToken头问题

问题根因

这个现象是*跨域预检请求(OPTIONS请求)*导致的,具体逻辑如下:

  • 前端属于跨域请求场景时,浏览器会在真实请求发送前,先自动发送一个OPTIONS类型的预检请求,用来校验服务端是否允许跨域访问
  • 你的自定义授权过滤器没有对OPTIONS请求做特殊处理,会直接校验这个预检请求,但预检请求不会携带你自定义的SecurityToken请求头,所以授权校验直接失败,后续真实请求根本不会发送
  • Postman没有跨域限制,不会发送预检请求,直接发送带请求头的真实请求,所以校验可以通过
  • 至于为什么控制器里能拿到值:只有预检通过后真实请求才会进到控制器执行,所以控制器阶段拿到的都是真实请求的头,自然可以正常获取

解决方案

有两种常见的处理方式,按需选择:

方式1:授权过滤器中跳过OPTIONS请求的校验

在你的IsAuthorized方法最开头加上判断逻辑,直接放行OPTIONS请求:

protected override bool IsAuthorized(HttpActionContext httpContext)
{
    // 新增:跳过跨域预检请求的授权校验
    if (httpContext.Request.Method.Method == "OPTIONS")
    {
        return true;
    }
    // 原有逻辑不变
    foreach (var item in httpContext.Request.Headers)
    {
        string skey = item.Key;
        var val = item.Value;
        Debug.WriteLine(skey + "-" + val.ToString());
    }
    // 其余原有代码保持不变
}

方式2:配置Web API跨域处理中间件优先处理OPTIONS请求

  1. 先通过Nuget安装Microsoft.AspNet.WebApi.Cors包
  2. 在WebApiConfig.cs中注册全局跨域配置,让跨域逻辑在授权过滤器之前执行:
public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // 配置跨域允许规则,根据实际需求调整Origin、Header、Method的允许范围
        var cors = new EnableCorsAttribute("*", "*", "*");
        config.EnableCors(cors);
        
        // 原有路由等配置不变
        config.MapHttpAttributeRoutes();
        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    }
}

注意:如果跨域配置中限制了允许的请求头,需要把自定义的SecurityToken加入允许列表,否则就算预检过了,后续请求头也会被跨域策略拦截。

内容的提问来源于stack exchange,提问作者Nitesh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 03:06:03