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

时间:2017-03-09 21:00:08

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

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

我正在从本地网络应用程序进行ajax调用,并测试我的CORS实现。到目前为止,几乎所有事情都运作良好。如果我没有指定Access-Control-Allow-Origin(现在只设置为*),我的呼叫是不允许的(我期望的),但我也尝试指定Access-Control-Allow-方法并不像我的输入限制了特定的调用。

例如,这是我的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 PUT值中切换添加/删除Access-Control-Allow-Methods,我看到了如果它被列出,它只会允许该方法。

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

1 个答案:

答案 0 :(得分:3)

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

例如,Access-Control-Allow-Methods仅对使用简单的跨源表单无法完成的请求有效。

这意味着:GETPOST可以跳过the spec中描述的Access-Control-Allow-Methods

  

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

     

因此,简单请求具有重要意义的资源   除了检索之外,必须保护自己免受跨站请求   Forgery(CSRF)要求在其中包含一个不可思议的令牌   明确提供的请求内容。

(强调我的)