使用WebAPI启用CORS

时间:2016-09-23 15:36:28

标签: c# asp.net-mvc asp.net-web-api

我正在尝试使用CORS来处理新的WebAPI项目。该项目只是使用ActiveDirectoryBearerAuthentication的默认WebAPI模板(即具有MVC和WebAPI引用)。

每当我尝试向API发出请求时,都会遇到以下错误:

XMLHttpRequest cannot load https://localhost:44385/api/values. Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'https://localhost:44369' is therefore not allowed access.

我已经安装了Microsoft.Owin.Cors和Microsoft.AspNet.WebApi.Cors。

我的WebApiConfig是这样的:

public static void Register(HttpConfiguration config)
{
    config.EnableCors();
    ....

My Startup.Auth就是这样:

public void ConfigureAuth(IAppBuilder app)
{
    app.UseCors(CorsOptions.AllowAll);

    app.UseWindowsAzureActiveDirectoryBearerAuthentication(
    ....

网络解决方案说要添加:

    <customHeaders>
        <!-- Adding the following custom HttpHeader will help prevent CORS from stopping the Request-->
        <add name="Access-Control-Allow-Origin" value="*" />
    </customHeaders>

到web.config。但是,无论是否安装Microsoft.AspNet.WebApi.Cors,都可以执行此操作。

3 个答案:

答案 0 :(得分:1)

要仅允许单个域,您可以执行以下操作:

<system.webServer>
 <httpProtocol>
  <customHeaders>
    <remove name="X-Powered-By" />
    <clear />
    <add name="Access-Control-Allow-Origin" value="http://www.myalloweddomain.com" />
  </customHeaders>
 </httpProtocol>
</system.webServer>

但是,这只允许使用单个域。如果您尝试添加其他添加节点,您的网站将无法加载。如果您想允许多个域,则需要尝试列出here列出的解决方案之一。

答案 1 :(得分:0)

要检查的事项:

  • Owin在IIS上启动(确保您包含Microsoft.Owin.Host.SystemWeb)
  • 检查IIS是否未劫持您的请求IIS hijacks CORS Preflight OPTIONS request
  • 使用fiddler直接向指定的URL发出OPTION请求(有时PREFLIGHT请求只是服务器返回的掩码500) - 浏览器处理不是很好

答案 2 :(得分:0)

把:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="GET, PUT, POST, DELETE, HEAD, OPTIONS" />
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept" />
  </customHeaders>
</httpProtocol>
在Web Config中,这实际上涵盖了所有内容,并将根据“*”通配符通过所有内容。如果您希望将具体域列入白名单,请将它们放入:

<add name="Access-Control-Allow-Origin" value="*" />

启用您可以通过全局配置执行操作,也可以使用属性执行操作:

[EnableCors(origins: "*", headers: "*", methods: "*")]

在相关控制器上。它是两者中的一个,如果你同时使用这两个选项,它就会窒息。

此外,您可以编写自己的属性,可以通过覆盖EnableCors属性来处理web.config appSettings或数据库中的起源,标题和方法的加载,但这已经超出了我认为的问题范围。