2011-03-16 15 views
9

Quería detener el inicio de sesión múltiple del mismo usuario. Entonces, creé una tabla que realiza un seguimiento de los usuarios que han iniciado sesión. Cuando inician sesión, los datos se ingresan en la tabla. Cuando hacen clic en cerrar sesión, los datos y la sesión se eliminarán.Cómo evitar el inicio de sesión múltiple para el mismo usuario

El problema es que cuando cierran la ventana del navegador sin cerrar la sesión, no podrán volver a iniciar sesión nunca más.

¿Hay una mejor manera de manejar esto?

+0

¿Está utilizando 'Microsoft SQL Server' o' MySQL'? He eliminado la etiqueta 'MySQL' temporal porque supongo que estás usando' SQL Server'. Siéntase libre de agregar las etiquetas correctas a su pregunta. – Bobby

+0

Su servidor sql 2005 – Kanishka

Respuesta

6

Tienes que eliminar inforamtion en la tabla en el evento mundial Session_End en global.asax.cs archivo

protected void Session_End(Object sender, EventArgs e) 
{ 
    //delete from database where userID = Session["userID"] 
} 
+0

Ty. Intenté hacer eso. Solo funcionará cuando el usuario haga clic en cerrar sesión. – Kanishka

+0

@HaraHara, la solución mencionada anteriormente es correcta, y se activará cuando el tiempo de espera automático ocurra en el servidor. es decir, si ha establecido el tiempo de espera en 10 minutos. El Session_End se activará después de 10 minutos de la última actividad realizada por un SessionID –

+0

¿qué modo de sesión debo usar? Estoy usando SQL server para DB. ¿Tengo que usar el modo de servidor sql o el modo InProc? – Kanishka

1

Keap que el tiempo de sesión fuera corto y fácil de registro cuando la sesión se eliminara a cabo automaticamente

+0

Eso no eliminará los datos de la base de datos. –

+0

puede establecer su propio código de corte cuando sucedió y remoto desde allí usuario entriy en la base de datos – kalvis

0

Hemos de tener una variable de sesión de dicho true/false dependiendo del estado de inicio de sesión. Verdadero: el usuario ya inició sesión, Falso: no inició sesión.

En muchos casos tengo un objeto de usuario guardado en la sesión, por lo que solo lo compruebo contra null, que devuelve el usuario autenticado o nulo (anónimo) .

Bastante simple y sin DB involucrado.

EDITAR:

Si los comentarios a continuación a entender el problema correctamente, por favor, a pesar de esta respuesta. Me refería a la situación en la que no desea que un usuario autenticado vuelva a iniciar sesión durante la misma sesión.

+0

No creo que hayas entendido la pregunta correctamente. No quiere verificar SI un usuario está conectado, quiere asegurarse de que el usuario inicie sesión solo UNA VEZ. –

+0

Una variable de sesión no informará a las distintas instancias de clientes si han iniciado sesión o no –

+0

Entiendo y he corregido mi publicación. – Tengiz

2

Si estamos hablando de 'StateServer o SQLServer' modo de sesión que:

Session_End evento se disparará una vez que se llama a Session.Abandon(). Hay un trabajo ASPState_Job_DeleteExpiredSessions en el servidor sql, que caduca las sesiones de usuario si el usuario no se desconecta utilizando el botón de cerrar sesión. Este trabajo llama al procedimiento almacenado DeleteExpiredSessions, por lo que supongo que debe colocar algo de lógica (eliminar usuario registrado) en este procedimiento almacenado.

de documentation:

Usted puede controlar el evento Session_OnEnd mediante la adición de una subrutina llamada Session_OnEnd al archivo Global.asax. La subrutina Session_OnEnd se ejecuta cuando se ha llamado al método Abandon o cuando la sesión ha caducado . Una sesión caduca cuando el número de minutos especificado por la propiedad Tiempo de espera pasa sin que se haya realizado una solicitud para la sesión.

El evento es apoyado Session_OnEnd sólo cuando el Modo propiedad estado de sesión se establece en InProc, que es el valor por defecto . Si el modo de estado de sesión es StateServer o SQLServer, entonces el evento Session_On End en el archivo Global.asax se ignora.Si el modo de estado de sesión se establece en Personalizado, entonces el soporte para el evento Session_OnEnd es determinado por el proveedor de tienda de estado de sesión personalizado .

Usted puede utilizar el evento Session_OnEnd a limpiar la información relacionada con la sesión tales como información de un usuario que es rastreado en una fuente de datos por el valor SessionID.

Cuestiones relacionadas