lunes, 26 de enero de 2009

Session Timeout vs FormsAuthentication Timeout

Muchas veces me preguntan: ¿Cómo hago para aumentar el tiempo de sesión en una aplicación ASP.NET, y evitar que los usuarios vuelvan a la página de login luego de cierto período de inactividad?. Que ya han probado seteando el session timeout en el web.config, setarlo por código, etc. y ASP.NET simplemente ignora esos valores.

Se trata de un tema que ya tiene unos años, pero aún es bastante recurrente y muchas veces confuso. Por ello, he decido postear un poco al respecto.

Para comprenderlo mejor hay que considerar al menos 2 timeout independientes:

  1. Session Timeout
  2. Forms Authentication Timeout

Session Timeout define cuanto tiempo debe durar la cookie de sesión en el cliente. Cada vez que el usuario navega en el sitio se guarda una cookie de sesión, para identificar las solicitudes del cliente. Esto es independiente de si el usuario se autenticó o no. El valor predeterminado es de 20 minutos, pero puede modificarse con el elemento system.web/sessionState en el web.config:

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

Forms Authentication Timeout define cuanto tiempo debe durar la cookie de autenticación en el cliente. Expirada la cookie de authenticación el usuario deberá autenticarse nuevamente. El valor predeterminado es de 30 minutos, pero puede modificarse con el elemento system.web/authentication en el web.config:

<authentication mode="Forms">
      <forms loginUrl="~/Security/Login.aspx" timeout="60" />
</authentication>

Siempre complican estas cosas porque uno confunde la sesión con la autenticación. Son dos cosas independientes. Uno puede crear un sitio basado en Forms Authentication sin usar variables de Session, o viceversa, o combinando ambos (lo más común).

Normalmente, no hay problemas con los valores predeterminados de session y authentication, pero en aplicaciones donde el usuario puede pasarse bastante tiempo leyendo o escribiendo hasta finalmente presionar un link o botón, estos valores predeterminados pueden expirar y entonces necesitaremos aumentarlos.

Finalmente, otro timeout que a veces se quiere ajustar es el executionTimeout del elemento HttpRuntine. Este atributo define el tiempo máximo que puede durar la ejecución de una solicitud. El valor predeterminado es 90 segundos, tiempo suficiente para la mayoría de las aplicaciones. Sin embargo, existen escenarios donde se necesita un tiempo mayor, por ejemplo, para subir archivos de gran tamaño. En estos escenarios, seguramente también habrá que aumentar el atributo maxRequestLength. Pueden leer más sobre el tema en Carga de archivos ASP.NET.

Ahora que hay un poco más de luz en el asunto, pueden continuar investigando y profundizar más sobre estos temas.
Espero que sirva.

Saludos, Gus.

8 comentarios:

Carlos Resendiz dijo...

Saludos, tengo un apregunta y no he conseguido respondermela, ya comprendi que la session y la form autentication son dos cosas distintas, yo utilizo ambas, pero al parecer mis variables de sesion desaparecen despues del tiempo predeterminado, el cual lo coloco del mismo tiempo que la autenticacion, mi pregunta es si hay alguna forma de reinicializar la vida de la variable de sesion, por ejemplo, para la autenticacion utilizo en el web config: slidingExpiration="true"
con lo que cada postback al server se reinicializa el tiempo de vida de la sesion, hay alguna forma de hacer esto con las variables de sesion?? parece como si al pasar los 20 min convenidos se perdieran esas cosas, gracias

.NET en latino dijo...

Hola Carlos. El timeout de Session se extiende automáticamente cada vez que se accede a la Session. Sin embargo, si la sesión se persiste In-Proc (es decir, en la memoria del server) los valores almacenados se pierden cuando:

1. Se reinicia el application pool.
2. Se cambia algún archivo de configuración (web.config o machine.config)
3. Se actualiza algún ensamblado en la carpeta bin.

Puedes enviarme un mail a gustavoazcona@hotmail.com y quizás podamos continuar con el tema.

Mariano Lopez dijo...

Hola Gus como andás, excelente articulo justo me tocó lidiar con este tema, y googleando salió tu post en 3er lugar jajaj,
Che contame como andás que es de tu vida campeon? bueno te mando un abrazo grande,
Mariano López

Carlos Abraham Reséndiz Martínez dijo...

Saludos de nuevo Gustavo, pues he tratado de contactarte a tu mail pero no te localizo, mi mail es f_raptor@hotmail.com , si me agregas me gustaria charlar contigo al respecto de varios temas incluido éste, gracias

Arturo dijo...

Hola Gustavo.

¿Como hago para averiguar por código cual es el timeout de la autenticación?

Saludos

Arturo

Anónimo dijo...

que tal gustavo.
tengo una pregunta, tengo un problema al subir un archivo en mi servidor. estoy usando un sistema bulkCopy para que ni sufra mi equipo pero aparentemente cuando realiza el 50% del volcado de datos a la base, todo el proceso se me cae por time Out. el archivo es pesado pues pesa aproximadamente 90 MG..!!
he intentado subirlo por un c odigo de programacion en lotes utilizando el BatchSize del mismo bulkCopy, pero no he tenido resultado.
hay alguna forma de arreglar estos tiempos de mi web services que estoy usando, o tienes una mejor forma de subir este archivo..

agredecere tu ayuda.

Saludos,
Andres

.NET en latino dijo...

Hola Andres. A ver si esto te sirve. En el web.config existe un elemento httpRuntime que te permite setear los atributos executionTimeOut y maxRequestLength. Esto aplica tanto a las páginas ASP.NET como a los web services tradicionales de ASP.NET. Puedes encontrar una explicación mejor en http://www.desarrollador.org/2006/12/execution-timeout.html. Adicionalmente, también existe un timeout del lado cliente, que en el caso del web service se setea con la propiedad Timeout del webservice. Finalmente, si estás usando web services de WCF, creo que el timeout y el tamaño de bytes a transferir se setean en la configuración del servicio. Espero esto ayude un poco. Saludos.

Unknown dijo...

Hola Gustavo, tengo un problema, estoy publicanco una aplicación web en un hosting, en la cual estoy fijando tanto el timeout de sessionState en 60 minutos como el de authetication mode también en 60 minutos.
Cuando ingreso a través de la página de login accedo a la aplicación pero transcurrido menos de 1 minuto me redirecciona a mi página de login. A que se puede deber esto?

Saludos

Richard