Cómo auditar cuando un usuario abandona una aplicación ASP.NET

En ASP.NET, estoy buscando una forma de auditar a un usuario que deja mi aplicación. Para ser específico, me gustaría insertar un registro de "cierre de sesión" en una tabla de auditoría en SQL Server cuando la sesión del usuario se abandona/destruye por cualquier motivo (no necesariamente debido a una llamada a session.abandon)

Tengo una clase 'SessionHelper' que gestiona los setters/getters de sesión.

Intenté publicar en Session_End en Global.asax, pero nunca se activó este evento incluso después de que expirara el tiempo de espera.

Intenté sobreescribir 'finalizar' en la clase SessionHelper y hacerlo allí cuando se destruye la clase, pero tampoco desencadenó ese evento.

Intentaría implementar IDisposable en SessionHelper, pero no sé a dónde llamar para que siempre se llame.

¿Cuál es la forma correcta de auditar a un usuario que abandona su aplicación ASP.NET?

¡Gracias!

2

3 Respuestas

El evento Session_End solo se activa si tiene sesiones InProc. La administración de la sesión del servidor SQL o State no activará este evento. Si puede, regrese a las sesiones de InProc y use este evento.

Aparte de eso, no obtendrás muy buenas soluciones. ASP.NET no ofrece una manera de ver la lista actual de sesiones en el servidor (al menos, no hay forma de que los usuarios de StackOverflow lo sepan, ya que ya hice la pregunta), por lo que no puede usar un trabajo para verificar cuando son destruidos

La siguiente mejor opción sería tener un "último tiempo de acceso" almacenado en algún lugar para sus usuarios y usarlo para detectar un tiempo de espera de la sesión. Sin embargo, la implementación de dicho trabajo es complicada (se pueden perder los eventos de cierre de sesión si un usuario inicia o cierra sesión rápidamente, por ejemplo) ...

Entonces no hay una solución perfecta aquí.

2
agregado

Tenga en cuenta la "forma correcta", pero así es como lo hice en el pasado.

Tener una marca de fecha y hora "activa" asociada con el registro del usuario en la base de datos. Cada vez que el usuario accede a una página, se actualiza a la hora actual. Si alguien no ha accedido a la página en, por ejemplo, 15 minutos, ese usuario se registra como un evento de "cierre de sesión" y la marca de tiempo se establece en NULO.

2
agregado
Hago algo similar, utilizo el manejo de sesión basado en sql y tengo una última columna visitada en la tabla que contiene mis datos de sesión. Hay un proceso almacenado que se ejecuta cada vez que se modifica un registro de sesión que limpia las tablas de las filas de sesión no utilizadas inactivas durante más tiempo que un valor TIMEOUT predefinido.
agregado el autor stephenbayer, fuente

En el mejor de los casos, su registro de cierre de sesión será una suposición inteligente, incluso si logra que los eventos de la sesión funcionen correctamente, cuando el usuario abandonó su sitio/aplicación. Una técnica que puede utilizar es colocar el tiempo de cierre de sesión en el archivo db cuando el usuario inicie sesión, y simplemente continuar actualizando el registro con un tiempo futuro a medida que utilizan el sistema. Aquí está el esquema general de una tabla de sesión que utilicé recientemente creada:

[Id]  [Uid]    [LoginInOn]        [ExpiresOn]  
 1    johndoe  10/14/2008 10:47   10/14/2008 11:07  

En esta tabla, simplemente sigo actualizando la columna ExpiresOn a medida que el usuario interactúa con la aplicación (tiempo actual + 20 minutos). Si intentan interactuar después del ExpiresOn, entonces sé que estuvieron inactivos durante 20 minutos y forzaron un nuevo inicio de sesión. Para fines de informes, sé que el usuario ha cerrado sesión si la hora actual es superior a ExpiresOn. Puedes ser más complejo que esto. Por ejemplo, muevo mis datos de la tabla de sesiones listada anteriormente a una tabla de informes con un proceso regular. Esto es solo para mantener la tabla de sesiones pequeña, ya que muchas cosas interactúan con ella.

1
agregado