我在使用表单身份验证的MVC 4应用程序上启动并运行SignalR。我有cookie超时,滑动过期设置为20分钟。
我有一个javascript函数,它在一个计时器上运行,这样在20分钟和1秒后,它刷新页面,用户被重定向到Login页面。出于安全原因,我这样做很重要,而且效果很好。
我的问题是SignalR正在抛出InvalidOperation异常,因为用户身份已更改。我理解为什么会这样做,但我不确定如何避免它。
我试过调用$ .connection.hub.stop();在重新加载页面之前,它不起作用。我已经尝试在cookie过期前5秒调用它,但这只会重新激活会话。
任何想法都将不胜感激!
由于 约翰
答案 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异常,并且用户被重定向到重新验证后它们所在的上一页。