Lo que hicimos es que usamos una combinación de estado de la sesión y el estado de aplicación para evitar la entrada duplicada.
Cuando un usuario inicia sesión, su userId se recupera de la base de datos de miembros asp.net y se guarda en el estado de la aplicación como un objeto único.
Dado que el estado de la aplicación es global para la aplicación y no específico para una sesión de usuario, podemos verificar si el ID de usuario ya está guardado en el estado de la Aplicación. Si ya está guardado, podemos notificar al usuario y detener el inicio de sesión. Cuando la sesión expira (en Session_End dentro del archivo Global.asax), ese objeto de estado de la aplicación para ese usuario en particular se puede eliminar del estado de la aplicación para que pueda iniciar sesión de nuevo después de que su sesión haya expirado.
Aquí está el código: En Login.aspx.cs:
protected void OnLoggingIn(object sender, LoginCancelEventArgs e)
{
// Accesses the database to get the logged-in user.
MembershipUser userInfo = Membership.GetUser(LoginUser.UserName);
UserMan.UserID = userInfo.ProviderUserKey.ToString();
if (Application[UserMan.UserID] != null)
{
if (Convert.ToString(Application[UserMan.UserID]) == UserMan.UserID)
{
e.Cancel = true;
}
else
{
// Save the user id retrieved from membership database to application state.
Application[UserMan.UserID] = UserMan.UserID;
}
}
else
{
Application[UserMan.UserID] = UserMan.UserID;
}
}
Y en Global.asax:
void Session_End(object sender, EventArgs e)
{
// Code that runs when a session ends.
// Note: The Session_End event is raised only when the sessionstate mode
// is set to InProc in the Web.config file. If session mode is set to StateServer
// or SQLServer, the event is not raised.
if (Application[UserMan.UserID] != null)
{
if (Convert.ToString(Application[UserMan.UserID]) == UserMan.UserID)
{
Application.Contents.Remove(UserMan.UserID);
}
}
}
Aunque esta solución parece un poco desordenado, que funciona bastante bien sin demasiado mucha codificación y menos hits en la base de datos.
posible duplicado de http://stackoverflow.com/questions/2138494/prevent-multiple-logons-for-a-single-user-in-asp-net –