【问题标题】:SignalR exception "Unrecognized user identity. The user identity cannot change during an active SignalR connection."SignalR 异常“无法识别的用户身份。在活动 SignalR 连接期间,用户身份无法更改。”
【发布时间】:2013-11-26 21:55:26
【问题描述】:

我已在使用表单身份验证的 MVC 4 应用程序上启动并运行 SignalR。我将 cookie 超时设置为 20 分钟。

我有一个在计时器上运行的 javascript 函数,以便在 20 分 1 秒后刷新页面并将用户重定向到登录页面。出于安全原因,我这样做很重要,而且效果很好。

我的问题是 SignalR 抛出 InvalidOperation 异常,因为用户身份已更改。我理解它为什么这样做,但不知道如何避免它。

我试过调用 $.connection.hub.stop();在重新加载页面之前,但它不起作用。我尝试在 cookie 过期前 5 秒调用它,但这只会重新激活会话。

任何想法都将不胜感激!

谢谢 约翰

【问题讨论】:

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


    【解决方案1】:

    我在 Github 上与 David Fowler(SignalR 的作者)通信,他说没有简单的方法来解决这个问题。

    为了解决这个问题,我实现了一个静默注销控制器操作,它只是终止了用户会话。

        [HttpPost]
        [AjaxOnly]
        public ActionResult SilentLogOff()
        {
            _unitOfWork.WebSecurity.Logout();
    
            return Json(new
            {
                IsSuccess = true,
            });
        }
    

    然后我将 JS 计时器调整为比 Forms 身份验证超时时间短 10 秒。当它过期时,它会停止 SignalR 集线器连接,对 SilentLogout 操作执行 POST,然后重新加载页面。

    SetLogoutTimer: function () {
    
        var formsTimeoutValue = $("#hdnRefreshTimeout").val();
    
        clearTimeout("formsTimeoutTimer");
    
        var formsTimeoutTimer = setTimeout(function () {
            $.connection.hub.stop();
    
            AppName.Authenticated.SilentLogoutUser();
    
        }, formsTimeoutValue);
    }
    
    SilentLogoutUser: function() {
        var url = $("#logout a").attr("data-bind-silent-url");
        $.ajax({
            type: "POST",
            url: url,
            success: function (response) {
                if (response.IsSuccess === true) {
                    window.location.reload(true);
                }
    
            }
        });
    }
    

    这会导致正确的行为,因为没有 SignalR 异常,并且用户在重新身份验证后被重定向到他们所在的上一个页面。

    【讨论】:

    • 添加了嗨代码示例。无论如何它对我有用。这是一个 javascript 解决方案,因此它不适合所有场景。在我的应用程序中,除非启用 javascript,否则用户无法登录。
    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    相关资源
    最近更新 更多