2011-03-14 30 views
5

Comencé a tropezar con errores cuando perdí la sesión o cuando reconstruí mi proyecto, ya que mi cookie de autenticación de formularios aún está activa.ASP.Net MVC 3: ¿Dónde manejar la pérdida de sesión?

En WebForms utilizaría la página maestra asociada con las páginas que requieren iniciar sesión para simplemente verificar la sesión.

¿Cómo podría hacer esto en una ubicación en MVC? Odiaría tener que verificar el estado de la sesión en cada acción de mis controladores.

Por otro lado, tampoco puedo aplicar un filtro global, ya que no todos los controladores requieren el estado de la sesión.

¿Sería posible en mi vista de diseño? Es lo único que las páginas que requieren sesión tienen en común.

Respuesta

2

Una cosa que podría hacer es subclasificar los controladores que sí necesitan estado de sesión. De esta forma, podría crear un filtro solo en este controlador base. Esto te permitiría hacer todo en un solo lugar. Además, como señaló, un filtro global no lo ayudará aquí ya que la lógica no se aplica a todos los controladores.

+0

+1 Parece una buena idea, sin embargo, ¿tiene el controlador un punto central de entrada que pueda registrar? (Para mi controlador base) – Steffen

+0

@Steffen: su objetivo es mantenerlo SECO y solo tener la lógica en su código una vez. De modo que crea un controlador base que hereda de * solo * para aquellos en los que se necesita esta funcionalidad. A continuación, aplica el filtro a la declaración de clase de este controlador para que se ejecute para todos los métodos de acción que el controlador (o cualquiera de sus subclases) ejecute. –

+0

Ya veo, gracias por elaborar :-) – Steffen

2

agrégalo al inicio de la sesión. si ocurre una pérdida de sesión, también debe activar el inicio de una sesión. se puede manejar en ese país de la siguiente manera:

protected void Session_Start(object src, EventArgs e) 
    { 
     if (Context.Session != null) 
     { 
      if (Context.Session.IsNewSession) 
      { 
       string sCookieHeader = Request.Headers["Cookie"]; 
       if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0)) 
       { 
        // how to simulate it ??? 
        // RedirectToAction(“ActionName”, “ControllerName”, route values); 
        Response.Redirect("/Home/TestAction"); 
       } 

      } 
     } 


    } 
0

Estoy de acuerdo con lo que Steve ha mencionado, pero yo sugeriría utilizar filtros globales en lugar de crear una clase base para todos los controladores. La razón de esto es que cada vez que creas un nuevo controlador, siempre debes recordar derivar del controlador base o puedes experimentar comportamientos aleatorios en tu aplicación que pueden llevarte horas de depuración. Esto es especialmente importante cuando detiene el desarrollo por un tiempo y luego vuelve a él.

Además, otra razón es el principio "Favorecer la composición sobre la herencia".