【问题标题】:Access-Control-Allow-Methods doesn't seem to be working访问控制允许方法似乎不起作用
【发布时间】:2017-07-31 00:37:48
【问题描述】:

我在 Web 服务器上有一个小型 Web API 应用程序,其中一个 GET 方法返回 3 条记录,一个 POST 方法接受一个对象,然后为其分配一个 ID 并返回相同的对象。

我正在从本地 Web 应用程序进行 ajax 调用,并测试我的 CORS 实现。到目前为止,几乎所有东西都运行良好。如果我没有指定 Access-Control-Allow-Origin(现在只设置为 *),我的调用将被禁止(我所期望的),但我也尝试指定 Access-Control-Allow-Methods 并且它没有'似乎我的输入不会限制特定的调用。

例如,这是我的 web.config 包含的内容:

<httpProtocol>
  <customHeaders>
    <clear />
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type, Authorization, Accept, X-Requested-With " />
    <add name="Access-Control-Allow-Methods" value="OPTIONS, GET" />
  </customHeaders>
</httpProtocol>

我只列出了OPTIONSGET,但我仍然可以发出 POST 请求。同样,如果我将其设置为"OPTIONS, POST",我仍然可以发出 GET 请求。

编辑

根据下面@geekonaut 的回答,我能够看到我所期望的这个功能。我尝试尝试PUT 请求,而不是GETPOST,但随后出现错误,指出不允许OPTIONS(预检)请求。我首先需要在我的Global.asax.cs 文件中添加一个部分来接受该方法,然后如果我在 web.config 的Access-Control-Allow-Methods 值中切换添加/删除PUT,我看到它只会允许该方法如果它是列出来。

protected void Application_OnBeginRequest()
{
    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        HttpContext.Current.Response.StatusCode = 200;
        HttpContext.Current.Response.End();
    }
}

【问题讨论】:

  • 任何来自预检请求或任何请求后的标头的有用信息?
  • 我应该寻找什么具体的东西?我看到它正在尝试一个 POST 请求,并且 Access-Control-Allow-Methods 的值是 OPTIONS, GET 所以似乎一切都在飞行前正确设置。
  • 我不是很喜欢 asp.net,但是你有没有尝试过类似 filter by verbs 部分中提到的配置https://www.iis.net/learn/manage/configuring-security/use-request-filtering,我开始思考可能服务器只发送标头,没有真正验证客户端请求。
  • 感谢@JordanQuagliatini 的回复,但事实证明这个问题与我对该属性可以限制的方法类型的误解有关,以及允许来自OPTIONS 的200 回复requests - 我已经更新了我上面的帖子。

标签: javascript jquery ajax cors asp.net-web-api2


【解决方案1】:

CORS 不会阻止基于其方法的简单(甚至预检)POST 请求。

Access-Control-Allow-Methods 仅对无法通过简单的跨域表单发出的请求有效。

这意味着:GETPOST 可以跳过Access-Control-Allow-Methods,如the spec 中所述:

在本规范之外生成的简单跨域请求 (例如使用 GET 或 POST 的跨域表单提交或 由脚本元素产生的跨域 GET 请求)通常 包括用户凭据,因此符合此的资源 规范必须始终准备好期望简单的跨域 带有凭据的请求。

因此,对于简单请求具有重要意义的资源 除了检索必须保护自己免受跨站点请求 伪造(CSRF),要求在 明确提供的请求内容。

(强调我的)

【讨论】:

  • 完美,这是有道理的,我之前显然没有在文档中看到过该部分。我将修改我上面的问题,以显示我如何能够看到Access-Control-Allow-Methods 属性函数更像我所期望的。
  • 但是如果 POST 请求不简单(假设我们在请求中设置了一些标头),那么我发现无论在真正的 POST 请求之前发送预检请求,Access-Control-Allow-Methods 仍然会忽略它。
  • @QuocVanTang 是的 POST 仍然不需要出现在 access-Control-Allow-Methods 中,但非简单标头需要出现在响应标头 Access-Control-Allow-Headers 中。由于一个简单的 POST 请求变成了非简单的 POST 请求,因此非简单的标头将被启用 cors 的服务器验证并认真对待。
猜你喜欢
  • 2015-05-13
  • 2012-03-16
  • 1970-01-01
  • 2020-04-24
  • 2016-04-04
  • 2016-11-10
  • 2015-02-17
  • 2012-04-27
  • 2019-12-12
相关资源
最近更新 更多