2012-09-11 16 views
13

En mi aplicación, estoy usando Forms-Authentication para iniciar sesión y cerrar sesión en los usuarios.¿Cómo forzar la salida del usuario cuando su nombre de usuario es cambiado por otro usuario?

Una de las funciones es que el administrador puede cambiar el nombre de usuario de otros usuarios. En ese caso, debo cerrar la sesión del usuario cuyo nombre de usuario ha cambiado.

Si no lo hago, debido a sus cookies establecidas anteriormente, obtienen acceso a la aplicación y reciben mensajes de error (ya que su nombre de usuario no existe y hay partes donde utilizo su nombre de usuario para algunas funcionalidades).

¿Cómo puedo forzar a estos usuarios a cerrar la sesión con la Autenticación de formularios?

ACTUALIZACIÓN:

public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string controller = filterContext.RouteData.Values["controller"].ToString(); 
     string action  = filterContext.RouteData.Values["action"].ToString(); ; 
     // Below returns the previous username, which does not exist anymore in db. 
     string userName = HttpContext.Current.User.Identity.Name; 

     UnitOfWork unitOfWork = new UnitOfWork(); 

     if (!unitOfWork.UserRepository.UserExists(userName)) 
     { 
      FormsAuthentication.SignOut(); 
      filterContext.HttpContext.Session.Clear(); 
      filterContext.HttpContext.Session.Abandon(); 
      // I am not using Roles. 


     } 
     unitOfWork.Dispose(); 
     base.OnActionExecuting(filterContext); 

    } 

En mi cliente filtro global, puedo comprobar si el usuario existe o no, si no me apunto a cabo. Sin embargo, no está funcionando. Al trabajar quiero decir que pasan la autenticación y obtienen acceso a la aplicación.

Gracias de antemano.

Respuesta

9

Aquí es lo que haces para forzar al usuario cerrar la sesión:

public void UserPasswordChangedHandler() 
{ 
    FormsAuthentication.SignOut(); 
    Roles.DeleteCookie(); 
    Session.Clear(); 
} 

No creo línea por línea de explicación requerida, su explica por sí mismo suficiente. Háganme saber si me equivoco.

actualización

respuesta directa a su pregunta adicional es mantener el seguimiento por booleano usuario si sus datos se actualizan por admin y si es así - sólo le redirigirá a la página de acceso.

Por favor, véase el siguiente artículos de cierre de sesión forzado el uso de formularios de información de autenticación:

Actualización 2

galletas Borrado

Esperanza ayuda esto.

+2

Creo que esto cierra la sesión del usuario. Quiero cerrar la sesión de otros usuarios, cuya contraseña ha cambiado por admin. Bueno, ciertamente puedo usar este código para firmar que el usuario cierre la sesión, pero ¿cómo puedo entender que se haya cambiado su contraseña? en otras palabras, ¿cuándo debería llamarse este método? –

+0

Me alegro de que el código que proporcioné fuera de ayuda. Para responder a su pregunta adicional (cómo manejarla), consulte la actualización en mi respuesta. –

+0

Gracias de nuevo. Uso su código en mi filtro personalizado ActionFilterAttribute. Allí, compruebo si el nombre de usuario existe o no, si no (esta condición se cumple cuando cambio mi nombre de usuario), firmo al usuario. Sin embargo, el problema persiste. Las cookies del usuario permanecen y él obtiene acceso a la aplicación. Algunas ideas ? Actualicé mi pregunta con un código de filtro. –

2

Cuando un usuario necesita ser invalidado debe agregar sus detalles a algún tipo de lista estática interna.

A continuación, en cada petición (posiblemente usando Application_BeginRequest) ver si ese usuario actual está en esa lista, y si es así hay que llamar FormsAuthentication.SignOut-y-entonces.

Parece una especie de truco, pero es lo mejor que se me ocurre en este momento.

Tenga en cuenta que la eliminación del estado de sesión de un usuario en ausencia es otro problema por completo.

+0

Hacemos algo similar para evitar que varios usuarios inicien sesión desde diferentes máquinas, generamos un token (basado en la información de la PC de los usuarios) para cada inicio de sesión y luego verificamos si ese token es el mismo, si no forzamos un registro –

Cuestiones relacionadas