2010-05-23 13 views
9

Estoy experimentando con FormsAuthentication (usando ASP.NET MVC2) y está funcionando bastante bien.Invalidando ASP.NET FormsAuthentication server side

Sin embargo, un caso que no puedo resolver es cómo validar la identidad del usuario en el servidor para garantizar que siga siendo válida desde la perspectiva del servidor.

por ejemplo.

  1. usuario se conecta ... consigue una galleta/billete
  2. fuera de banda se elimina el usuario en el servidor
  3. usuario hace una nueva petición al servidor. HttpContext.User.Identity.Name se establece en el usuario eliminado.

puedo detecto esta muy bien, pero ¿cuál es la forma correcta de manejar la situación? Llamar a FormsAuthentication.SignOut en el OnAuthorization en OnActionExecuting eventos es demasiado tarde para afectar la solicitud actual.

Como alternativa, me gustaría poder llamar a FormsAuthentication.InvalidateUser (...) cuando se elimina al usuario (o se recrea la base de datos) para invalidar todos los tickets para un determinado (o todos) los usuarios. Pero no puedo encontrar una API para hacer esto.

Respuesta

7

En global.asax, agregue un controlador para AuthenticateRequest. En este método, la autenticación de formularios ya se ha realizado y puede modificar el principal actual antes de que ocurra cualquier otra cosa.

protected void Application_AuthenticateRequest(object sender, EventArgs e) { 
    IPrincipal principal = HttpContext.Current.User; 
    if (!UserStillValid(principal)) { 
    IPrincipal anonymousPrincipal = new GenericPrincipal(new GenericIdentity(String.Empty), null); 
    Thread.CurrentPrincipal = anonymousPrincipal; 
    HttpContext.Current.User = anonymousPrincipal; 
    }  
} 

Simplemente implemente el método UserStillValid y listo. También es un buen lugar para cambiar el principal genérico por uno personalizado si es necesario.

+0

¿La función UserStillValid verificará que el usuario esté activo en db o no? ¿Cuál es el significado de Thread.CurrentPrincipal = anonymousPrincipal y HttpContext.Current.User = anonymousPrincipal; – Thomas

Cuestiones relacionadas