[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 JavaScript:

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

10 comentarios en “[ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira”

  1. Hola Luis, muy claro y bueno tu ejemplo. Exactamente tenia esa necesidad. Muchas gracias lo voy a usar.

    Saludos

    PD: ¿Hay alguna manera de que por defecto todas las páginas tengan este comportamiento, sin necesidad de incluir el comando en el load de cada página?. ¿Talvez en el Masterpage?

  2. Hola Luis, muchas gracias por la acotación. Al momento de implementarlo, he tenido unas dudas.

    Yo realizo el logeo de un usuario con timeout variables de acuerdo a las funciones que cada usuario. Mas o menos asi:

    ticket = new FormsAuthenticationTicket(nombre, false, 60);
    encryptedTicket = FormsAuthentication.Encrypt(ticket);
    Response.Cookies.Add(new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket));
    Response.Redirect(FormsAuthentication.GetRedirectUrl(nombre, false));

    Pero cuando veo el valor de:

    HttpContext.Current.Session.Timeout

    siempre dice 20 minutos

    ¿porque no aparece los 60 minutos o X minutos que dura la sesión en la cookie?

    muchas gracias por tu ayuda

  3. Session.Timeout es el tiempo que durarán los datos en sesión para el usuario

    FormsAuthenticationTicket especifica el tiempo máximo en el que usuario estará sin tener que volver a autenticarse en nuestro sistema.

    Sí el Session.Timeout es mas corto que FormsAuthenticationTicket, los datos de sesión del usuario desaparecerán por lo que tendrá que volver a logearse para recuperarlos

    Un saludo

  4. Según tenia entendido, el Session.Timeout se usa este o no este autentificado; y el FormsAuthenticationTicket se usa solo cuando estoy autentificado. Ambos, cada vez que hago una petición al servidor, se renuevan sus duraciones.

    ¿Como puedo averiguar cual es el timeout de mi autenticación?

    Yo dependiendo del tipo de usuario (alumnos, profesores, marketings, etc), le doy diferentes duraciones a sus autentificaciones.

    Muchas gracias por la ayuda

  5. Hola Luis

    Hice una prueba:

    Puse el Sesion.Timeout a 1 minuto en el Web.config:

    Y mi FormsAuthenticationTicket a 60 minutos.

    Me autentifique, deje pasar 5 minutos, hice click en un enlace y seguía estando autentificado. Osea le hizo caso a los 60 minutos del FormsAuthenticationTicket y no le hiso caso a Sesion.Timeout.

    Pareciera que solo importa FormsAuthenticationTicket para que el sistema le vuelva a pedir autentificarse.

    “int sessionTimeout” debería ser igual al TimeOut de FormsAuthenticationTicket

    Saludos

    Arturo

  6. Muchas gracias por tu aporte Luis Ruiz, yo andaba buscando como hacer lo del redireccionamiento de la página cuando la sesion expira, realize lo que indicas y todo funciona a la perfeccion.

  7. Me parece muy interesante el ejemplo que nos brindas. Habrá alguna forma de implementar tu ejemplo pero con C# 2.0, ya que no tengo metodos de extensión aquí… ? No puedo desarrollar en 2008 debido a un requerimiento :(.

    Gracias de antemano.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *