【问题标题】:C# WEB API CORS does not workC# WEB API CORS 不起作用
【发布时间】:2017-07-05 20:48:41
【问题描述】:

与 CORS 战斗。我有一个网站正在向我用 C# 构建的 WEB API 发出简单的 XmlHttpRequest。

    var xhr = new XMLHttpRequest();
    xhr.open("GET","https://server/controller/method", true);
    xhr.send();

在我的 web.config 中,我做了以下操作:

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

我还尝试安装 Nuget 包并在我的 WebApiConfig.cs 中执行以下操作

var cors = new EnableCorsAttribute(
            origins: "*",
            headers: "*",
            methods: "*");
        config.EnableCors(cors);

尽管做出了这些努力,CORS 仍然无法正常工作。在 FireFox 控制台中,我收到以下错误:

跨域请求被阻止:同源策略不允许读取位于https://server 的远程资源。这可以通过将资源移动到同一域或启用 CORS 来解决。

IE 也只是失败并且没有给出错误。

根据我所阅读的所有内容,这些解决方案之一应该可以工作,但它们不能。是否需要在客户端 JavaScript 中启用/更改某些内容?当您在 localhost:PortNumber 上的 Visual Studio IIS Express 中运行 CORS 时,它是否不起作用?我错过了什么?

【问题讨论】:

  • 在常规 http 上运行是否会出现同样的问题?
  • 我正在尝试从 https 站点运行它,当我尝试正常的 http 时,我收到有关混合内容的错误,并且永远不会发出请求。
  • 用邮递员试试吧。
  • 它在 Chrome 中工作......我认为 FireFox 是问题所在。 stackoverflow.com/questions/24371734/…
  • 是的,但是问题在于您的 https 证书

标签: javascript c# asp.net-web-api cors


【解决方案1】:

在您的客户端 JavaScript 代码中,您可以尝试添加以下代码:

xhr.withCredentials = true;

Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers所示:

否则 Firefox 在发出请求时无法使用客户端证书

但是,如果您对客户端代码进行了更改,您还需要更改服务器端代码,以便 Access-Control-Allow-Origin 的值不是 *。有几种方法可以做到这一点……

在 IIS 配置中,您可以通过将以下内容添加到 %SystemDrive%\inetpub\wwwroot\ 中的 Web.configApplicationHost.config 文件中来使用 URL Rewrite Module

<configuration> 
    <system.webServer> 
        <rewrite> 
            <outboundRules> 
                <rule name="Make Access-Control-Allow-Origin echo Origin"> 
                    <match serverVariable="RESPONSE_Access-Control-Allow-Origin"
                           pattern=".+" negate="true" /> 
                    <action type="Rewrite" value="{HTTP_ORIGIN}" /> 
                </rule> 
            </outboundRules> 
        </rewrite> 
    </system.webServer> 
</configuration>

如果上述方法不起作用,那么您可以在CORS in IIS issue with credentials and wildcard in Access-Control-Allow-Origin 上尝试答案中的版本。

另一种方法是,in the global.asax or other code for your service, add something like this:

if (ValidateRequest()) {
    Response.Headers.Remove("Access-Control-Allow-Origin");
    Response.AddHeader("Access-Control-Allow-Origin", Request.Headers["origin"]);
    Response.Headers.Remove("Access-Control-Allow-Credentials");
    Response.AddHeader("Access-Control-Allow-Credentials", "true");
    Response.Headers.Remove("Access-Control-Allow-Methods");
    Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
}

...其中最重要的部分是:

Response.AddHeader("Access-Control-Allow-Origin", Request.Headers["origin"]);

如果这些都不起作用,请尝试an approach using Microsoft.AspNet.WebApi.Cors

【讨论】:

    【解决方案2】:

    您的 web.config 中需要比现有的多几行:

    <httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Headers" value="Content-Type" />
        <add name="Access-Control-Allow-Methods" value="GET, POST, PUT, DELETE, OPTIONS" />
        <add name="Access-Control-Allow-Credentials" value="true" />
      </customHeaders>
    </httpProtocol>
    

    您不能只说“允许一切”,因为默认情况下所有协议都是关闭的,因此也必须指定协议,如果您希望对您的请求执行任何类型的登录方法,我建议您允许-凭据,否则可以删除该行。

    您还需要确保这些都包含在 system.webServer 部分中。

    【讨论】:

    • 感谢bizzehdee,但同样的问题发生了。我已验证它们的设置也包含在 system.webServer 部分中。
    猜你喜欢
    • 2015-11-14
    • 2014-01-01
    • 1970-01-01
    • 2018-10-30
    • 2014-06-13
    • 2018-03-21
    • 2020-11-01
    • 2021-09-02
    • 2017-04-13
    相关资源
    最近更新 更多