Pregunta

Quiero poder eliminar las sesiones existentes con el mismo nombre de usuario cuando alguien inicia sesión para evitar que varias personas utilicen el mismo inicio de sesión.

¿Hay alguna forma de recorrer las sesiones existentes y eliminarlas?

¿Fue útil?

Solución

Agregue esto a su global.asax

protected void Application_Start(object sender, EventArgs e)
{
    Application["sessions"] = new List<HttpSessionState>();
}

protected void Session_Start(object sender, EventArgs e)
{
    var sessions = (List<HttpSessionState>)Application["sessions"];
    sessions.Add(this.Session);
}

protected void Session_End(object sender, EventArgs e)
{
    var sessions = (List<HttpSessionState>)Application["sessions"];
    sessions.Remove(this.Session);
}

Ahora puedes recorrer tus sesiones como esta

var sessions = (List<HttpSessionState>)Application["sessions"];

foreach (var session in sessions)
       ...

Para eliminar otras sesiones, puede ingresar el método Session_Start para la sesión anterior y abandonarlo. Eso podría parecer algo como esto.

protected void Session_Start(object sender, EventArgs e)
{
    var userId = (int)this.Session["userId"];
    foreach (var session in sessions)
        if ((int)session["userId"] == userId)
           session.Abandon();

    var sessions = (List<HttpSessionState>)Application["sessions"];
    sessions.Add(this.Session);
}

Otros consejos

puede guardar los usuarios registrados en la base de datos y comprobar si ya han iniciado sesión, puede evitar que vuelvan a iniciar sesión. utilizando el método Session_Start en Global.asax.

Respuesta corta: no.

Respuesta larga: necesita implementar su propio proveedor de sesión. No hay forma de que una sesión haga referencia a otra sesión, por razones de seguridad. Tendría que dar una vuelta e implementar su propia gestión de sesión.

La única vez que implementé esto, almacené los ID de usuario (o algo único) en una variable de aplicación, un diccionario o una matriz. Es fácil verificar la existencia de la ID de usuario en el diccionario de la aplicación al momento de iniciar sesión. El único problema real es que las personas que no se desconectan y simplemente cierran el navegador. Nunca encontrarás una buena forma confiable de detectar este evento.

Fuera del manguito:

En Session_Start (generalmente un inicio de sesión exitoso), almacene el UserID y el SessionID del usuario en una tabla de búsqueda (o una nueva columna en la tabla del usuario).

En cada solicitud, deberá validar que el ID de usuario (almacenado en la sesión) y el ID de sesión coincidan con los valores almacenados en la tabla de búsqueda como un paso de autenticación.

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