¿Cómo configuro explícitamente las sesiones de asp.net para que SÓLO caduquen al cerrar el navegador o iniciar sesión explícitamente?

StackOverflow https://stackoverflow.com/questions/93888

  •  01-07-2019
  •  | 
  •  

Pregunta

De forma predeterminada, la expiración de la sesión parece ser de 20 minutos.

Actualizar:No quiero que la sesión caduque hasta que se cierre el navegador.

Actualización 2:Este es mi escenario.El usuario inicia sesión en el sitio.Juega por el sitio.Deja la computadora para ir a ducharse (>20 minutos;)).Vuelve a la computadora y debería poder jugar.Cierra el navegador, lo que elimina la cookie de sesión.La próxima vez que acceda al sitio desde una nueva instancia del navegador, deberá iniciar sesión nuevamente.

En PHP puedo configurar session.cookie_lifetime en php.ini en cero para lograr esto.

¿Fue útil?

Solución

Si desea extender la sesión más allá de los 20 minutos, cambie el valor predeterminado usando el administrador de IIS o puede configurarlo en el archivo web.config.Por ejemplo, para establecer el tiempo de espera en 60 minutos en web.config:

<configuration>
  <system.web>
    <sessionState timeout="60" />
    ... other elements omitted ...
  </system.web>
  ... other elements omitted ....
</configuration>

Puedes hacer lo mismo para un usuario en particular en código con:

Session.Timeout = 60

Cualquiera que sea el método que elija, puede cambiar el tiempo de espera a cualquier valor que considere razonable para permitir a sus usuarios hacer otras cosas y aún mantener su sesión.

Por supuesto, hay desventajas:para el usuario, existe el posible problema de seguridad de dejar su navegador desatendido y seguir conectado cuando alguien más comienza a utilizarlo.Para usted, existe el problema del uso de la memoria en el servidor: cuanto más duren las sesiones, más memoria utilizará en un momento dado.Si eso importa o no depende de la carga de su servidor.

Si no desea estimar un tiempo de espera prolongado razonable, deberá utilizar una de las otras técnicas ya sugeridas, que requieren que se ejecute algo de JavaScript en el navegador para hacer ping al servidor periódicamente y/o abandonar la sesión cuando se descarga una página. (siempre que el usuario no vaya a otra página de su sitio, por supuesto).

Otros consejos

Puede establecer un tiempo de espera breve (por ejemplo, 5 minutos) y luego hacer que la página sondee el servidor periódicamente, ya sea usando Javascript para activar una XmlHttpRequest cada 2 minutos o teniendo un iframe oculto que apunte a una página que se actualiza cada 2 minutos.

Una vez que se cierra el navegador, la sesión expirará bastante rápido ya que no habrá nada que la mantenga viva.

Este no es un problema nuevo, hay varios escenarios que deben manejarse si desea captar todas las formas en que puede finalizar una sesión, aquí hay ejemplos generales de algunos de ellos:

  1. La instancia o pestaña del navegador está cerrada.
  2. El usuario sale de su sitio web utilizando la misma instancia o pestaña del navegador.
  3. Los usuarios pierden su conexión a Internet (esto podría incluir una pérdida de energía en la computadora del usuario o cualquier otro medio).
  4. El usuario se aleja de la computadora (o de alguna otra manera deja de interactuar con su sitio).
  5. El servidor pierde energía/se reinicia.

Los primeros dos elementos deben ser manejados por el cliente que envía información al servidor; generalmente usaría javascript para navegar a una página de cierre de sesión que caduca rápidamente la sesión.

Los elementos tercero y cuarto normalmente se manejan estableciendo el tiempo de espera del estado de la sesión (puede ser cualquier cantidad de tiempo).La cantidad de tiempo que utiliza se basa en encontrar un valor que permita a los usuarios utilizar su sitio sin sobrecargar el servidor.Una regla general muy aproximada podría ser 30 minutos más o menos 10 minutos.Sin embargo, el valor apropiado probablemente tendría que ser tema de otra publicación.

