[ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira
Es una pregunta frecuente en los foros de la MSDN y que mejor manera de resolverla que con un ejemplo práctico.
Lo primero que he hecho ha sido crearme una nueva clase a la que añadiré un Extension Methods para la clase Page y así poder utilizarlo como sí de un método más de la clase se tratara:
Helper.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Text;
/// <summary>
/// Helper Class
/// </summary>
public static class Helper
{
/// <summary>
/// Registers the redirect on session end script.
/// </summary>
/// <param name="page">The page.</param>
public static void RegisterRedirectOnSessionEndScript(this Page page)
{
/// Login Page, We can retrieve for configuration file (Web.Config)
string loginPage = "Login.aspx";
/// Session Timeout (Default 20 minutes)
int sessionTimeout = HttpContext.Current.Session.Timeout;
/// Timeout for Redirect to Login Page (10 milliseconds before)
int redirectTimeout = (sessionTimeout * 60000) - 10;
/// JavaScript Code
StringBuilder javascript = new StringBuilder();
javascript.Append("var redirectTimeout;");
javascript.Append("clearTimeout(redirectTimeout);");
javascript.Append(String.Format("setTimeout(\"window.location.href='{0}'\",{1});", loginPage, redirectTimeout));
/// Register JavaScript Code on WebPage
page.ClientScript.RegisterStartupScript(page.GetType(),
"RegisterRedirectOnSessionEndScript",
javascript.ToString(),
true);
}
}
El script básicamente lo que hace es:
Obtener el tiempo en el que expira la sesión del usuario (Session.TimeOut) y pasarlo a milisegundos, le resta 10 milisegundos para que se ejecute el redirect un poquito antes de que expire la sesión, componer el script haciendo uso de las funciones clearTimeout y setTimeout de BLOCKED SCRIPT
clearTimeout(): Resetear el time que hemos iniciado previamente, para que empieze de nuevo.
setTimeout(): Nos permite ejecutar código javascript pasado un tiempo especificado en milisegundos (Una cuenta atrás)
y por último registra el script en la página web.
Ahora sólo falta hacer uso de nuestro nuevo método:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Page_Load(object sender, EventArgs e)
{
Page.RegisterRedirectOnSessionEndScript();
}
}
y esperar (Dependiendo del Timeout que tengas configurado, yo le pongo un minuto para no esperar mucho) a que nos redirija a nuestra página de login (En mi caso Login.aspx)
Editado (Usando una MasterPage por el comentario de Arturo)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class MasterPage : System.Web.UI.MasterPage
{
/// <summary>
/// Handles the Load event of the Page control.
/// </summary>
/// <param name="sender">The source of the event.</param>
/// <param name="e">The <see cref="System.EventArgs"/> instance containing the event data.</param>
protected void Page_Load(object sender, EventArgs e)
{
Page.RegisterRedirectOnSessionEndScript();
}
}
Gracias por el comentario Arturo.
Salu2