[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

Published 28/5/2009 15:07 por Luis Ruiz Pavón
Comparte este post:
http://geeks.ms/blogs/lruiz/archive/2009/05/28/asp-net-redireccionar-al-usuario-a-la-p-225-gina-de-login-cuando-su-sesi-243-n-expira.aspx

Comentarios

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

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?

Thursday, May 28, 2009 5:09 PM por Arturo

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

He editado el post y he puesto un ejemplo usando el Page_Load de la MasterPage.

Salu2

Thursday, May 28, 2009 5:45 PM por Luis Ruiz Pavón

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

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

Thursday, May 28, 2009 8:54 PM por Arturo

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

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

Thursday, May 28, 2009 10:48 PM por Luis Ruiz Pavón

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

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

Saturday, May 30, 2009 9:23 AM por Arturo

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

Hola Luis

Hice una prueba:

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

<sessionState mode="InProc" timeout="1" />

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

Saturday, May 30, 2009 9:35 AM por Arturo

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

Es que no tiene nada que ver una cosa con la otra, en mi comentario anterior te expliqué el comportamiento de cada uno.

Salu2

Saturday, May 30, 2009 10:33 AM por Luis Ruiz Pavón

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

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.

Wednesday, May 26, 2010 6:09 PM por susy

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

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.

Thursday, July 1, 2010 11:36 PM por Renzo

# re: [ASP.NET] Redireccionar al usuario a la página de login cuando su sesión expira

muy buen aporte.  Recien estoy entrando al .net, como podria utilizar esta funcionalidad utilizando net.vb

Friday, July 15, 2011 5:50 PM por Luis Uribe