在活动连接期间登录/注销时,使用websockets的SignalR保持相同的用户标识

时间:2014-01-09 12:11:45

标签: signalr

我正在使用带有websockets的设置的SignalR在server2012上运行ASP.NET MVC 4.5应用程序。

在页面上有“登录/注销”按钮,我必须在服务器上维护活动连接。

当用于传输serverSentEvents的服务器一切正常时,当用户更改身份验证时,我得到了回调

$.connection.hub.error(function (error) {
    // stop current signalR connection and start new one        
    createNewConnection();
});

但是当我为websockets设置服务器时,它停止调用错误函数。我在论坛中发现常见的解决方案是定期ping服务器并更新cookie,但是当我使用signalR - websockets ping服务器时,服务器无法识别用户身份已经改变。

基本上当我开始与已经登录的用户建立连接然后单击注销时,服务器将保持websocket连接不变,具有相同的用户身份:

Context.User.Identity.Name 
用户退出后

将是相同的。

我知道在主动signalR连接期间用户身份无法更改,但我需要检查cookie是否没有更改,因为它可以从另一个打开的选项卡或窗口更改。

1 个答案:

答案 0 :(得分:3)

所以你所看到的是100%预期。除了WebSockets之外,所有传输都会间歇性地进行通信。

Ex:SSE - 已经建立了1个连接并且从未中断以接收信息,并且每当您尝试从客户端向服务器发送数据时都会触发AJAX请求,AJAX请求是间歇性请求。

现在,在每次向服务器发出请求时,SignalR会验证用户身份。 Sooo为每个客户 - >服务器在SSE中发送验证用户身份。但是,在WebSockets中,只有1个请求处于活动状态(实例化连接),并通过连接双向发送和接收流。

因此,由于WebSockets只有1个请求,因此它永远不会知道身份变化。

另一方面,如果您使用SignalR 2.0.0+,您的连接将在5分钟的时间跨度内获知无效的用户身份(SignalR每5分钟向服务器发送一次ajax请求)。

希望这些信息有所帮助!