【问题标题】:SignalR Issue with .Net Core 5.0 migration, app.UseSignalR -> app.UseEndpoints.Net Core 5.0 迁移的 SignalR 问题,app.UseSignalR -> app.UseEndpoints
【发布时间】:2021-03-28 16:40:12
【问题描述】:

我已从 Net core 3.1 迁移到 5.0,但更新后我无法让 signalR 连接。每当它尝试连接到集线器时,我都会收到 401 错误。

错误日志

2020-12-17 15:47:07.351 -08:00 [INF] AuthenticationScheme: Identity.Application was challenged.
2020-12-17 15:47:07.351 -08:00 [INF] Request finished HTTP/2 POST 
https://blah.blah.org:5001/range/negotiate?negotiateVersion=1 text/plain;charset=UTF-8 0 - 401 0 
- 4.4068ms
2020-12-17 15:47:12.355 -08:00 [INF] Request starting HTTP/2 POST 
https://blah.blah.org:5001/range/negotiate?negotiateVersion=1 text/plain;charset=UTF-8 0
2020-12-17 15:47:12.355 -08:00 [INF] Authorization failed. These requirements were not met:
DenyAnonymousAuthorizationRequirement: Requires an authenticated user.

在 Startup.cs 中配置函数项

app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseCookiePolicy();  
app.UseStaticFiles();
app.UseSession();
app.UseEndpoints(endpoints =>
{
      endpoints.MapHub<Hubs.RangeHub>("/range");
});

javascript

connection = connection || new signalR.HubConnectionBuilder()
            .withUrl("/range")
            .configureLogging(signalR.LogLevel.Information)
            .build();

async function start()
        {
            try
            {
                await connection.start();
                console.log("SignalR Connected.");
            } catch (err)
            {
                console.log(err);
                setTimeout(start, 5000);
            }
        };

start();

Hub 正在使用 [Authorize] 属性

[Authorize]
public class RangeHub : Hub

当我运行可能导致该问题的应用程序时,我还在 Visual Studio 的调试输出中看到了大量令人不安的异常:

Exception thrown: 'System.IO.IOException' in System.Net.Security.dll
Exception thrown: 'System.IO.IOException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.IOException' in System.Private.CoreLib.dll
Exception thrown: 'System.IO.IOException' in System.Private.CoreLib.dll
Exception thrown: 'System.Net.Sockets.SocketException' in 
Exception thrown: 'System.Net.Sockets.SocketException' in System.Private.CoreLib.dll
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
Exception thrown: 'Microsoft.CSharp.RuntimeBinder.RuntimeBinderException' in Microsoft.CSharp.dll
Exception thrown: 'System.Net.Sockets.SocketException' in 
Exception thrown: 'System.Net.Sockets.SocketException' in System.Private.CoreLib.dll
Exception thrown: 'System.InvalidOperationException' in Microsoft.AspNetCore.Routing.dll
Exception thrown: 'System.InvalidOperationException' in System.Private.CoreLib.dll
Exception thrown: 'System.InvalidOperationException' in System.Private.CoreLib.dll
Exception thrown: 'System.InvalidOperationException' in System.Private.CoreLib.dll

还有其他人遇到这个问题吗?我花了几天时间尝试不同的东西,但没有回到核心 3,我不知道还能尝试什么。

-- 更新- 在玩了几天之后,我尝试恢复到核心 3.1,但将 app.UseSignalR 的更改留给了 5.0 强制执行的 app.UseEndpoints。看起来这种变化是我无法解决的主要问题。它带来了一些我不熟悉的授权更改,找不到任何信息:

app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
    endpoints.MapHub<Hubs.RangeHub>("/range");
});

从 app.UseSignalR 转换到这些行。这仅用于管理用户会话。谁能指出我正确的方向?

【问题讨论】:

  • 如何分配loginToken?后端无法验证令牌。
  • @user1986237 我不再尝试将 jwt 用于用户会话。我试图弄清楚为什么 signalr 的标准 cookie 身份验证在 5.0 中停止工作。我认为这与切换到端点有关,我只是不确定为什么。

标签: asp.net-core authentication .net-core signalr http-status-code-401


【解决方案1】:

这是糟糕的一周。问题是 app.UseAuthorization();和 app.UseAuthentication();顺序错误。他们需要看起来像这样:

app.UseAuthentication();
app.UseAuthorization();

解决方案如此简单时令人沮丧。

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2021-01-04
    • 2022-07-15
    • 2020-05-28
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    相关资源
    最近更新 更多