Asp.net mvc 在活动信号机连接期间更改用户身份—;如何重新连接?

Asp.net mvc 在活动信号机连接期间更改用户身份—;如何重新连接?,asp.net-mvc,asp.net-mvc-4,signalr,Asp.net Mvc,Asp.net Mvc 4,Signalr,我在ASP.NET MVC 4应用程序中遇到信号器和用户更改身份的问题。我正在使用自定义成员资格提供程序的表单身份验证 我让SignalR打开的视图也有一个登录(和注销)按钮,登录和注销的用户都必须能够查看该视图(并且都连接到与该视图关联的SignalR组)。然而,当人们登录时,我总是遇到麻烦。当用户身份发生变化时,“重新连接”基础信号机连接的建议做法是什么?该视图是由其他操作显示的多个其他视图之一。这是唯一一个包含signarjavascript的 事实上,我甚至对用户的身份不太感兴趣,所以以

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

我让SignalR打开的视图也有一个登录(和注销)按钮,登录和注销的用户都必须能够查看该视图(并且都连接到与该视图关联的SignalR组)。然而,当人们登录时,我总是遇到麻烦。当用户身份发生变化时,“重新连接”基础信号机连接的建议做法是什么?该视图是由其他操作显示的多个其他视图之一。这是唯一一个包含signarjavascript的

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

换言之,问题是:当用户身份从登录用户更改为注销用户,反之亦然时,如何保持底层信号器连接正常运行?

我尝试过的事情
  • 处理页面上的登录/注销事件,如下所示:
    $(“a[href='/Account/Logout'])。单击(函数(){
    $.connection.hub.stop();
    });

    这是可行的,但这需要在用户所在的每个页面上都有signaler 能够登录或注销,而不仅仅是实际使用Signal的用户

  • 在集线器上添加一个附加组,该组由ASP.NET会话ID键控,该ID在登录和注销之间保持一致。在登录或注销时,我通过向会话ID为的组发送重新连接的触发器来通知客户端。这一切都太晚了,在请求结束时,身份已经更改,因此引发了异常

  • 有关我的设置的更多详细信息 对于这个特定的用例,用户将看到一个包含SignalR的页面。我按常规加入中心:

    var hub = $.connection.theNameOfTheHub;
    $.connection.hub.start().done(function () {
      hub.server.joinList(id);
    });
    
    在本例中,我更改了几个名称。基本上,我希望监视页面上显示的项目列表上的更改。我使用列表的id作为标识符加入一个组

    异常消息是“
    System.InvalidOperationException
    :无法识别的用户标识。用户标识在活动信号器连接期间无法更改。”它来自
    Microsoft.AspNet.signer.PersistentConnection.GetConnectionId
    。我已经查找了源代码,它将实际的
    context.Request.User.Identity.Name
    与存储在连接令牌中的内容进行了比较。这一切都是有道理的,但我正在寻找的是一个解决办法


    我正在使用。

    这很简单,不要依赖用户标识,而是创建自己的cookie,您可以跟踪每个用户,而不管该用户是否登录。就像许多广告公司一样,即使用户未登录,他们也会使用cookie来跟踪用户

    您是否对跟踪用户->连接感兴趣,还是只想跟踪分为两大组的连接:已验证和匿名?事实上,我甚至不想跟踪用户/连接,我希望问题消失:)-因此,我认为只有在从已验证切换到匿名再切换时才会这样做。在我的场景中,没有从一个经过身份验证的用户切换到另一个经过身份验证的用户,但理论上问题也适用于此。你说“事实上,我甚至对用户的身份都不感兴趣,因此以某种方式关闭用户亲和力是可以的(但我找不到方法来做到这一点)”。您是否尝试在您的登录页面上添加“[AllowAnonymous]标记?为了保持连接的有效性,我设想一旦您的用户登录,他们将被重定向到另一个页面,从而删除您的SignalR JS。@FrankGeerlings您是否解决了您的问题?如果是-如何解决?:)