CORS:凭证模式是'包括'

时间:2017-03-15 07:23:02

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

是的,我知道你在想什么 - 还有另一个CORS问题,但这一次我很难过。

首先,开始实际的错误信息:

  

XMLHttpRequest无法加载http://localhost/Foo.API/token。该   “访问控制 - 允许 - 来源”的价值'响应中的标题必须   不是通配符' *'当请求的凭据模式是   '包括' 即可。起源' http://localhost:5000'因此是不允许的   访问。由...发起的请求的凭据模式   XMLHttpRequest由withCredentials属性控制。

我不确定凭据模式的含义是'包含'

所以当我在邮递员中执行请求时,我会遇到没有这样的错误:

enter image description here

但是当我通过我的angularjs网络应用程序访问相同的请求时,我被这个错误所困扰。这是我的angualrjs请求/回复。您将看到响应为OK 200,但我仍然收到CORS错误:

提琴手请求和响应:

下图显示了从Web前端到API的请求和响应

Fiddler

因此,基于我在线阅读的所有其他帖子,似乎就像我正在做正确的事情,这就是我无法理解错误的原因。最后,这是我在angualrjs(登录工厂)中使用的代码:

enter image description here

API中的CORS实现 - 参考目的:

使用方法1:

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        EnableCrossSiteRequests(config);
    }

    private static void EnableCrossSiteRequests(HttpConfiguration config)
    {
        var cors = new EnableCorsAttribute("*", "*", "*")
        {
            SupportsCredentials = true
        };
        config.EnableCors(cors);
    }
}

使用方法2:

public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    ConfigureOAuth(app);

    WebApiConfig.Register(config);
    app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);
    app.UseWebApi(config);

}

非常感谢提前!

5 个答案:

答案 0 :(得分:51)

问题源于您的Angular代码:

withCredentials设置为true时,它会尝试与请求一起发送凭据或Cookie。因为这意味着另一个来源可能尝试进行经过身份验证的请求,所以不允许使用通配符(" *")作为"访问控制 - 允许 - 来源"报头中。

您必须明确回应在" Access-Control-Allow-Origin"中发出请求的来源。标题使这项工作。

我建议明确地将您想要允许进行身份验证请求的来源列入白名单,因为只需响应来自请求的来源意味着如果用户碰巧有效,任何给定的网站都可以对您的后端进行经过身份验证的调用会话。

我在this article解释了这些内容。我写了一段时间。

因此,您可以将withCredentials设置为false或实施原始白名单,并在涉及凭据时使用有效来源回复CORS请求

答案 1 :(得分:0)

如果有帮助,我在我的reactjs应用中使用了离心机, 然后,在检查了以下一些注释之后,我查看了centrifuge.js库文件,该文件在我的版本中具有以下代码段:

if ('withCredentials' in xhr) {
 xhr.withCredentials = true;
}

删除这三行后,该应用程序按预期运行正常。

希望有帮助!

答案 2 :(得分:0)

如果您使用的是CORS中间件,并且希望发送withCredential布尔值true,则可以这样配置CORS:

var cors = require('cors');
app.use(cors({credentials:true,origin:'http://localhost:5000'}));

答案 3 :(得分:0)

如果使用的是.NET Core,则在Startup.CS中配置CORS时必须使用.AllowCredentials()。

在ConfigureServices内

services.AddCors(o => {
    o.AddPolicy("AllowSetOrigins", options =>
    {
        options.WithOrigins("https://localhost:xxxx");
        options.AllowAnyHeader();
        options.AllowAnyMethod();
        options.AllowCredentials();
    });
});

services.AddMvc();

然后在Configure中:

app.UseCors("AllowSetOrigins");
app.UseMvc(routes =>
    {
        // Routing code here
    });

对我来说,只是缺少options.AllowCredentials()导致了您提到的错误。通常,对于也有CORS问题的其他人来说,要注意的是,顺序很重要,并且必须在Startup类内部的AddMVC()之前注册AddCors()。

答案 4 :(得分:0)

只需在客户端添加Axios.defaults.withCredentials=true而不是({credentials: true}), 并将app.use(cors())更改为

app.use(cors(
  {origin: ['your client side server'],
  methods: ['GET', 'POST'],
  credentials:true,
}
))