访问控制允许方法似乎不起作用

Goo*_*ose 9 javascript ajax jquery cors asp.net-web-api2

我在 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>
Run Code Online (Sandbox Code Playgroud)

我只有OPTIONSGET列出了,但我仍然能够发出 POST 请求。同样,如果我设置它,"OPTIONS, POST"我仍然可以发出 GET 请求。

编辑

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

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

gee*_*aut 9

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

例如,这Access-Control-Allow-Methods仅对无法使用简单的跨域表单发出的请求有效。

这意味着:GET并且POST可以跳过规范中的Access-Control-Allow-Methods描述:

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

正因为如此,对于简单请求具有非检索意义的资源,必须通过要求在明确提供的请求内容中包含不可猜测的令牌来保护自己免受跨站请求伪造 (CSRF) 的影响。

(强调我的)

  • 但是如果 POST 请求不简单(假设我们在请求中设置了一些标头),那么我发现 Access-Control-Allow-Methods 仍然忽略它,无论预检请求是在真正的 POST 请求之前发送。 (4认同)