Controlar sesiones de usuario expiradas mediante un atributo en ASP.NET MVC

Manejar datos en una sesión de usuario es una de las tareas mas comunes que tenemos nosotros los desarrolladores en nuestras aplicaciones web a diario. Normalmente cuando un usuario ingresa a un sistema mediante autenticación, se mantiene una información cargada en la sesión que podemos usar posteriormente en otras partes del sistema. El problema viene cuando la sesión de usuario expira y ya no tenemos disponible la información que necesitamos, por lo que se hace necesario controlar este comportamiento para verificar si una sesión expiró y prevenir que se puedan presentar errores al usuario.

Una forma muy fácil de controlar esto en una aplicación ASP.NET MVC, es mediante la implementación de un filter attribute que controle si la sesión es nula, y en tal caso evite que el usuario siga en la página actual y en vez de eso sea redirigido de nuevo a la página de ingreso de nuestra aplicación para que vuelva a iniciarse la sesión. Para implementar este atributo, debemos crear una clase que herede de la clase ActionFilterAttribute y sobreescriba el método OnActionExecuting, como vemos a continuación:

public class SessionExpireFilterAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // Validar la información que se encuentra en la sesión.
        if (HttpContext.Current.Session["User"] == null)
        {
            // Si la información es nula, redireccionar a 
            // página de error u otra página deseada.
            filterContext.Result = new RedirectToRouteResult(
                new RouteValueDictionary {
                    { "Controller""Home" },
                    { "Action""TimeoutRedirect" }
            });
        }
 
        base.OnActionExecuting(filterContext);
    }       
}

Una vez implementada la clase, podemos elegir el alcance para aplicarla a nuestra aplicación web. Cabe recordar que con los filters en ASP.NET MVC tenemos tres opciones:

La primera opción es incluirlo el atributo como un filtro global que se va a ejecutar siempre en cualquier parte del sistema donde sea invocada una acción de un controlador. Para hacer esto, lo que hacemos es modificar el archivo FilterConfig.cs de nuestra aplicación ASP.NET MVC para incluir el filtro creado de la siguiente forma:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {            
        filters.Add(new SessionExpireFilterAttribute());
    }
}

La segunda opción es aplicar el filtro a todas las acciones de un controlador específico que seleccionemos. Para esto basta con incluir el atributo en la clase Controller de la siguiente forma:

[SessionExpireFilter// Aplicar filtro a todo el controlador
public class ItemController : Controller
{
    public ActionResult Index()
    {
        return View();
    }        
}

La tercera y última opción es aplicar el filtro en acciones específicas que marcamos con el atributo creado de forma similar a como lo podemos hacer con un controlador visto en la opción anterior.

public class ItemController : Controller
{
    [SessionExpireFilter// Aplicar filtro solo a esta acción
    public ActionResult Index()
    {
        return View();
    }        
}

Como vemos, es muy sencillo definir el alcance que queremos dar a nuestro atributo creado de acuerdo a las necesidades de nuestro proyecto. Es todo por el momento, espero que les sea útil. No dudes en escribir cualquier inquietud o comentario sobre el tema.

Anuncios

4 Responses to Controlar sesiones de usuario expiradas mediante un atributo en ASP.NET MVC

  1. marcelexis says:

    Hola Estimado, primero que todo agradecerte por el post
    Seguí paso a paso y me quede con la segunda opción. Esto porque la primera me dejaba la pagina en blanco y debe ser porque iba a buscar las variables de sesión antes de logearse y no las encontraba. Bueno paso a contarte mi problema, todo funciona bien salvo que el redireccionamiento no lo hace de inmediato. Tengo que refrescar la pagina y de esta forma se hace efectivo. Esto es normal o es algo que estoy haciendo mal.
    Saludos

    • hgr says:

      Hola Marcel.

      Es posible que la primera vez no haga una redirección porque aun tiene los datos del usuario. Si sigues con duda, comparte tu código para darle un vistazo.

      Saludos.

  2. steventorres says:

    Hola amigo, hice todo lo que indicaste pero me lo que necesito exactamente es que cuando la sesión caduque me muestre un mensaje y automáticamente me mande al inicio de sesión.

  3. steventorres says:

    Hola amigo, lo que necesito exactamente es que cuando la sesion expire me muestre un mensaje de que la sesion ha terminado y automaticamente me mande al inicio de sesion.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: