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请求
- 先通过Nuget安装
Microsoft.AspNet.WebApi.Cors包 - 在
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
相关产品推荐
相关产品推荐

