aspnetboilerplate:SignalR JWT 身份验证

aspnetboilerplate: SignalR JWT Authentication

我们正在尝试将 SignalR 集成到第 3 方应用程序中,以便与我们的 aspnetboilerplate 应用程序的集线器对话。这是使用 .NET Core 模板。我们在具有 null UserId 的 aspnetboilerplate 会话中遇到问题,即使通过我们集线器上的属性来检查授权也是如此。

我们遇到的问题是 AbpSession 内部的 UserId 有时会为空。它通过了 [Authorize] 属性,但 aspnetboilerplate 似乎随机认为 UserId 为空。我可以在我们的集线器上调用一个方法,并查看该用户的 UserId 是否正确。然后,下次我用同一用户在集线器上调用相同的方法时,AbpSession 中的 UserId 是 null. 然后我可以再次调用该方法,UserId 有时会是 null 或有时是正确的。他们在这个问题上似乎没有任何一致性。它会时不时地在 null 和正确的 UserId.

之间交替

我们的客户代码:

let connection = new signalR.HubConnectionBuilder()
.withUrl('ENTER HUB URL HERE',
{
  transport: signalR.HttpTransportType.LongPolling,
  accessTokenFactory: () => {
    return 'BEARER TOKEN HERE'
 }}).build()

 connection.invoke('sendGroupMessage', text, hardCodedChatGroup)

这是服务器上我们的 SignalR Hub 的示例:

    [AbpMvcAuthorize]
public class OpenChatHub : Hub, ITransientDependency
{
    public IAbpSession AbpSession { get; set; }

    public ILogger Logger { get; set; }

    public OpenChatHub()
    {
        AbpSession = NullAbpSession.Instance;
        Logger = NullLogger.Instance;
    }

    public async Task SendGroupMessage(string message, string groupName)
    {
        // logic for the SendGroupMessage would be here
        var msg = new
        {
            sendById = AbpSession.UserId, // this will be null at random times
            message = message
        };
        await Clients.Group(group).SendAsync("receiveChatMessage", msg);
    }
}

我可以查看 SignalR 与集线器协商和通信的请求,我可以看到每次都正确传递了令牌。

在对这个问题进行了更多研究之后,同时尝试将一个测试项目放在一起,我可以 GitHub 重现问题,我最终解决了问题。

现在每次在 Hub 中使用以下内容都会为我们提供正确的 UserId。 Context.User.Identity.GetUserId();

我相信这现在一定是 aspnetboilerplate 中的一个错误。我将尝试在 GitHub.

上报告问题