Información general sobre el estado de sesión de ASP.NET

Actualización: noviembre 2007

Use el estado de sesión de ASP.NET para almacenar y recuperar valores para un usuario.

Este tema contiene:

  • Información general

  • Ejemplos de código

  • Referencia de clase

Información general

El estado de sesión de ASP.NET permite almacenar y recuperar valores de un usuario cuando el usuario navega en las páginas ASP.NET de una aplicación web. HTTP es un protocolo sin estado. Esto significa que un servidor web trata cada solicitud HTTP para una página como una solicitud independiente. El servidor no retiene ningún conocimiento de los valores de variables utilizados en las solicitudes anteriores. El estado de sesión de ASP.NET identifica como sesión las solicitudes procedentes del mismo explorador durante un tiempo limitado y proporciona un método para mantener los valores de las variables durante esa sesión. De forma predeterminada, el estado de sesión de ASP.NET se habilita en todas las aplicaciones ASP.NET.

Entre las alternativas al estado de sesión se encuentran las siguientes:

  • Estado de aplicación, que almacena variables a las que pueden tener acceso todos los usuarios de una aplicación ASP.NET.

  • Propiedades de perfil, que conservan los valores de usuario en un almacén de datos sin que expiren.

  • Almacenamiento en caché de ASP.NET, que almacena los valores en memoria disponible para todas las aplicaciones ASP.NET.

  • Estado de vista, que conserva los valores de una página.

  • Cookies.

  • La cadena y los campos de consulta de un formulario HTML que están disponibles desde una solicitud HTTP.

Para obtener una comparación de las diferentes opciones de administración de estados, vea Recomendaciones de administración de estado de ASP.NET.

Variables de sesión

Las variables de sesión se almacenan en un objeto SessionStateItemCollection que se expone a través de la propiedad HttpContext.Session. En una página ASP.NET, las variables de sesión actuales se exponen a través de la propiedad Session del objeto Page.

La colección de las variables de sesión está indizada por el nombre de la variable o por un índice de enteros. Las variables de sesión se crean estableciendo referencias a la variable de sesión por el nombre. No necesita declarar una variable de sesión ni agregarla explícitamente a la colección. En el siguiente ejemplo se muestra cómo se crean las variables de sesión en una página ASP.NET para representar el nombre y el apellido de un usuario y cómo se establecen en valores recuperados de controles TextBox.

Session("FirstName") = FirstNameTextBox.Text
Session("LastName") = LastNameTextBox.Text
Session["FirstName"] = FirstNameTextBox.Text;
Session["LastName"] = LastNameTextBox.Text;

Las variables de sesión pueden ser cualquier tipo .NET Framework válido. El ejemplo siguiente almacena un objeto ArrayList en una variable de sesión denominada StockPicks. El valor devuelto por la variable de sesión StockPicks se debe convertir al tipo adecuado al recuperarlo de SessionStateItemCollection.

' When retrieving an object from session state, cast it to 
' the appropriate type.
Dim stockPicks As ArrayList = CType(Session("StockPicks"), ArrayList)

' Write the modified stock picks list back to session state.
Session("StockPicks") = stockPicks
// When retrieving an object from session state, cast it to 
// the appropriate type.
ArrayList stockPicks = (ArrayList)Session["StockPicks"];

// Write the modified stock picks list back to session state.
Session["StockPicks"] = stockPicks;
Nota:

Al usar un modo de estado de sesión distinto de InProc, el tipo de la variable de sesión debe ser un tipo .NET primitivo o serializable. Esto se debe a que el valor de la variable de sesión se guarda en un almacén de datos externo. Para obtener más información, vea Modos de estado de sesión.

Identificadores de sesión

Las sesiones se identifican mediante un identificador de sesión exclusivo que se puede leer con la propiedad SessionID. Cuando el estado de sesión se habilita en una aplicación ASP.NET, cada solicitud de una página de la aplicación se examina en busca de un valor SessionID enviado desde el explorador. Si no se proporciona ningún valor SessionID, ASP.NET inicia una nueva sesión y el valor SessionID de esa sesión se envía al explorador con la respuesta.

De forma predeterminada, los valores de SessionID se almacenan en una cookie. Sin embargo, también puede configurar la aplicación para almacenar los valores de SessionID en la dirección URL de una sesión "sin cookies".

Una sesión se considera activa siempre que las solicitudes continúen llevándose a cabo con el mismo valor SessionID. Si el tiempo entre las solicitudes de una determinada sesión supera el valor de tiempo de espera especificado en minutos, se considera que la sesión ha expirado. Si se realizan solicitudes con un valor de SessionID que ha expirado, se inicia una nueva sesión.

Nota de seguridad:

