对预检请求的响应未通过signalR中的访问控制检查

时间:2018-12-31 15:24:55

标签: angular cors signalr.client asp.net-core-2.2 signalr-2

该应用程序在.net core 2.1中可以正常工作。 signalR服务器的配置类似于public void ConfigureServices(IServiceCollection services)方法中的以下代码片段:

```

services.AddCors(setupAction =>
  setupAction.AddPolicy("MyPolicy",
                    builder => builder
                    .AllowAnyOrigin()
                    .AllowAnyMethod()
                    .AllowAnyHeader()
                    .AllowCredentials()))

```

在Configuration方法中,我有以下代码片段:

```

 app.UseCors("MyPolicy")

```

角度客户端应用程序的代码将启动连接,如以下代码片段所示:

```

this._connection = this._connection || new HubConnectionBuilder()
        .withUrl('https://localhost:44314/xyz/test?abc=123', options)
        .build();

```

正如我所说,此设置一直运行良好。我将.net核心应用程序(signalR服务器)从2.1升级到2.2(dotnetcore SDK版本2.2.101),并将signalR客户端软件包升级到1.1.0。 signalR服务器为angular应用程序和另一个C#应用程序提供服务。 C#应用程序完美地连接到signalR服务器,并且可以执行预期的操作,但是angular应用程序会产生以下错误消息:

  

在以下位置访问XMLHttpRequest   原产地的“ https://localhost:44314/xyz/test/negotiate?abc=123”   “ https://localhost:44303”已被CORS政策屏蔽:对   预检请求未通过访问控制检查:   响应中的“ Access-Control-Allow-Origin”标头不得为   当请求的凭据模式为“包括”时,使用通配符“ *”。的   XMLHttpRequest发起的请求的凭据模式为   由withCredentials属性控制。

在angular应用程序和C#客户端应用程序中,signalR客户端的版本均为1.1.0。

为什么升级到.net core 2.2会导致此通信失败,以及可能的解决方案是什么?!

2 个答案:

答案 0 :(得分:1)

如您所见,浏览器清楚地说明了问题所在。您不能使用allowAnyOrigin(即Access-Control-Allow-Origin: *作为对allowCredentials的响应)。缩小来源访问范围或删除凭证限额。

我不确定凭据部分是由于规则接受凭据标头还是由于请求中实际存在凭据而引起的。您将不得不检查一下。

  

任何升级到.net core 2.2的原因导致此通信失败的原因

也许实现的方式确实发生了变化,即内部提到的选项是互斥的,而现在完全控制权交给了程序员-但这只是一个幸运的猜测。

答案 1 :(得分:1)

针对此问题,有两种解决方案可以选择其中一种:

解决方案1:明确指定CORS来源。 解决方案2:或编写中间件以产生预期的标头。

在此处找到更多信息:

https://github.com/aspnet/AspNetCore/issues/4457