2012-05-09 22 views
10

Ho un sito asp.net in cui è necessario che venga visualizzato un popup/layer/alert quando la sessione raggiunge il timeout (diciamo 10 minuti). Il popup dirà che la sessione del tuo account sarà espirata per inattività e con un pulsante per la sessione continua o un pulsante per il logout.Avviso di timeout di sessione in ASP.NET

Vedo diversi modi per farlo online, ma qual è il modo migliore/corretto per gestirlo? Devo inserire un timeout aggiuntivo se il popup è aperto troppo a lungo?

risposta

20

Controllare questo articolo, questo contiene tutte le cose che avete bisogno per il vostro requisito

Alert Session Time out 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> 
+0

sì Ho cercato in questo, mi stavo chiedendo che cosa è il "modo giusto" – cdub

+0

questo in realtà funziona abbastanza bene, thx – cdub

+0

ho aggiunto ' 'nel mio file Web.config. Come assegno 'var sessionTimeoutWarnin'? – SearchForKnowledge

3

Questo è stato affrontato prima, ad esempio, ASP.NET - Javascript timeOut Warning based on sessionState timeOut in web.config

Tuttavia, per quanto ne so non c'è un modo totalmente affidabile per fare questo, dal momento che:

  • Se l'utente ha più di una finestra aperta con la stessa sessione, quindi una finestra può essere più recente rispetto all'altro e il timeout della sessione del client sulla finestra più vecchia sarebbe stantio/errato.
  • Se si effettua il round trip sul server per vedere qual è la scadenza corrente della sessione, la si estenderà, vanificando quindi lo scopo del popup/alert.
+0

Puoi dirmi, come avvisare l'utente per il timeout della sessione in MVC 4? Inoltre non sto usando l'autenticazione dei moduli. È possibile senza l'autenticazione di moduli? –

0

Dovrai utilizzare la tecnologia lato client qui (javascript). Usando, ad esempio, si utilizzerà la funzione di timeout javascript e quindi si visualizza l'avviso. Se l'utente fa clic su OK, è necessario fare qualcosa per mantenere viva la sessione. Vorrei usare il metodo jquery.ajax e fare una chiamata al server, può essere una chiamata fittizia, solo per mantenere viva la sessione.

0

Si potrebbe jquery e la funzione setinterval per eseguire un post Ajax dietro le quinte per aggiornare il timeout, se si utilizza la scadenza scorrevole, o ottenere il valore del tempo rimanente registrando l'ora di inizio della sessione e sottraendo dal tempo di scadenza.

0

quello che puoi fare è usare un po 'di javascript per sparare il messaggio. Utilizzare un timer per attivare dopo un certo periodo (periodo impostato per il timeout della sessione nell'applicazione - un paio di minuti) Dopo tale periodo, fornire all'utente una finestra di messaggio di conferma per il timeout della sessione. Se l'utente fa clic per mantenere la sessione. Crea un postback fittizio nella pagina in modo che la sessione non vada persa. È anche possibile effettuare una richiamata in modo che l'utente non sia rivolto verso la pagina.

1

Di seguito alcuni JavaScript con jQuery per avvisare l'utente del timeout di autenticazione dei moduli ASP.NET e li reindirizzano alla pagina di accesso se viene raggiunto il timeout. Potrebbe essere migliorato e adattato anche per il timeout della sessione. Inoltre, ripristina il timeout di autenticazione eseguendo il "ping" del server ogni volta che l'utente interagisce con la pagina facendo clic, digitando o ridimensionando.

Si noti che questo aggiunge carico al server eseguendo il ping con ogni clic, pressione del tasto, ridimensionamento ma è piuttosto minimale. Tuttavia, se molti utenti digitano via dovrai valutare l'impatto. Non riesco a pensare a un altro modo per farlo perché il server deve essere coinvolto dal momento che è in scadenza il timeout.

Si noti inoltre che il timeout non è codificato nel JS. Ottiene il timeout dal server, quindi è sufficiente mantenerlo in un posto in 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); 

Chiamate sopra una volta quando il caricamento della pagina:

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

Sul server, avrete bisogno di un'azione che restituisce il tempo rimanente. Potresti aggiungere ulteriori informazioni.

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