SignalR异常“无法识别的用户身份。在活动的SignalR连接期间,用户身份无法更改。”

时间:2013-11-26 21:55:26

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

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

我有一个javascript函数,它在一个计时器上运行,这样在20分钟和1秒后,它刷新页面,用户被重定向到Login页面。出于安全原因,我这样做很重要,而且效果很好。

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

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

任何想法都将不胜感激!

由于 约翰

1 个答案:

答案 0 :(得分:2)

我与Github的David Fowler(SignalR的作者)对应,他说没有一种简单的解决方法。

为了解决这个问题,我实施了一个Silent Logout控制器操作,它只会杀死用户会话。

    [HttpPost]
    [AjaxOnly]
    public ActionResult SilentLogOff()
    {
        _unitOfWork.WebSecurity.Logout();

        return Json(new
        {
            IsSuccess = true,
        });
    }

然后我将JS计时器调整为表单身份验证超时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异常,并且用户被重定向到重新验证后它们所在的上一页。