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.
上报告问题
我们正在尝试将 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.
上报告问题