El quinto elemento se maneja según cómo almacena sus sesiones.Las sesiones almacenadas en el estado no sobrevivirán a un reinicio ya que están en la memoria RAM de la computadora.Las sesiones almacenadas en una base de datos o una cookie sobrevivirían al reinicio.Podrías manejar esto como mejor te parezca.

En mi experiencia limitada, cuando este problema ha surgido antes, se ha determinado que todo lo que se necesita es establecer el tiempo de espera de la sesión en un valor aceptable.Sin embargo se puede hacer.

Esto es predeterminado.Cuando tienes una sesión, almacena la sesión en una "Cookie de sesión", que se elimina automáticamente cuando se cierra el navegador.

Si desea tener la sesión entre 2 sesiones del navegador, debe configurar la Cookie.Expired en una fecha en la función.

Debido a que la sesión de la que habla la almacena el servidor y no el cliente, no puede hacer lo que quiera.

Pero considere no utilizar la sesión del lado del servidor ASP.NET y, en su lugar, confíe únicamente en las cookies.

Desafortunadamente, debido a la naturaleza explícita de la web y al hecho de que no existe un vínculo permanente entre el servidor de un sitio web y el navegador de un usuario, es imposible saber cuándo un usuario ha cerrado su navegador.Hay eventos y JavaScript que puedes implementar (p. ej.onunload) que puede utilizar para realizar llamadas al servidor, lo que a su vez podría "matar" una sesión. Session.Abandon();

Puede establecer la duración del tiempo de espera de una sesión dentro de web.config; recuerde que este tiempo de espera se basa en el tiempo transcurrido desde que el navegador del usuario realizó la última llamada al servidor.

No se agregó el tiempo de espera del navegador.

No hay forma de borrar explícitamente la sesión si no se comunica de alguna manera entre el cliente y el servidor en el momento de cerrar la ventana, por lo que esperaría enviar una solicitud URI especial para borrar la sesión en el momento de recibir una ventana. cerrar mensaje.

Mi Javascript no es lo suficientemente bueno como para darte las instrucciones reales para hacerlo;Lo siento :(

No puede, ya que no puede controlar cómo responde el cliente html.

En realidad, ¿por qué necesitas hacerlo?Siempre que nadie pueda retomar la sesión para usarla nuevamente, caducará después de esos 20 minutos.Si los recursos son importantes, establezca una caducidad de sesión más agresiva (la mayoría de las empresas de alojamiento lo hacen, lo cual es terriblemente molesto) o use menos objetos en la sesión.Trate de evitar cualquier tipo de objeto, en su lugar simplemente almacene las claves para recuperarlas, ese es un diseño muy importante ya que le ayuda a escalar su sesión a un servidor estatal cuando crezca.

Corríjame si estoy malinterpretando la intención de su pregunta, pero la pregunta subyacente parece ser menos sobre cómo forzar el final de la sesión cuando un usuario cierra el navegador y más sobre cómo evitar que una sesión finalice hasta que se cierre el navegador.

Creo que la verdadera respuesta a esto es reevaluar para qué estás utilizando las sesiones.Si los está utilizando para mantener el estado, estoy de acuerdo con las otras respuestas en que es posible que no tenga suerte.

Sin embargo, un enfoque preferido es utilizar un mecanismo de estado persistente con el mismo alcance que la sesión del navegador, como una cookie que caduca cuando se cierra el navegador.Esa cookie podría contener información suficiente para reiniciar la sesión en el servidor si ha caducado desde la última solicitud.Combinado con un tiempo de espera de sesión relativamente corto (5-10 minutos), creo que esto le brinda el mejor equilibrio entre el uso de recursos del servidor y no hacer que el usuario "reinicie" continuamente el sitio.

Oh, has reescrito la pregunta.

Ése es absolutamente factible, siempre que javascript esté vivo.Utilice cualquier ajax cronometrado.Consulte con la biblioteca de prototipos http://www.prototypejs.org PeriodicalExecutor o jQuery con el complemento ajax + timer.Configure una página ficticia a la que su ejecutor llamará de vez en cuando, para que su sesión esté siempre activa a menos que cierre sesión (elimine el temporizador ajax al mismo tiempo) o cierre el navegador (lo que significa que el ejecutor muere de todos modos)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top