【发布时间】: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>
我只列出了OPTIONS 和GET,但我仍然可以发出 POST 请求。同样,如果我将其设置为"OPTIONS, POST",我仍然可以发出 GET 请求。
编辑
根据下面@geekonaut 的回答,我能够看到我所期望的这个功能。我尝试尝试PUT 请求,而不是GET 或POST,但随后出现错误,指出不允许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