在活动SignalR连接期间更改用户身份 - 如何重新连接?

时间:2013-06-07 10:15:04

标签: asp.net-mvc asp.net-mvc-4 signalr

我遇到了SignalR和用户在ASP.NET MVC 4应用程序中更改身份的问题。我正在使用自定义成员资格提供程序的表单身份验证。

我有SignalR on的视图也有一个登录(和注销)按钮,登录和注销用户必须能够查看此视图​​(并且都连接到SignalR组)与该观点相关联)。但是,当人们登录时,我一直遇到麻烦。当用户身份发生变化时,建议的做法是“重新连接”基础SignalR连接?该视图是其他操作显示的其他视图之一。这是唯一包含SignalR javascript的内容。

事实上,我甚至都不是对用户的身份感兴趣,因此以某种方式关闭用户亲和力就行了(但我找不到办法做到这一点)。用户更改也可以触发页面重新加载,因为登录/注销发生在除维持连接的窗口之外的窗口中,因此后者没有用户的焦点。

问题,换句话说:当用户身份从登录用户更改为已注销用户时,如何保持基础SignalR连接,反之亦然?

我尝试过的事情

  1. 在页面上处理登录/注销事件,如下所示:    $("a[href='/Account/Logout']").click(function () { $.connection.hub.stop(); });

    这样可行,但这需要在用户所在的每个页面上使用SignalR 能够登录或退出,而不仅仅是实际使用SignalR的那个。

  2. 在使用ASP.NET会话ID键入的集线器上添加其他组,该会话在登录和注销之间保持一致。登录或注销后,我通过向具有该会话ID的组发送重新连接的触发器来通知客户端。这只是为时已晚,在请求结束时身份已被更改,因此异常被解雇。

  3. 有关我的设置的更多详细信息

    对于此特定用例,将向用户显示包含SignalR的页面。我按照惯例加入了中心:

    var hub = $.connection.theNameOfTheHub;
    $.connection.hub.start().done(function () {
      hub.server.joinList(id);
    });
    

    出于本示例的目的,我更改了一些名称。基本上,我想监视页面上显示的项目列表的更改。我使用列表的id作为标识符加入一个组。

    异常消息是“System.InvalidOperationException:无法识别的用户身份。在活动的SignalR连接期间,用户身份无法更改。”它来自Microsoft.AspNet.SignalR.PersistentConnection.GetConnectionId。我查找了源代码,并将实际的context.Request.User.Identity.Name与存储在连接令牌中的{{1}}进行了比较。这一切都有道理,但我正在寻找的是一种解决方法。

    我正在使用Microsoft.AspNet.SignalR 1.1.2

1 个答案:

答案 0 :(得分:-2)

这很简单,不依赖于用户识别,而是创建自己的cookie,您可以跟踪每个用户,无论该用户是否已登录。就像许多AD公司都有cookie来跟踪用户,即使他们没有登录。