ASP.NET Core 5 WebApi配置多CORS策略后OPTIONS预检返回405错误
ASP.NET Core 5 跨域预检请求返回405的排查与修复
这类问题的本质没有任何悬念:CORS中间件没有拦截处理OPTIONS预检请求,请求顺着管道走到MVC端点路由层,匹配到的控制器动作仅声明了POST/GET等业务请求方法、不支持OPTIONS请求,最终被路由层判定为非法请求方法,返回405状态码。结合配置代码,高频触发点有三个:
- CORS策略存在硬错误,校验不通过时中间件直接跳过预检处理
- 配置的
CORS_POLICY_STRICT策略中采用了无参的WithOrigins()调用,该写法最终生成的允许起源列表为空,策略从配置层面就完全失效 - 通过
GetFrontEndOrigins从配置文件加载的前端源如果存在格式问题(比如携带路径后缀、末尾斜杠、非HTTP/HTTPS协议开头的地址),会直接导致源校验失败,CORS中间件不做任何预检处理 - 如果控制器标注的是
CORS_POLICY_STRICT策略,而测试请求携带Access-Control-Request-Headers: X-Requested-With头,由于该策略仅允许Authorization请求头,校验不通过时中间件会直接放行请求,不处理预检逻辑
- 配置的
- 中间件管道调用方式错误
- 尝试通过两次携带策略名的
UseCors(策略名)实现多策略生效的逻辑完全不成立:带参数的UseCors作用是设置全局默认CORS策略,后一次调用会完全覆盖前一次的配置,不存在叠加生效的可能 - 管道靠前位置的
UseHttpsRedirection会在CORS逻辑之前拦截非HTTPS的本地预检请求,直接返回302重定向跳转,预检请求不会跟随跳转,自然走不到CORS处理逻辑
- 尝试通过两次携带策略名的
- 端点元数据丢失
- ASP.NET Core 5的CORS与端点路由深度绑定,CORS中间件需要从路由层获取对应接口上标注的
EnableCors特性元数据,才能匹配对应策略处理预检请求。如果控制器路由配置异常、没有被框架正确扫描到,元数据丢失后CORS中间件不会对请求做任何处理,直接放行到路由层触发405错误。
- ASP.NET Core 5的CORS与端点路由深度绑定,CORS中间件需要从路由层获取对应接口上标注的
对应修复步骤
- 修正策略配置的硬错误
- 把
CORS_POLICY_STRICT中无参的WithOrigins()替换为明确传入的服务间调用可信源列表,禁止空参数调用 - 校验所有从配置加载的前端源格式,严格遵循「协议+域名+端口」的标准格式,不得携带路径、末尾斜杠等额外内容
- 把
- 调整中间件管道顺序
- 保持无参的
UseCors()调用位置在UseRouting()之后、UseAuthentication/UseAuthorization之前,禁止重复调用UseCors - 本地开发调试阶段,临时将
UseHttpsRedirection()挪到UseCors()之后,避免HTTPS重定向逻辑拦截预检请求
- 保持无参的
- 快速定位验证
- 发送OPTIONS测试请求时检查返回响应头,如果响应中完全没有
Access-Control-Allow-*系列头,即可确认CORS中间件未处理当前请求 - 可临时在全局控制器上统一标注
[EnableCors]特性,若此时OPTIONS请求正常返回200,说明原单个控制器上的特性未被路由正确识别,属于元数据扫描异常问题。
- 发送OPTIONS测试请求时检查返回响应头,如果响应中完全没有
内容的提问来源于stack exchange,提问作者usr-local-ΕΨΗΕΛΩΝ
相关产品推荐
相关产品推荐

