【发布时间】:2018-11-02 20:43:06
【问题描述】:
我们正在尝试将 SignalR 集成到第 3 方应用程序中,以便与我们为 aspnetboilerplate 应用程序拥有的集线器进行通信。这是使用 .NET Core 模板。我们在 aspnetboilerplate 中的会话存在问题,该会话具有 null UserId,即使在通过 Hub 上的属性检查授权时也是如此。
我们遇到的问题是UserId 内部的AbpSession 会随机为空。它超越了 [Authorize] 属性,但 aspnetboilerplate 似乎认为 UserId 在随机时间为空。我可以在我们的 Hub 上调用一个方法,然后查看该用户的 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 与 Hub 协商和通信的请求,并且我可以看到每次都正确传递了令牌。
【问题讨论】:
-
在 GitHub 上创建一个 repro 项目。
-
@aaron 我会看看我是否可以在 GitHub 上获得一个小项目来测试这一点。在 Web 浏览器中使用应用程序进行基于 Cookie 的身份验证似乎可以正常工作(尽管需要进行更多测试)。似乎是当我们在不在浏览器中的应用程序(如移动应用程序)上使用 JWT 时。
标签: signalr aspnetboilerplate asp.net-core-signalr