Pregunta

En ASP.NET, estoy buscando una forma de auditar a un usuario que abandona 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 administra los configuradores / getters de sesión.

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

He intentado anular 'finalizar' en la clase SessionHelper y hacerlo allí cuando se destruye la clase, pero tampoco se activó ese evento.

Intentaría implementar IDisposable en SessionHelper, pero no sé 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!

¿Fue útil?

Solución

El evento Session_End solo se activa si tiene sesiones de InProc. La administración de sesión del servidor de estado o SQL no activará este evento. Si puede, vuelva 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, de ninguna manera que los usuarios de StackOverflow conozcan, ya que ya hice la pregunta), por lo que no puede usar un trabajo para comprobar cuando se destruyen.

Lo siguiente mejor 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 un trabajo de este tipo es complicada (por ejemplo, puede perder eventos de cierre de sesión si un usuario inicia / cierra sesión rápidamente) ...

Así que no hay una solución perfecta aquí.

Otros consejos

Ten en cuenta la forma correcta de " " " Pero así es como lo he hecho en el pasado.

Tener un " está activo " Marca de fecha y hora asociada con el registro de 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 15 minutos, entonces ese usuario se registra como " logout " evento, y la marca de tiempo se establece en NULL.

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, de cuándo el usuario abandonó su sitio / aplicación. Una técnica que podría usar es colocar el tiempo de cierre de sesión en la base de datos cuando el usuario inicia sesión, y seguir actualizando el registro en el futuro a medida que utilicen el sistema. Aquí está el esquema general de una tabla de sesión que utilicé recientemente:

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

En esta tabla, sigo actualizando la columna ExpiresOn a medida que el usuario interactúa con la aplicación (hora actual + 20 minutos). Si intentan interactuar después de ExpiresOn, entonces sé que estuvieron inactivos durante 20 minutos y forzaron un nuevo inicio de sesión. Para propósitos de informes, sé que el usuario ha cerrado la sesión si la hora actual es mayor que ExpiresOn. Puede obtener más complejo que esto. Por ejemplo, muevo mis datos de la tabla de sesiones enumerada 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.

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