2010-05-27 58 views
9

¿Hay alguna forma de detectar cuando un usuario inicia sesión si ya hay otra sesión con el mismo nombre de usuario y bloquearlo para que no vuelva a iniciar sesión o enviarle un mensaje?Limitar solo una sesión por usuario en ASP.NET

+1

Tener un vistazo a este artículo: http://www.sharepoint4developers.net/en-nz/post/limit-session-account.aspx –

Respuesta

16

Siempre puede implementar los eventos en global.asax.

Implemente Application_Start() para configurar un System.Collections.Dictionary (o según su preferencia) y almacénelo en la colección Application [], cuando un usuario inicie sesión, agregue el nombre de usuario. Eliminar de la colección en Session_End(). Recuerde utilizar la palabra clave 'bloquear' mientras trabaja con la colección :)

¡Diviértase!

Ejemplo:

[page.aspx] 
public partial class page : System.Web.UI.Page { 
    protected bool Login(string userName) { 
     System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] 
      as System.Collections.Generic.List<string>; 
     if (d != null) { 
      lock (d) { 
       if (d.Contains(userName)) { 
        // User is already logged in!!! 
        return false; 
       } 
       d.Add(userName); 
      } 
     } 
     Session["UserLoggedIn"] = userName; 
     return true; 
    } 

    protected void Logout() { 
     Session.Abandon(); 
    } 
} 

[global.asax] 
<%@ Application Language="C#" %> 
<script RunAt="server"> 
    void Application_Start(object sender, EventArgs e) { 
     Application["UsersLoggedIn"] = new System.Collections.Generic.List<string>(); 
    } 

    void Session_End(object sender, EventArgs e) { 
     // NOTE: you might want to call this from the .Logout() method - aswell -, to speed things up 
     string userLoggedIn = Session["UserLoggedIn"] == null ? string.Empty ? (string)Session["UserLoggedIn"]; 
     if (userLoggedIn.Length > 0) { 
      System.Collections.Generic.List<string> d = Application["UsersLoggedIn"] 
       as System.Collections.Generic.List<string>; 
      if (d != null) { 
       lock (d) { 
        d.Remove(userLoggedIn); 
       } 
      } 
     } 
    } 
</script> 
+0

si está utilizando sesiones para controlar la autorización, es decir ... –

+0

Intenté esta solución, pero no puedo acceder a Application on Session_End porque mi HttpContext.Current es nulo. ¿Cómo puedo acceder? – Inbal

+0

@FredrikJohansson: Si el usuario cierra el navegador sin hacer clic en LogOut, y nuevamente intenta ingresar con el mismo nombre de usuario, el usuario no podrá iniciar sesión. ¿Cómo podemos arreglar eso? – nightfire001

3

Implementé esto cuando un usuario inicia sesión establece un indicador en el DB en el que está conectado. Era un int que representa la cantidad de veces que ha iniciado sesión. Hemos permitido dos. Entonces solo verificaría eso al validar al usuario.

+0

Y, ¿cómo determinar si un usuario desconectado? También hay conexiones que expiran. Por lo tanto, necesita al menos una rutina que se ejecute en algún lugar para disminuir ese entero – citronas

+0

Sí, eso fue un problema. Creo que teníamos javascript funcionando de forma congruente con el tiempo de espera de la sesión y le preguntaríamos si quería permanecer conectado, si no hubiera respuesta, disminuiría el conteo. También tuve lo mismo en el evento de fin de sesión. También tuvimos un trabajo que restableció la cuenta a 0 en el medio de la noche. – nportelli

0

Puede almacenar el SessionID de un usuario en una base de datos. En cada inicio de sesión, almacene una combinación de nombre de usuario único e ID de sesión en la base de datos. En la página maestra, incluye la consulta a la base de datos, para verificar si el último inicio de sesión para el nombre de usuario utilizado actualmente fue de la misma sesión. De lo contrario, abandone la sesión y redirija a la página de inicio de sesión.

El comportamiento que publiqué debería desconectar al segundo usuario. Puede cambiar la sesión. Abandonar su comportamiento deseado

2

Puede hacer un seguimiento de los usuarios que han iniciado sesión en su archivo global.asax utilizando el objeto Aplicación.

En el método Session_Start o su método de inicio de sesión, puede verificar si el usuario está almacenado en el objeto Aplicación.

En el método Session_End o en su método de cierre de sesión, deberá eliminar el usuario del objeto Aplicación.

+0

Intenté esta solución, pero no puedo acceder a Application on Session_End porque mi HttpContext.Current es nulo. ¿Cómo puedo acceder? – Inbal

1

No lo almacene en la base de datos si no puede identificar el evento de cierre de sesión del usuario (pueden hacer clic en cerrar sesión, cerrar la pestaña, cerrar todo el navegador o simplemente apagar la computadora ...). Use la sesión para hacer la misma comprobación en su lugar.

Cuestiones relacionadas