我遇到了SignalR和用户在ASP.NET MVC 4应用程序中更改身份的问题。我正在使用自定义成员资格提供程序的表单身份验证。
我有SignalR on的视图也有一个登录(和注销)按钮,登录和注销用户必须能够查看此视图(并且都连接到SignalR组)与该观点相关联)。但是,当人们登录时,我一直遇到麻烦。当用户身份发生变化时,建议的做法是“重新连接”基础SignalR连接?该视图是其他操作显示的其他视图之一。这是唯一包含SignalR javascript的内容。
事实上,我甚至都不是对用户的身份感兴趣,因此以某种方式关闭用户亲和力就行了(但我找不到办法做到这一点)。用户更改也可以触发页面重新加载,因为登录/注销发生在除维持连接的窗口之外的窗口中,因此后者没有用户的焦点。
问题,换句话说:当用户身份从登录用户更改为已注销用户时,如何保持基础SignalR连接,反之亦然?
在页面上处理登录/注销事件,如下所示:
$("a[href='/Account/Logout']").click(function () {
$.connection.hub.stop();
});
这样可行,但这需要在用户所在的每个页面上使用SignalR 能够登录或退出,而不仅仅是实际使用SignalR的那个。
在使用ASP.NET会话ID键入的集线器上添加其他组,该会话在登录和注销之间保持一致。登录或注销后,我通过向具有该会话ID的组发送重新连接的触发器来通知客户端。这只是为时已晚,在请求结束时身份已被更改,因此异常被解雇。
对于此特定用例,将向用户显示包含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}}进行了比较。这一切都有道理,但我正在寻找的是一种解决方法。
答案 0 :(得分:-2)
这很简单,不依赖于用户识别,而是创建自己的cookie,您可以跟踪每个用户,无论该用户是否已登录。就像许多AD公司都有cookie来跟踪用户,即使他们没有登录。