Los valores de la propiedad P:System.Web.SessionState.HttpSessionState.SessionID se envían en texto no cifrado a través de una cookie o como parte de la dirección URL. Un usuario malintencionado podría tener acceso a la sesión de otro usuario al obtener el valor de SessionID e incluirlo en solicitudes que se envían al servidor. Si almacena información confidencial en el estado de sesión, se recomienda que use SSL para cifrar cualquier comunicación entre el explorador y el servidor que incluya el valor de SessionID.

Identificadores de sesión sin cookies

De forma predeterminada, el valor de SessionID se almacena en una cookie de sesión sin límite de tiempo en el explorador. Sin embargo, puede especificar que estos identificadores de sesión no se almacenen en una cookie; para ello, establezca el atributo cookieless en true en la sección sessionState del archivo Web.config.

En el ejemplo siguiente se muestra un archivo Web.config que configura una aplicación ASP.NET para que utilice los identificadores de la sesión sin cookies.

<configuration>
  <system.web>
    <sessionState cookieless="true"
      regenerateExpiredSessionId="true" />
  </system.web>
</configuration>

ASP.NET mantiene el estado de sesión sin cookies mediante la inserción automática de un Id. de sesión único en la dirección URL de la página. Por ejemplo, ASP.NET ha modificado la siguiente dirección URL para incluir el id. de sesión único lit3py55t21z5v55vlm25s55:

http://www.example.com/(S(lit3py55t21z5v55vlm25s55))/orderform.aspx

Cuando ASP.NET envía una página al explorador, modifica cualquier vínculo de la página que use una ruta de acceso relativa a la aplicación mediante la incrustación de un valor de identificador de sesión en los vínculos. (Los vínculos con rutas de acceso absolutas no se modifican.) El estado de sesión se mantiene en tanto que el usuario hace clic en los vínculos modificados de esta manera. Sin embargo, si el cliente vuelve a escribir una dirección URL proporcionada por la aplicación, es posible que ASP.NET no pueda resolver el identificador de la sesión y asocie la solicitud a una sesión existente. En este caso, se inicia una nueva sesión para la solicitud.

El Id. de sesión se incrusta en la dirección URL detrás de la barra diagonal que sigue al nombre de la aplicación y delante de cualquier otro identificador de archivo o de directorio virtual. De esta forma, ASP.NET puede resolver el nombre de la aplicación antes de implicar a SessionStateModule en la solicitud.

Nota:

Para mejorar la seguridad de la aplicación, debe permitir que los usuarios cierren la sesión de su aplicación; en ese momento la aplicación debe llamar al método Abandon. De este modo, se reduce la posibilidad de que un usuario malintencionado obtenga el identificador único de la dirección URL y lo use para recuperar los datos privados del usuario almacenados en la sesión.

Volver a generar los identificadores de sesión caducados

De forma predeterminada, los valores del identificador de sesión que se usan en sesiones sin cookies se reciclan. Es decir, si una solicitud se efectúa con un identificador de sesión que ha expirado, se inicia una nueva sesión que usa el valor de SessionID proporcionado con la solicitud. Esto puede producir una sesión compartida de forma involuntaria, si varios exploradores usan un vínculo que contiene un valor de SessionID sin cookies. (Puede suceder si el vínculo se envía a través de un motor de búsqueda, a través de un mensaje de correo electrónico o a través de otro programa.) Puede reducir la posibilidad de que los datos de la sesión se compartan si configura la aplicación para que no recicle los identificadores de sesión. Para ello, establezca el atributo regenerateExpiredSessionId del elemento de configuración sessionState en true. De este modo se generará un nuevo identificador de sesión cuando se efectúe una solicitud de sesión sin cookies mediante un identificador de sesión que ha expirado.

Nota:

Si la solicitud que se realiza con el identificador de sesión que ha expirado se lleva a cabo con el método HTTP POST, los datos expuestos se perderán si regenerateExpiredSessionId es true. Esto se debe a que ASP.NET realiza una redirección para asegurarse de que el explorador tiene el nuevo identificador de sesión en la dirección URL.

Identificadores de sesión personalizados

Puede implementar una clase personalizada para proporcionar y validar los valores de SessionID. Para esto, cree una clase que herede de la clase SessionIDManager e invalide los métodos CreateSessionID y Validate con sus propias implementaciones. Para obtener un ejemplo, vea el ejemplo que se incluye en el método CreateSessionID.

Puede reemplazar la clase SessionIDManager completa mediante la creación de una clase que implemente la interfaz ISessionIDManager. Por ejemplo, puede tener una aplicación Web que asocie un identificador único con páginas que no sean ASP.NET (como imágenes páginas HTML) mediante un filtro ISAPI. Puede implementar una clase SessionIDManager personalizada para utilizar este identificador único con el estado de sesión de ASP.NET. Si la clase personalizada admite identificadores de sesión sin cookies, debe implementar una solución para enviar y recuperar los identificadores de sesión de la dirección URL.

