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);
}
sì Ho cercato in questo, mi stavo chiedendo che cosa è il "modo giusto" – cdub
questo in realtà funziona abbastanza bene, thx – cdub
ho aggiunto ' sessionState> 'nel mio file Web.config. Come assegno 'var sessionTimeoutWarnin'? –
SearchForKnowledge