Предупреждение о тайм-ауте сеанса в ASP.NET

У меня есть сайт asp.net, который должен иметь всплывающее/слой/предупреждение, когда сессия достигает своего таймаута (скажем, 10 минут). Всплывающее окно скажет, что сеанс вашей учетной записи будет вызван из-за неактивности и будет кнопка для продолжения сеанса или кнопка для выхода из системы.

Я вижу разные способы сделать это в Интернете, но какой лучший/правильный способ справиться с этим? Должен ли я добавить дополнительный тайм-аут, если всплывающее окно слишком длинное?

Ответ 1

Проверьте эту статью, это содержит все, что вам нужно для вашего требования

Тайм-аут предупреждения в ASP.NET

<script language="javascript" type="text/javascript">
       var sessionTimeoutWarning = 
    "<%= System.Configuration.ConfigurationSettings.AppSettings
    ["SessionWarning"].ToString()%>";
        var sessionTimeout = "<%= Session.Timeout %>";

        var sTimeout = parseInt(sessionTimeoutWarning) * 60 * 1000;
        setTimeout('SessionWarning()', sTimeout);

        function SessionWarning() {
var message = "Your session will expire in another " + 
    (parseInt(sessionTimeout) - parseInt(sessionTimeoutWarning)) + 
    " mins! Please Save the data before the session expires";
alert(message);
        }
</script>

Ответ 2

Это было рассмотрено ранее, например. ASP.NET - Javascript timeOut Предупреждение на основе sessionState timeOut в web.config

Однако AFAIK не является абсолютно надежным способом сделать это, поскольку:

  • Если у пользователя открыто более одного окна с использованием одного и того же сеанса, одно окно может быть более новым, чем другое, а таймауты сеанса клиента в самом старом окне будут устаревшими/неправильными.
  • Если вы отправитесь на сервер, чтобы узнать, что истекает текущее время сеанса, вы его расширите, тем самым победите цель всплывающего окна/предупреждения.

Ответ 3

Ниже приведен JavaScript JavaScript с jQuery, чтобы предупредить пользователя об истечении времени ожидания аутентификации ASP.NET и перенаправить их на страницу входа в систему, если время ожидания достигнуто. Его можно было бы улучшить и адаптировать для тайм-аута сеанса. Он также будет reset тайм-аута аутентификации путем "pinging" сервера всякий раз, когда пользователь взаимодействует со страницей, щелкая, вводя или изменяя размер.

Обратите внимание, что это добавляет нагрузку на сервер, пинговая с каждым щелчком, нажатие клавиши, изменение размера, но это довольно минимально. Тем не менее, если у вас есть много пользователей, которые печатают, вам нужно будет оценить влияние. Я не мог придумать другого способа сделать это, потому что сервер должен быть задействован с тех пор, когда истекает время ожидания.

Также обратите внимание, что тайм-аут не жестко закодирован в 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 = $(
                            "<div style=\"text-align:center; padding:2em; color: black; font-color: black; background-color:white; border:2px solid red; position:absolute; left: 50%; top:50%; width:300px; height:120px; margin-left:-150px; margin-top:-90px\">" +
                                "<span style=\"font-size:1.4em; font-weight:bold;\">INACTIVITY ALERT!</span><br/><br/>" +
                                "You will be automatically logged off.<br/><br/>" +
                                "<span style=\"font-size:1.4em; font-weight:bold;\" id=\"countDown\"></span><br/><br/>" +
                                "Click anywhere on the page to continue working." +
                            "</div>")
                            .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);
    }

Ответ 4

Вам нужно будет использовать технологию клиентской стороны здесь (javascript). Используя, например, вы должны использовать функцию тайм-аута javascript, а затем показывать предупреждение. Если пользователь нажимает "ОК", вам может понадобиться сделать что-нибудь, чтобы сохранить сеанс. Я бы старался использовать метод jquery.ajax и делать звонок на сервер, может быть фиктивным звонком - просто чтобы сохранить сеанс в живых.

Ответ 5

Вы можете использовать jquery и функцию setinterval для записи Ajax за кулисами, чтобы обновить тайм-аут, если использовать скользящее завершение, или получить значение времени для восстановления, записав время начала сеанса и вычитая из истечения времени.

Ответ 6

что вы можете сделать, это использовать некоторые javascript для запуска сообщения. Используйте таймер для пихты через определенный период (период, установленный для сеанса в вашем приложении - через пару минут). После этого периода дайте пользователю сообщение с подтверждением, что сеанс будет отключен. Если пользователь нажимает, чтобы сохранить сеанс. Сделайте фиктивную обратную передачу на странице, чтобы сеанс не был потерян. Вы также можете сделать обратный вызов, чтобы пользователь не сталкивался со вспышкой на странице.