CORS:凭据模式为“包含”

是的,我知道你在想什么 - 另一个CORS问题,但这次我感到困惑。

因此,首先,实际的错误消息:

XMLHttpRequest 无法加载 http://localhost/Foo.API/token。当请求的凭据模式为“include”时,响应中的“访问控制-允许-源”标头的值不得为通配符“*”。因此,不允许访问源“http://localhost:5000”。由 XMLHttpRequest 发起的请求的凭据模式由 withCredentials 属性控制。

我不确定凭据模式的含义是“包含”?

因此,当我在postman中执行请求时,我没有遇到这样的错误:

enter image description here

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

小提琴手请求和响应:

下图演示了从 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);

}

答案 1

问题源于您的 Angular 代码:

设置为 true 时,它将尝试随请求一起发送凭据或 Cookie。由于这意味着另一个源可能正在尝试执行经过身份验证的请求,因此不允许将通配符 (“*”) 作为“访问控制-允许-源”标头。withCredentials

您必须显式响应在“访问控制-允许-源”标头中发出请求的源才能使此操作正常工作。

我建议将您希望允许发出经过身份验证的请求的源显式列入白名单,因为仅使用请求中的源进行响应意味着,如果用户碰巧具有有效的会话,则任何给定的网站都可以对您的后端进行经过身份验证的调用。

我在不久前写的这篇文章中解释了这些东西。

因此,您可以设置为 false 或实现源白名单,并在涉及凭据时使用有效源响应 CORS 请求withCredentials


答案 2

如果您使用的是 CORS 中间件,并且想要发送布尔值 true,则可以按如下方式配置 CORS:withCredentials

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

`