【问题标题】:SignalR failing to authenticate via cookiesSignalR 无法通过 cookie 进行身份验证
【发布时间】:2024-04-29 19:45:02
【问题描述】:

我有几个项目:

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

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

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

当我拨打 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 中设置 Cookie 身份验证,以便它可以跨两个项目工作?

【问题讨论】:

    标签: authentication .net-core cookies signalr


    【解决方案1】:

    问题在于,默认情况下,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());
    

    【讨论】: