C# WEB API CORS不起作用。

5
与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需要启用/更改吗?当您在Visual Studio IIS Express上的localhost:PortNumber上运行时,CORS是否无法工作?我错过了什么?

当您在常规http上运行它时,是否会出现相同的问题? - Marcus Höglund
我正在尝试从https网站运行它,当我尝试使用普通的http时,会出现有关混合内容的错误,并且请求永远不会被执行。 - Dave
请使用Postman尝试。 - Marcus Höglund
它在Chrome中工作...我认为FireFox是问题所在。https://dev59.com/9mAf5IYBdhLWcg3wsUbT - Dave
是的,但那么问题就出在你的 HTTPS 证书上了。 - Marcus Höglund
是的,这很有道理,因为我正在使用自签名证书来测试。 - Dave
2个回答

2
在您的客户端JavaScript代码中,您可以尝试添加以下内容:
xhr.withCredentials = true;

Firefox '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
另一种方法是:在您的服务的global.asax或其他代码中添加类似于以下内容的内容
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"]);

如果以上两种方法都不行,可以尝试使用 Microsoft.AspNet.WebApi.Cors

0

你的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>

你不能只说“允许一切”,因为所有协议默认都是关闭的,所以必须指定协议。如果你想在请求中进行任何登录方法,我建议使用Allow-Credentials,否则可以删除该行。

你还需要确保这一切都包含在system.webServer部分中。


谢谢bizzehdee,但是同样的问题仍然存在。我已经验证了它们的设置也包含在system.webServer部分中。 - Dave

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接