2010-06-23 30 views
21

Mi aplicación permite que un administrador suspenda/vuelva a suspender cuentas de usuario. Lo hago con el siguiente código:Cerrar sesión programáticamente un usuario de ASP.NET

MembershipUser user = Membership.GetUser(Guid.Parse(userId)); 
user.IsApproved = false; 
Membership.UpdateUser(user); 

Los trabajos anteriores finas de suspender el usuario, pero no revoca su sesión. En consecuencia, el usuario suspendido puede permanecer con acceso a la aplicación mientras permanezca la cookie de sesión. Cualquier corrección/

Respuesta

2

En una página común, verifica que la cuenta sea válida, y si ha sido revocada, llama al Session.Abandon().

Editar (Sólo se dio cuenta de esto todavía estaba abierta.)

Sé que esto funciona, porque lo hago.

En la página maestra, verifique el estado de la cuenta. Eso significa en cada navegación tiene la posibilidad de cerrar la sesión.

(Final) Editar

No pensar en él como "estoy de terminación de su sesión," pensar en él como "su sesión termina en sí."

+1

¿No es solo para la sesión del usuario actual? Quiero abandonar la sesión de otro usuario ... Algo así como Sesión (usuario) .Abandonar. – Testing123

+1

@ Testing123 egrunin significa que cada usuario estaría revisando para ver si su propia cuenta no es válida, si es así, entonces la aplicación eliminaría su cookie. – guanome

+0

Voto descendente porque necesita FormsAuthentication.SignOut(); – Juan

6

Si se utiliza la autenticación de formularios:

FormsAuthentication.SignOut(); 
+3

Están queriendo finalizar otra sesión, no la del usuario actual, por lo que no es apropiado –

24

No hay manera de abandonar una sesión de 'fuera' de la sesión. Debería verificar la base de datos en cada carga de página, y si la cuenta se ha deshabilitado, entonces cierre la sesión. Podrías lograr esto usando un HttpModule también, lo que haría las cosas un poco más limpias.

Por ejemplo:

public class UserCheckModule : IHttpModule 
{ 
    public void Init(HttpApplication context) 
    { 
     context.PreRequestHandlerExecute += new EventHandler(OnPreRequestHandlerExecute); 
    } 

    public void Dispose() {} 

    private void OnPreRequestHandlerExecute(object sender, EventArgs e) 
    { 
     // Get the user (though the method below is probably incorrect) 
     // The basic idea is to get the user record using a user key 
     // stored in the session (such as the user id). 
     MembershipUser user = Membership.GetUser(Guid.Parse(HttpContext.Current.Session["guid"])); 

     // Ensure user is valid 
     if (!user.IsApproved) 
     { 
      HttpContext.Current.Session.Abandon(); 
      FormsAuthentication.SignOut(); 
      HttpContext.Current.Response.Redirect("~/Login.aspx?AccountDisabled"); 
     } 
    } 
} 

Esto no es un ejemplo completo, y el método de recuperación del usuario utilizando una clave almacenada en la sesión tendrá que ser adaptado, pero esto debe empezar. Implicará una verificación adicional de la base de datos en cada carga de página para verificar que la cuenta de usuario todavía esté activa, pero no hay otra forma de verificar esta información.

+0

En la línea 'MembershipUser user = Membership.GetUser (Guid.Parse (HttpContext.Current.Session [" guid "]));', ¿quieres decir que debería reemplazar esta línea con cualquier método que estemos usando para obtener un usuario? Como una llamada a la base de datos? – guanome

+0

@guanome Eso es correcto, sí. El ejemplo de código anterior asume que está almacenando el ID de usuario en la sesión. El propósito de esta línea de código es usar un valor almacenado en la sesión para recuperar al usuario de la base de datos (como su ID) para que pueda verificar su estado. – Mun

2

Cuando cierra la sesión de un usuario, también es una buena idea sobrescribir el FormsAuthenticationTicket.

HttpContext context = HttpContext.Current; 

//overwrite the authentication cookie 
FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, context.User.Identity.Name, DateTime.Now, DateTime.Now.AddDays(-1), false, Guid.NewGuid().ToString()); 
string encrypted_ticket = FormsAuthentication.Encrypt(ticket); 

HttpCookie cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encrypted_ticket); 
cookie.Expires = ticket.Expiration; 
context.Response.Cookies.Add(cookie); 

//clear all the sessions 
context.Session.Abandon(); 

//sign out and go to the login page 
FormsAuthentication.SignOut(); 
FormsAuthentication.RedirectToLoginPage(); 
Cuestiones relacionadas