J'utilise quelques scripts JavaScript dans mon MasterPage pour rediriger l'utilisateur (après une demande de renouvellement de la session) à l'action de fermeture de session. Il utilise une demande AJAX à la page d'accueil de l'application pour actualiser la fenêtre de session côté serveur lorsque l'utilisateur clique sur le bouton dans la boîte de dialogue pour étendre la session. Se base sur jQuery et jQuery UI pour la boîte de dialogue.
<% if (this.Request.IsAuthenticated)
{
int sessionDialogWait = 2 * 60 * 1000 - 60 * 500; // ms = 1.5 minutes
int sessionTimeout = 28 * 60 * 1000; // ms = 28 minutes
if (ViewData["sessionTimeout"] != null)
{
sessionTimeout = ((int)ViewData["sessionTimeout"] * 60 - 120) * 1000;
}
%>
<script type="text/javascript">
var logoutTimer = null;
var sessionTimer = null;
var sessionTimeout = Number('<%= sessionTimeout %>');
var sessionDialogWait = Number('<%= sessionDialogWait %>');
$(document).ready(function() {
$('#sessionEndDialog').dialog({
autoOpen: false,
bgiframe: true,
modal: true,
buttons: {
OK: function() {
$(this).dialog('close');
$.get('<%= Url.Action("About", "Home") %>', scheduleSessionPrompt, 'html');
},
Logout: logoutOnSessionExpires
}
}).ajaxStart(function() { scheduleSessionPrompt(); });
scheduleSessionPrompt();
});
function scheduleSessionPrompt()
{
if (logoutTimer) clearTimeout(logoutTimer);
if (sessionTimer) clearTimeout(sessionTimer);
sessionTimer = setTimeout(sessionExpiring, sessionTimeout );
}
function sessionExpiring()
{
logoutTimer = setTimeout(logoutOnSessionExpires, sessionDialogWait);
$('#sessionEndDialog').dialog('open');
}
function logoutOnSessionExpires()
{
window.location.href = '<%= Url.Action("Logout", "Account") %>';
}
</script>
<% } %>
<div id="sessionEndDialog" title="Session Expiring" style="display: none;">
<p>Your session is about to expire. Click OK to renew your session or Logout to logout of the application.</p>
</div>
Le paramètre Session_End dans Global.asax peut-il être utilisé pour cela? –
Je ne vois pas comment vous redirigeriez le navigateur vers une page différente de l'événement Session_End à moins que le navigateur vérifie périodiquement si la session est active. Malheureusement, si le navigateur fait cela, la session sera maintenue artificiellement car elle sera mise à jour à chaque requête. Je travaille à transformer ceci en un plugin jQuery. – tvanfosson
Corrigez-moi si je me trompe mais Session_End s'exécute dans un thread d'arrière-plan et ne peut donc pas communiquer avec l'utilisateur. aimez votre travail tvanfosson, votre approche fonctionne très bien – CodeKiwi