SignalR 无法通过 cookie 进行身份验证

时间:2021-03-09 11:16:39

标签: authentication .net-core cookies signalr

我有几个项目:

聊天 - SignalR 后端(ChatHub)
Web - 托管客户端脚本的 MVC 项目,包括调用 Chat 项目的脚本

我正在从 .NET Framework 迁移到 .NET Core,并且正在迁移到 SignalR for Core 作为这项工作的一部分。 Cookie 身份验证在旧版本上正常工作,但在迁移到 SignalR for Core 后,我似乎遇到了问题。

在两个项目中都启用了 Cookie 身份验证。 Web 项目工作正常,Auth cookie 被正确识别并用于身份验证。但是,尽管 cookie 至少包含在协商请求中,但 Chat 项目并未根据 cookie 正确进行身份验证:

enter image description here

当我拨打 ChatHub 时,Context.User.Identity.Name 为空。在 Web 项目上运行时,相同的调用会返回填充的名称。如果我用 [Authorize] 装饰 ChatHub,调用会失败并显示 401。

Here's a minimalistic repro project showing the issue

我认为问题与我配置的身份验证有关,或者可能与调用的跨域性质有关?

This documentation 非常没有帮助,只说了以下内容:

<块引用>

在基于浏览器的应用中,cookie 身份验证允许您现有的用户凭据自动流向 SignalR 连接。使用浏览器客户端时,无需额外配置。如果用户登录到您的应用,SignalR 连接会自动继承此身份验证。

这出现在一些非常基本的配置下,基本上只调用app.UseAuthentication()。唉,那个配置对我不起作用。

如何在 SignalR for Core 中设置 Cookies 身份验证,以便它在两个项目中工作?

1 个答案:

答案 0 :(得分:0)

问题在于,默认情况下,ASP.NET Core 用于加密身份验证票证的数据保护系统会将应用程序彼此隔离。

您需要在希望共享受保护负载的每个项目上 configure data protection 使用相同的密钥环和应用标识符:

services.AddDataProtection()
    .SetApplicationName("<appName>")
    // as well as the following calls if your projects are to be deployed on different machines
    .PersistKeysToAzureBlobStorage(new Uri("<blobUriWithSasToken>"))
    .ProtectKeysWithAzureKeyVault(new Uri("<keyIdentifier>"), new DefaultAzureCredential());