来自基于 OWIN 的 WebAPI 的飞行前选项 CORS 令牌请求出现 400 错误

Posted

技术标签:

【中文标题】来自基于 OWIN 的 WebAPI 的飞行前选项 CORS 令牌请求出现 400 错误【英文标题】:Got 400 error for pre-flight options CORS token request from OWIN-based WebAPI 【发布时间】:2015-08-29 20:36:48 【问题描述】:

真的很奇怪。

我尝试向 WebAPI2(基于 OWIN)发出 CORS 请求以获取身份验证令牌。

它总是每隔一段时间就会失败。像第一个请求失败,但第二个请求会通过。第三次失败,但第四次会通过。

我不明白为什么它有一半的时间。

我检查浏览器请求(chrome)。

失败的总是通过 OPTIONS 方法。经历过的总是通过POST。

但我总是使用带有标题 'Content-Type': 'application/x-www-form-urlencoded' 的 post 方法

所以我想问题是为什么有时 Chrome/火狐会发送预检请求,但有时却没有。

顺便说一句,它在 IE 中完全可以正常工作。

【问题讨论】:

我也有同样的问题,你对此有什么结论吗? 【参考方案1】:

Chrome 和 FireFox 都使用 preflight OPTIONS 请求是正确的。因此,在执行 POST 之前,Chrome/FireFox 会使用 OPTIONS 动词发送请求。如果它没有收到来自服务器的响应,告诉浏览器它可以发送跨域请求,那么你会得到一个错误并且后续的 POST 不会发布。

您必须在 web.config 中启用 OPTIONS(或使用本文中列出的方法之一): http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api

对于 web.config 尝试:

<httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS,PUT"/>
        <add name="Access-Control-Allow-Headers" value="Content-Type, Accept"/>            
      </customHeaders>

IE 在采用 CORS 标准方面进展缓慢,这就是为什么 IE 在不启用 OPTIONS 的情况下也能正常工作的原因。

【讨论】:

好吧,问题是它适用于以下请求。为什么? 没有看到你是如何实现 CORS 的,很难回答。

以上是关于来自基于 OWIN 的 WebAPI 的飞行前选项 CORS 令牌请求出现 400 错误的主要内容,如果未能解决你的问题,请参考以下文章

在WebApi中基于Owin OAuth使用授权发放Token

Apigee 飞行前选项请求

WebApi 上的 AngularJS 和 OWIN 身份验证

使用 OWIN 的 ASP.NET WebApi 的有效 WebSockets 实现是啥? (不能是 SignalR。)

Web API OWIN 从 $.AJAX POST withCredentials:true 接收空数据

Owin WebAPI上传文件