ASP.NET中的会话超时警告

我有一个asp.net站点,当会话达到超时时我需要弹出/层/警报(比方说10分钟)。 弹出窗口将显示您的帐户会话将由于不活动而显示,并且具有用于继续会话的按钮或用于注销的按钮。

我在网上看到了不同的方法,但处理这个问题的最佳/正确方法是什么? 如果弹出窗口打开时间过长,是否需要额外超时?

查看本文,其中包含您的需求所需的所有内容

警报会话在ASP.NET中超时

 

这已经解决过了,例如ASP.NET – 基于session.time中的sessionState timeOut的Javascript timeOut警告

但是,AFAIK没有一种完全可靠的方法来做到这一点,因为:

  • 如果用户使用相同的会话打开了多个窗口,则一个窗口可能比另一个窗口更新,并且最旧窗口上的客户端会话超时将是陈旧/不正确的。
  • 如果您往返服务器以查看当前会话到期时间,您将扩展它,从而破坏弹出/警报的目的。

下面是一些带有jQuery的JavaScript,用于警告用户ASP.NET Forms Authentication超时,如果达到超时,将重定向到登录页面。 它也可以改进并适应会话超时。 每当用户通过单击,键入或resize与页面交互时,它还会通过“ping”服务器来重置身份validation超时。

请注意,这确实会通过每次点击,按键,resize来增加服务器的负载,但这是非常小的。 尽管如此,如果您有许多用户输入,您将需要评估影响。 我想不出另一种方法,因为服务器必须参与,因为那是超时到期的地方。

另请注意,JS中的超时不是硬编码的。 它从服务器获得超时,因此您只需要在Web.config中的一个位置维护它。

 (function ($, undefined) { if (!window.session) { window.session = { monitorAuthenticationTimeout: function (redirectUrl, pingUrl, warningDuration, cushion) { // If params not specified, use defaults. redirectUrl = redirectUrl || "~/Account/Login"; pingUrl = pingUrl || "~/Account/Ping"; warningDuration = warningDuration || 45000; cushion = cushion || 4000; var timeoutStartTime, timeout, timer, popup, countdown, pinging; var updateCountDown = function () { var secondsRemaining = Math.floor((timeout - ((new Date()).getTime() - timeoutStartTime)) / 1000), min = Math.floor(secondsRemaining / 60), sec = secondsRemaining % 60; countdown.text((min > 0 ? min + ":" : "") + (sec < 10 ? "0" + sec : sec)); // If timeout hasn't expired, continue countdown. if (secondsRemaining > 0) { timer = window.setTimeout(updateCountDown, 1000); } // Else redirect to login. else { window.location = redirectUrl; } }; var showWarning = function () { if (!popup) { popup = $( "
" + "INACTIVITY ALERT!

" + "You will be automatically logged off.

" + "

" + "Click anywhere on the page to continue working." + "
") .appendTo($("body")); countdown = popup.find("#countDown"); } popup.show(); updateCountDown(); }; var resetTimeout = function () { // Reset timeout by "pinging" server. if (!pinging) { pinging = true; var pingTime = (new Date()).getTime(); $.ajax({ type: "GET", dataType: "json", url: pingUrl, }).success(function (result) { // Stop countdown. window.clearTimeout(timer); if (popup) { popup.hide(); } // Subract time it took to do the ping from // the returned timeout and a little bit of // cushion so that client will be logged out // just before timeout has expired. timeoutStartTime = (new Date()).getTime(); timeout = result.timeout - (timeoutStartTime - pingTime) - cushion; // Start warning timer. timer = window.setTimeout(showWarning, timeout - warningDuration); pinging = false; }); } }; // If user interacts with browser, reset timeout. $(document).on("mousedown mouseup keydown keyup", "", resetTimeout); $(window).resize(resetTimeout); // Start fresh by reseting timeout. resetTimeout(); }, }; } })(jQuery);

只需在页面加载时调用以上内容:

 window.session.monitorAuthenticationTimeout( "/Account/Login", // You could also use "@FormsAuthentication.LoginUrl" in Razor. "/Account/Ping"); 

在服务器上,您将需要一个返回剩余时间的操作。 您也可以添加更多信息。

  public JsonResult Ping() { return Json(new { timeout = FormsAuthentication.Timeout.TotalMilliseconds }, JsonRequestBehavior.AllowGet); } 

您必须在这里使用客户端技术(javascript)。 例如,您将使用javascript超时工具,然后显示警告。 如果用户单击“确定”,则可能需要执行一些操作以使会话保持活动状态 我会使用jquery.ajax方法sugest,并调用服务器,可以是一个虚拟调用 – 只是为了让会话保持活动状态。

您可以使用jquery和setinterval函数在后台执行Ajax发布以刷新超时(如果使用滑动到期),或通过记录会话开始时间并从到期时间中减去时间来获取时间值。

你可以做的是使用一些JavaScript来触发消息。 使用计时器在一段时间后(在您的应用程序中为会话超时设置的时间段 – 几分钟后),在此期间之后,向用户提供会话将超时的确认消息框。 如果用户点击以保持sesion。 在页面中进行虚拟回发,以便会话不会丢失。 您还可以进行回叫,以便用户不会在页面中面对闪光灯。