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秒调用它,但这只会重新激活会话.
任何想法,将不胜感激!
谢谢约翰
我在 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 异常,并且用户在重新身份验证后被重定向到他们所在的上一个页面。
| 归档时间: |
|
| 查看次数: |
2607 次 |
| 最近记录: |