CORS 已启用,但访问仍被拒绝

Posted

技术标签:

【中文标题】CORS 已启用,但访问仍被拒绝【英文标题】:CORS enabled but access still denied 【发布时间】:2018-07-19 13:25:15 【问题描述】:

作为参考,我使用的是 Visual Studio 2017 和 Windows 10。

我有一个使用 Visual Studio 提供的模板设计的 MVC webapi 项目,其中的帐户存储在 SQL 数据库中。我有另一个项目,它是用户登录的网站本身。我正在尝试在 VS 中进行调试,但每当在初始登录之外发出 GET 请求时,都会遇到拒绝访问错误消息。我已经在 webapi 上启用了 CORS,但它似乎没有太大的区别。

这是我启用 CORS 的方法。

在 WebAPIConfig 文件中,我有以下内容:

 public static class WebApiConfig

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

        // Web API configuration and services
        // Configure Web API to use only bearer token authentication.
        config.SuppressDefaultHostAuthentication();
        config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

        // Web API routes
        config.MapHttpAttributeRoutes();

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/controller/id",
            defaults: new  id = RouteParameter.Optional 
        );
    

然后在 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>

这是来自进行调用的网站的代码:

function getProfilePicture(username)
    var returnValue = [];

    jQuery.support.cors = true;
    if (window.XMLHttpRequest) 
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET", 'http://localhost:60690/api/ProfilePicture?Username=' + username, false);
        xmlhttp.setRequestHeader('Content-Type', 'application/json; charset=utf-8');
        xmlhttp.setRequestHeader('Authorization', 'Bearer ' + localStorage.getItem('accessToken'));
        xmlhttp.send();
        if (xmlhttp.status == 200) 
            returnValue = jQuery.parseJSON(xmlhttp.responseText);
        
    
    return returnValue;

错误消息显示“SCRIPT7002: XMLHttpRequest: Network Error 0x80070005, Access is denied.”

我没有正确启用 CORS 吗?

更新

我下载了 Postman 试图找出问题所在。我实际上可以使用 Postman 进行 GET 调用而不会出现任何错误。它正在返回数据和所有内容。我确实注意到的一件事是它看起来不像 Authorization 标头实际上正在发送。 Fiddler 中的数据中缺少它。

【问题讨论】:

您可能希望在没有正常 appConfig 构造的情况下进行测试: string corsDomain = ConfigurationManager.AppSettings["CorsAllowedDomain"]; EnableCorsAttribute cors = new EnableCorsAttribute(corsDomain, "", "") SupportsCredentials = true ; config.EnableCors(cors);尝试将“CorsAllowedDomain”设置为“*”。 @programmerj 这样做会让我收到此错误消息“CORS 响应不允许使用多个 Access-Control-Allow-Origin 标头。” :( 【参考方案1】:

Access-Control-Allow-Credentials: true 指定为响应标头与Access-Control-Allow-Origin: *不兼容。如果您要使用凭据,则必须使用Access-Control-Allow-Origin: &lt;value-of-origin-request-header&gt;

【讨论】:

我这样做了,但我仍然收到错误消息。 :( @Rhendar,如果您将此标记为正确答案,是否意味着您设法让它工作? 最终,是的。我想我本质上是两次实例化 CORS。你的帖子让我走上了正确的道路。谢谢。

以上是关于CORS 已启用,但访问仍被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

添加文档访问被拒绝

使用 CORS 调用本地 URL 时 IE10 中的访问被拒绝

CORS 已启用,但 toDataURL 仍会引发警告

CORS 策略已阻止从源对 X 的 XMLHttpRequest 的 CORS 访问

在 spring 安全标签中启用 CORS

在 node/express 中启用了 CORS,但得到“对预检请求的响应未通过访问控制检查”