我们已经用[EnableCors('*', '*', '*')]
attribute装饰了公共Web API控制器。
我的期望是,对于包含在该Web API控制器类中的端点,CORS是完全允许的,并且不受任何限制。但是,我看到对Chrome预检OPTIONS
请求的响应仅包含以下与CORS相关的标头:
Access-Control-Allow-Headers: access-control-allow-headers,access-control-allow-methods,access-control-allow-origin
Access-Control-Allow-Origin: *
因此,我正在Chrome内部(通过$.ajax
发送的实际POST
请求失败,并向控制台记录了以下消息:
CORS策略已阻止从原点“ https:// ...”访问“ https:// ...”处的XMLHttpRequest:请求中不存在“ Access-Control-Allow-Origin”标头资源。
我是不是误解了EnableCors
属性的含义,还是应该去寻找可能覆盖我在控制器类的所述属性中设置的全局设置的所有全局设置? < / p>
编辑:根据到目前为止的答案,这是我尝试过的一些事情:
*
。 Another MDN page对于存在不应该设置为withCredentials
的{{1}}标志更加明确。现在,我已将配置对象的true
属性中的withCredentials
设置为$.ajax
到xhrFields
,无论如何,我的请求将不会发送任何cookie或auth头。但是,描述的错误不断发生。false
方法时,CORS似乎已正确初始化。答案 0 :(得分:3)
您需要做两件事,属性才能工作source documentation here
在App_Start / WebApiConfig.cs中。基本上,您在这里配置应用程序以启用cors配置。在进行任何路由配置之前,务必先做好操作。
使用System.Web.Http;
namespace WebService
{
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// This is the key line
config.EnableCors();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
}
然后
使用System.Net.Http; 使用System.Web.Http; 使用System.Web.Http.Cors;
namespace WebService.Controllers
{
[EnableCors(origins: "http://mywebclient.azurewebsites.net", headers: "*", methods: "*")]
public class TestController : ApiController
{
// Controller methods not shown...
}
}
答案 1 :(得分:2)
Access-Control-Allow-Origin
如果使用凭据,则不允许使用*
的值。
允许所有来源带有任何类型的凭据或用户标识是一个可怕的安全漏洞,浏览器试图阻止这种情况的发生。