Ajax请求标头字段密钥不被Access-Control-Allow-Headers允许

问题描述:

尝试构建DNN服务框架WebAPI,但我在CORS中使用它时遇到了麻烦。我有所有适当的标题(我认为),但它似乎仍然没有工作。Ajax请求标头字段密钥不被Access-Control-Allow-Headers允许

错误:

请求报头:

Remote Address: 127.0.0.1:80 
URL: http://www.dnndev.me/mysite/builder/API/echo?message=Hello 
Request Method: OPTIONS 
Status Code: 200 OK 
Accept: */* 
Accept-Encoding: gzip,deflate,sdch 
Accept-Language: en-US,en;q=0.8 
Access-Control-Request-Headers: accept, key 
Access-Control-Request-Method: GET 
Connection: keep-alive 
Host: www.dnndev.me 
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.124 Safari/537.36 

响应头:

Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key 
Access-Control-Allow-Methods: * 
Access-Control-Allow-Origin: * 
Cache-Control: no-cache 
Content-Length: 13 
Content-Type: application/json; charset=utf-8 
Date: Tue, 07 Oct 2014 18:49:10 GMT 
Expires: -1 
Pragma: no-cache 
Server: Microsoft-IIS/7.5 

通常,这种误差将通过不具有“访问 - 的适当的报头所引起控制全头。但是,我正在发送正确的答复以允许ajax继续提出请求。它只是拒绝。

这里是我的方法Ajax调用:

$.ajax({ 
    type: 'GET', 
    url: 'http://www.dnndev.me/mysite/builder/API/echo', 
    dataType: 'json', 
    data: { message: 'Hello' }, 
    crossDomain: true, 
    headers: { 'Key': 'Bearer 7680ff6e-1362-4236-a9cd-c6bc8b6f13ea' }, 
    success: function (result) { console.log(result); } 
}); 

大概是显而易见的,但这只发生在跨域请求,只有当我包括自定义页眉(因此procing AJAX做一个选项)。

您的服务器与以下自定义头预检要求回应:

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key 

Access-Control-All-Headers: Origin, X-Requested-With, Content-Type, Accept, Key 

而如果你(或谁写了这个服务器的人)约CORS仔细阅读,他应该有回应

现在,客户端客户端可以继续并使用Key自定义标头。

这就是说,Bearer是相当具体的OAuth 2发送整个Authorization标头。使用Key看起来像是一个可怕的侵犯RFC和东西和车轮改造有点。

+0

谢谢!我从来没有注意到这一点。小东西... – NorianNyx 2014-10-07 19:26:29

+0

使用承载是一个古老的想法,我使用OAuth 2。我只是还没有改变头。 – NorianNyx 2014-10-07 19:28:25

请注意在Nyx的问题和Darin的答案中错字('ow'缺失)。所以这是

Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Key 

,它解决了错误消息“请求头字段一些头场没有被访问控制允许报头中的预检模式允许”,如果发送的回答为浏览器OPTION请求。

添加到您的服务器响应标题:

头( '访问控制允许报头:起源,内容类型,X-验证令牌,授权');