it-swarm.com.de

Sitzungszeitlimitwarnung in ASP.NET

Ich habe eine asp.net-Seite, auf der ein Popup/eine Schicht/eine Warnung angezeigt werden muss, wenn die Sitzung das Zeitlimit erreicht (10 Minuten). Das Popup-Fenster zeigt an, dass Ihre Kontositzung aufgrund von Inaktivität angezeigt wird und über eine Schaltfläche für die Fortsetzung der Sitzung oder eine Schaltfläche für das Abmelden verfügt.

Ich sehe verschiedene Möglichkeiten, dies online zu tun, aber was ist der beste/richtige Weg, um damit umzugehen? Muss ich ein zusätzliches Timeout setzen, wenn das Popup zu lange geöffnet ist?

13
cdub

Überprüfen Sie diesen Artikel, dieser enthält alle Dinge, die Sie für Ihre Anforderung benötigen 

Timeout für Warnungssitzungen in 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>
23
Pranay Rana

Dies wurde zuvor angesprochen, z. B. ASP.NET - Javascript timeOut Warnung basierend auf sessionState timeOut in web.config

AFAIK gibt es jedoch nicht absolut zuverlässig, da:

  • Wenn der Benutzer mehr als ein Fenster mit derselben Sitzung geöffnet hat, ist ein Fenster möglicherweise aktueller als das andere, und die Zeitüberschreitungen der Clientsitzung für das älteste Fenster wären veraltet/falsch.
  • Wenn Sie einen Rundgang zum Server durchführen, um zu sehen, wie der aktuelle Sitzungsablauf abläuft, verlängern Sie ihn, wodurch der Zweck des Popups/der Warnung missachtet wird.
4
StuartLC

Ich habe mir den Artikel aus dem post von Pranay Rana angesehen, und ich mag die allgemeine Idee, aber der Code könnte eine Rationalisierung erfordern. Hier ist meine Version. Für Tablet/Mobile-Probleme siehe unten:

<script language="javascript" type="text/javascript">
    var minutesForWarning = 4;
    var sessionTimeout = parseInt("@Session.Timeout"); // razor syntax, otherwise use <%= Session.Timeout %>
    var showWarning = true;

    function SessionWarning() {
        showWarning = false;
        alert("Your session will expire in " + minutesForWarning + " mins! Please refresh page to continue working.");
        // leave a second for redirection fct to be called if expired in the meantime
        setTimeout(function () { showWarning = true; }, 1000);
    }

    function RedirectToWelcomePage() {
        if (showWarning)
            alert("Session expired. You will be redirected to welcome page.");
        document.getElementById('logoutForm').submit();
        // window.location = "../Welcome.aspx"; // alternatively use window.location to change page
    }

    setTimeout('SessionWarning()', (sessionTimeout - minutesForWarning) * 60 * 1000);
    setTimeout('RedirectToWelcomePage()', sessionTimeout * 60 * 1000);
</script>

Auf Tablets oder Mobiltelefonen können Sie mit setTimeout nicht rechnen, da die Ausführung von Javascript angehalten wird, wenn das Gerät gesperrt ist oder der Browser inaktiv ist. Stattdessen überprüfe ich regelmäßig (in meinem Fall schätze ich alle 10s genug):

<script language="javascript" type="text/javascript">
    function addMinutes(date, minutes) {
        return new Date(date.getTime() + minutes * 60 * 1000);
    }
    function remainingMinutes(date) {
        return Math.round((date - (new Date()).getTime()) / 60 / 1000);
    }

    var minutesForWarning = 5;
    var sessionTimeout = parseInt("@Session.Timeout");
    var showWarning = true;
    var showRedirect = true;
    var timeToWarn = addMinutes(new Date(), sessionTimeout - minutesForWarning);
    var timeToEnd = addMinutes(new Date(), sessionTimeout);

    function CheckTime() {
        if (showWarning && new Date() > timeToWarn && new Date() < timeToEnd) {
            showRedirect = false;
            showWarning = false;
            alert("Your session will expire in " + remainingMinutes(timeToEnd)) + " mins! Please refresh page to continue working.");
        }
        if (new Date() > timeToEnd) {
            if (showRedirect)
                alert("Session expired. You will be redirected to welcome page ");
            document.getElementById('logoutForm').submit();
            // window.location = "../Welcome.aspx"; // alternatively use window.location to change page
        }
        if (showRedirect == false)
            showRedirect = true;
    }

    setInterval(CheckTime, 10000);

</script>
1
Damian Vogel

Im Folgenden finden Sie JavaScript mit jQuery, um den Benutzer über das Timeout der ASP.NET Forms-Authentifizierung zu warnen und leitet sie zur Anmeldeseite weiter, wenn das Timeout erreicht wird. Es könnte auch verbessert und für das Timeout der Sitzung angepasst werden. Außerdem wird das Authentifizierungszeitlimit zurückgesetzt, indem der Server bei jeder Interaktion des Benutzers mit der Seite durch Anklicken, Eingeben oder Ändern der Größe des Pings "ping" wird. 

Beachten Sie, dass der Server dadurch belastet wird, indem er bei jedem Klicken, Tastendruck und Ändern der Größe ping, aber es ist ziemlich minimal. Wenn Sie jedoch viele Benutzer eingeben, müssen Sie die Auswirkungen bewerten. Ich habe keine andere Möglichkeit, dies zu tun, da der Server involviert sein muss, da hier das Timeout abläuft. 

Beachten Sie auch, dass das Timeout im JS nicht fest codiert ist. Das Timeout wird vom Server abgerufen, sodass Sie ihn nur an einer Stelle in Web.config verwalten müssen.

(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);

Rufen Sie einfach die oben genannten Informationen einmal beim Laden Ihrer Seite auf:

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

Auf dem Server benötigen Sie eine Aktion, die die verbleibende Zeit zurückgibt. Sie können auch weitere Informationen hinzufügen.

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

Sie müssen hier clientseitige Technologie (Javascript) verwenden. Wenn Sie beispielsweise JavaScript-Timeout verwenden, wird die Warnung angezeigt. Wenn der Benutzer auf OK klickt, müssen Sie etwas tun, um die Sitzung am Leben zu erhalten. Ich würde empfehlen, die Methode jquery.ajax zu verwenden, und den Server anzurufen, kann ein Dummy-Aufruf sein - nur um die Sitzung am Leben zu erhalten.

0
Joseph Caruana

Sie können jquery und die setinterval-Funktion verwenden, um einen Ajax-Beitrag hinter den Kulissen auszuführen, um das Zeitlimit zu aktualisieren, wenn Sie gleitendes Ablaufdatum verwenden, oder den Zeitwert zu ermitteln, indem Sie die Sitzungsstartzeit aufzeichnen und von dem Ablaufzeitpunkt abziehen.

0
Chev

was Sie tun können, ist Javascript zu verwenden, um die Nachricht auszulösen. Verwenden Sie einen Timer, um nach einem bestimmten Zeitraum zu starten (Zeitraum, der in Ihrer Anwendung für das Zeitlimit für Sitzungen festgelegt wurde - einige Minuten). Geben Sie dem Benutzer nach Ablauf dieses Zeitraums ein Bestätigungsfeld für das Zeitlimit der Sitzung an. Wenn der Benutzer klickt, um die Sitzung beizubehalten. Erstellen Sie ein Dummy-Postback auf der Seite, damit die Sitzung nicht verloren geht. Sie können auch einen Rückruf tätigen, damit der Benutzer auf der Seite keinen Blitz sieht.

0
UTHIRASAMY