【问题标题】:Changing user identity during an active SignalR connection — how to reconnect?在活动 SignalR 连接期间更改用户身份 - 如何重新连接?
【发布时间】:2013-06-03 14:49:51
【问题描述】:

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

我有 SignalR 的视图也有一个登录(和注销)按钮,登录和注销的用户都必须能够查看此视图​​(并且都连接到 SignalR 组与该视图相关联)。但是,当人们登录时,我一直遇到麻烦。当用户身份更改时,“重新连接”底层 SignalR 连接的推荐做法是什么?该视图是其他操作显示的其他几个视图之一。这是唯一包含 SignalR javascript 的。

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

问题,换句话说:当用户身份从登录用户更改为已注销用户(反之亦然)时,我如何保持底层 SignalR 连接正常运行?

我尝试过的事情

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

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

  2. 在集线器上添加一个以 ASP.NET 会话 ID 为键的附加组,该 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 与存储在连接令牌中的进行了比较。这一切都说得通,但我正在寻找一种解决方法。

我正在使用Microsoft.AspNet.SignalR 1.1.2

【问题讨论】:

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

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


【解决方案1】:

这很简单,不要依赖用户标识,而是创建自己的 cookie,无论该用户是否登录,您都可以跟踪每个用户。就像许多广告机构都有 cookie 来跟踪用户,即使他们没有登录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多