Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CORS:凭证模式为';包括';_Javascript_C#_Angularjs_Cors_Asp.net Web Api2 - Fatal编程技术网

Javascript CORS:凭证模式为';包括';

Javascript CORS:凭证模式为';包括';,javascript,c#,angularjs,cors,asp.net-web-api2,Javascript,C#,Angularjs,Cors,Asp.net Web Api2,是的,我知道你在想什么——这是CORS的另一个问题,但这次我被难住了 因此,首先,实际的错误消息: 无法加载XMLHttpRequest。这个 响应中“Access Control Allow Origin”标头的值必须为 当请求的凭据模式为 “包括”。因此,不允许使用源“” 通道由发起的请求的凭据模式 XMLHttpRequest由withCredentials属性控制 我不确定凭证模式的意思是“包括”吗 因此,当我在postman中执行请求时,我遇到了否这样的错误: 但是当我通过angul

是的,我知道你在想什么——这是CORS的另一个问题,但这次我被难住了

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

无法加载XMLHttpRequest。这个 响应中“Access Control Allow Origin”标头的值必须为 当请求的凭据模式为 “包括”。因此,不允许使用源“” 通道由发起的请求的凭据模式 XMLHttpRequest由withCredentials属性控制

我不确定凭证模式的意思是“包括”吗

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

但是当我通过angularjs web应用程序访问相同的请求时,我被这个错误难住了。这是我的angualrjs请求/响应。正如您将看到的,响应是
OK 200
,但我仍然收到CORS错误:

小提琴手请求和响应:

下图演示了从web前端到API的请求和响应

因此,根据我在网上读到的所有其他帖子,我似乎做了正确的事情,这就是为什么我不能理解错误。最后,这里是我在angualrjs(登录工厂)中使用的代码:

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);

}

非常感谢

问题源于您的角度代码:

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

您必须在“Access Control Allow origin”(访问控制允许来源)标题中显式地使用发出请求的来源进行响应,以使其工作

我建议明确列出您希望允许发出经过身份验证的请求的来源,因为只要使用来自请求的来源进行响应,就意味着如果用户碰巧拥有有效会话,任何给定网站都可以向您的后端发出经过身份验证的呼叫

我在一段时间前写的文章中解释了这件事


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

为Angular 5和Spring Security定制CORS(基于Cookie的解决方案)

在角度侧,需要为Cookie传输添加选项标志
withCredentials:true

constructor(public http: HttpClient) {
}

public get(url: string = ''): Observable<any> {
    return this.http.get(url, { withCredentials: true });
}

方法
configure(HttpSecurity http)
默认情况下将使用
corsConfigurationSource
用于
http.cors()

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

if ('withCredentials' in xhr) {
 xhr.withCredentials = true;
}
在我删除了这三行之后,应用程序工作得很好,正如预期的那样


希望有帮助

如果您正在使用CORS中间件,并且希望发送带有凭据的
布尔值true,则可以如下配置CORS:

var-cors=require('cors');

使用(cors({凭证:true,来源:'http://localhost:5000'}));如果您使用的是.NET Core,则在Startup.CS中配置CORS时必须使用.AllowCredentials()

配置服务内部

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

services.AddMvc();
然后在配置的内部:

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

对我来说,就是缺少options.AllowCredentials()导致了您提到的错误。一般来说,对于其他有CORS问题的人来说,作为一个旁注,order matters和AddCors()必须在您的Startup类中的AddMVC()之前注册。

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

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

好照片,它们是什么的?为了回答您的问题,如果您包括身份验证,则访问控制允许源站响应必须是源站(浏览器页面)主机,它不能是
*
-因此,服务器端的CORS错误-哦,邮递员工作,因为它不是跨源站request@JaromandaX,谢谢你的回复。这些图片展示了请求/响应以及传递的标题。你问这个问题,显然表明它没有实现它的目标…我的评论应该是你需要知道的全部-不需要看到图片。因此,最近我决定不再使用web api上的cookie,而是使用令牌。当我使用cookies时,我的CORS工作没有任何问题。因此,我很难理解CORS是如何在服务器端正确实现的。如果包括身份验证,则
访问控制允许源
响应必须是源(浏览器页面)主机,不能是
*
我正在使用TypeScript处理Angular 5应用程序。我需要将withCredentials设置为true,否则我将获得授权失败异常。如何使用凭据解决此问题:true@Ziggler我也有同样的情况。你找到解决方案了吗?@Ziggler我想知道我的答案。当使用WithCredentials=TRUE和Access Control Allow Origin=['时,我仍然会遇到此错误,并且我没有使用star*所以错误消息不再有意义。错误消息:"对飞行前请求的响应未通过访问控制检查:当请求的凭据模式为“包括”时,响应中“访问控制允许来源”标头的值不得为通配符*。因此,不允许访问来源“”。由XMLHttpRequest启动的请求的凭据模式由withCred控制entials属性。“@mruanova您确定在请求中正确设置了Access Control Allow Origin标头吗?听起来好像在某处发送了带有通配符的内容
app.use(cors(
  {origin: ['your client side server'],
  methods: ['GET', 'POST'],
  credentials:true,
}
))