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

Joh*_* Mc 5 .net javascript asp.net-mvc-4 signalr

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

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

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

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

任何想法,将不胜感激!

谢谢约翰

Joh*_* Mc 2

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

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

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

        return Json(new
        {
            IsSuccess = true,
        });
    }
Run Code Online (Sandbox Code Playgroud)

然后我将 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);
            }

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

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