【问题标题】:SignalR Core 2.2 CORS AllowAnyOrigin() breaking changeSignalR Core 2.2 CORS AllowAnyOrigin() 重大更改
【发布时间】:2019-05-16 03:39:51
【问题描述】:

要通过 SignalR 从任何来源连接到 ASP.NET Core 2.1 服务器,我们必须按如下方式配置管道:

app.UseCors (
  builder => builder
   .AllowAnyHeader ()
   .AllowAnyMethod ()
   .AllowAnyOrigin ()
   .AllowCredentials ()
)

根据this 文档,ASP.NET Core 2.2 不再允许 AllowAnyOrigin 和 AllowCredentials 的组合,那么解决方案是什么?而 SignalR Core 总是在 XMLHtppRequest 中发送 withCredentials:true。

我需要的是,我们的用户可以从任何来源且无需凭据即可连接到 SignalR Hub。

【问题讨论】:

  • 您站点的链接似乎有解决此问题的步骤。这些步骤不适合您吗?
  • 来自文档:“修改 CORS 策略以不再允许凭据。也就是说,在配置策略时删除对 AllowCredentials 的调用”。 Signalr 没有禁用 withcredentials 属性的选项,因此,没有链接没有帮助。为什么投反对票?

标签: c# asp.net-core asp.net-core-signalr asp.net-core-2.2


【解决方案1】:

有个变通办法,把AllowAnyOrigin改成SetIsOriginAllowed

app.UseCors(builder => builder
                .AllowAnyHeader()
                .AllowAnyMethod()
                .SetIsOriginAllowed(_ => true)
                .AllowCredentials()
            );

【讨论】:

  • 谢谢你,这是一个聪明的问题,答案很聪明。
  • 允许使用凭证的任意来源是非常不安全的,因此我投了反对票。赞成票的数量令人难以置信......
【解决方案2】:

我找到了解决办法。您可以尝试以下代码部分:

.SetIsOriginAllowed (_ => true)

这对我有用。

【讨论】:

    【解决方案3】:

    您可以使用“WithOrigins”方法传递来源,可以通过配置读取。

    app.UseCors(builder => builder
                .AllowAnyHeader()
                .AllowAnyMethod()
                .WithOrigins(new string[] { "www.example1.com", "www.example2.com" })
                .AllowCredentials()
            );
    

    如果传递的唯一字符串是“*”,那么你仍然会遇到 signalR 的问题。如果你传递了许多字符串,其中一个是“*”,它就可以工作。

    【讨论】:

    • Alexandre 已经发布了一个可行的解决方案。作者问'我需要的是来自任何来源且没有凭据',所以你的答案不正确。我认为您的意图是告诉人们还有另一种声明特定来源的方法,但您应该发表类似的评论。
    • @NePheus 来自 op 的问题并不完全清楚......因为他说 SignalR 总是发送凭据,然后他不想要凭据......所以这听起来像是另一种方式解决问题
    猜你喜欢
    • 2019-06-15
    • 2021-11-16
    • 2021-01-04
    • 2018-04-27
    • 1970-01-01
    • 2021-08-26
    • 2021-04-27
    • 2019-07-02
    • 2021-12-06
    相关资源
    最近更新 更多