【发布时间】:2018-03-15 01:35:21
【问题描述】:
概述:
我可以访问服务器 (IIS) 和代码(jQuery、MVC 项目等)。我们需要设置 CORS,以便前端开发人员能够访问我们 QA 服务器上的 API。 IIS 服务器启用了“基本身份验证”,并启用了以下“Access-Control-Allow-XX”:
-
Credentials : true Headers : Content-Type, Authorization-
Methods : GET,POST,OPTIONS,HEAD -
Origin : http://myLocal// I did have*as this, but the response was complaining that I could not have a wildcard -- did not understand this
jQuery(省略 U/P)
$.ajax({
dataType: "json",
type: "POST",
url: 'https://ourQAserver.com' + fcs_vars.subscribeURL,
headers: {
"Authorization": "Basic " + btoa('USERNAME:PASS')
//,'Access-Control-Allow-Origin' : '*'
},
xhrFields: {
withCredentials: true
},
//beforesend: function (xhr) {
// xhr.setrequestheader('Authorization', 'Basic ' + btoa('USERNAME:PASS'));
//},
//crossdomain: true,
contentType: "application/json",
data: user,
cache: false,
....
....
正如您在上面看到的,我尝试了不同的方法来让它发挥作用。我从请求中收到的当前错误是:
加载失败 https://ourQAserver.com/area/controller/action: 预检响应包含无效的 HTTP 状态代码 401
服务器没有“响应”(在 Chrome 开发工具中)
一个想法是我必须在 MVC 中启用 CORS,使用 Nuget pkg,然后将属性添加到控制器上,但我没有这样做,因为我可以访问 IIS 本身。
【问题讨论】:
-
我认为可能不是 CORS,而是身份验证。您可以尝试访问没有
[Authorize]属性的控制器吗? -
在我添加
Authorization标头属性之前(这不是 MVC 属性,而是用于发送编码的 base64 字符串作为用户名/密码),我在 Google 的控制台中收到了一个不同的错误,与事实上,我(当时)没有发送信用。不幸的是,我无法从 IIS 应用程序池中删除“基本身份验证”,因为不应从网络外部访问我们的 QA 环境。 -
您需要将服务器后端配置为不需要对
OPTIONS向https://ourqaserver.com/area/controller/action的请求进行授权。问题中引用的消息中的 401 状态代码表示服务器需要对OPTIONS请求进行授权,但授权失败,因为请求不包含所需的凭据。原因是,OPTIONS请求是作为 CORS 的一部分由您的浏览器自动发送的,并且浏览器不会将Authorization标头添加到该预检OPTIONS请求中。 -
更详细: 1. 您的代码告诉您的浏览器它想要发送带有授权标头的请求。 2. 浏览器说,好的,带有 Authorization 标头的请求要求我执行 CORS 预检 OPTIONS 以确保服务器允许带有 Authorization 标头的请求。 3. 浏览器将选项发送到服务器不带
Authorization标头。 4. 服务器看到 OPTIONS 但由于缺少标头而以 401 拒绝它。 5. 浏览器期望预检得到 200 响应,但得到 401。所以浏览器停在那里,从不尝试来自您的代码的 POST 请求。 -
因此,您必须弄清楚当前服务器端代码的哪一部分导致您的服务器需要对 OPTIONS 进行授权,并对其进行更改,以便它在不需要授权的情况下处理 OPTIONS。 developer.mozilla.org/en-US/docs/Web/HTTP/… 一般解释了为什么浏览器会发出 CORS 预检 OPTIONS 请求,以及响应必须包含哪些标头;具体来说,在这种情况下,对预检 OPTIONS 的响应必须具有“Access-Control-Allow-Methods: POST”和“Access-Control-Allow-Headers: Authorization”响应头。
标签: jquery asp.net-mvc iis cors