Modos de sesión

El estado de sesión de ASP.NET es compatible con distintas opciones de almacenamiento de las variables de sesión. Cada opción se identifica como un tipo de Mode del estado de sesión. El comportamiento predeterminado consiste en almacenar las variables de sesión en el espacio de memoria del proceso de trabajo de ASP.NET. Sin embargo, también puede especificar que el estado de sesión se debe almacenar en un proceso diferente, en una base de datos de SQL Server o en un origen de datos personalizado. Si no desea que el estado de sesión esté habilitado en su aplicación, puede establecer el modo de sesión en Off.

Para obtener más información, vea Modos de estado de sesión.

Eventos de sesión

ASP.NET proporciona dos eventos que le ayudan a administrar las sesiones de usuario. El evento Session_OnStart se provoca cuando se inicia una nueva sesión y el evento Session_OnEnd cuando una sesión se abandona o expira. Los eventos de sesión se especifican en el archivo Global.asax de una aplicación ASP.NET.

El evento Session_OnEnd no se admite si la propiedad Mode de la sesión se establece en un valor distinto de InProc, que es el modo predeterminado.

Nota:

Si se modifica el archivo Global.asax o el archivo Web.config de una aplicación ASP.NET, se reiniciará la aplicación y se perderá cualquier valor almacenado en el estado de la aplicación o en el estado de sesión. Tenga en cuenta que algunos programas antivirus pueden actualizar la fecha y la hora de la última modificación del archivo Global.asax o Web.config de una aplicación.

Para obtener más información, vea Eventos de estado de sesión.

Configurar el estado de sesión

El estado de sesión se configura mediante el elemento sessionState de la sección de configuración de system.web. También puede configurar el estado de sesión mediante el valor de EnableSessionState en la directiva @ Page.

El elemento sessionState permite especificar las opciones siguientes:

  • El modo en que la sesión almacenará los datos.

  • La manera en que los valores de identificador de sesión se envían entre el cliente y el servidor.

  • El valor de Timeout de la sesión.

  • Los tipos que se admiten se basan en la configuración de Mode de la sesión.

El ejemplo siguiente muestra un elemento sessionState que configura una aplicación para el modo de sesión SQLServer. Establece el valor Timeout en 30 minutos y especifica que los identificadores de sesión se almacenan en la dirección URL.

<sessionState mode="SQLServer"
  cookieless="true "
  regenerateExpiredSessionId="true "
  timeout="30"
  sqlConnectionString="Data Source=MySqlServer;Integrated Security=SSPI;"
  stateNetworkTimeout="30"/>

Puede deshabilitar el estado de sesión en una aplicación estableciendo el modo de estado de sesión en Off. Si desea deshabilitar el estado de sesión solamente en una determinada página de una aplicación, puede establecer el valor de EnableSessionState en la directiva @ Page en false. El valor EnableSessionState también se puede establecer en ReadOnly para proporcionar acceso de sólo lectura a las variables de sesión.

Solicitudes simultáneas y estado de sesión

El acceso al estado de sesión de ASP.NET es exclusivo para cada sesión, lo que significa que si dos usuarios diferentes realizan solicitudes simultáneas, se concederá simultáneamente acceso a dos sesiones diferentes. Sin embargo, si se crean dos solicitudes simultáneas para la misma sesión (con el mismo valor de SessionID ), la primera solicitud obtiene el acceso exclusivo a la información de la sesión. La segunda solicitud sólo se ejecuta una vez finalizada la primera. (La segunda sesión también puede obtener acceso si se libera el bloqueo exclusivo de la información porque la primera solicitud supera el tiempo de espera del bloqueo.) Si el valor de EnableSessionState de la directiva @ Page se establece en ReadOnly, una solicitud de la información de sesión de sólo lectura no produce un bloqueo exclusivo de los datos de la sesión. Sin embargo, es posible que las solicitudes de sólo lectura de los datos de sesión aún tengan que esperar a que se libere el bloqueo existente en una solicitud de lectura y escritura para los datos de la sesión.

Volver al principio

Ejemplos de código

Cómo: Guardar valores en un estado de sesión

Cómo: Leer los valores de un estado de sesión

Implementar un proveedor de almacén de estados de sesión

Volver al principio

Referencia de clase

La tabla siguiente enumera las clases clave que se relacionan con el estado de sesión incluidas en el espacio de nombres System.Web.SessionState.

Miembro

Descripción

SessionIDManager

Administra los identificadores únicos para el estado de sesión de ASP.NET.

SessionStateItemCollection

Se usa para almacenar las variables de estado de sesión.

Volver al principio

Vea también

Conceptos

Implementar un proveedor de almacén de estados de sesión