2009-05-07 24 views
6

Necesito redirigir a los usuarios a la página Cambiar contraseña si su contraseña ha expirado.¿Dónde debo colocar un cheque que pueda redirigir una solicitud?

Quiero colocar este código en un solo lugar para que cualquier solicitud pueda redirigirse a la página de cambio de contraseña.

He intentado ampliar AuthorizeAttribute y reemplazar OnActionExecuting, pero ninguno funciona/me permite cortocircuitar la lógica de enrutamiento para redireccionar a la página de cambio de contraseña.

Para una pequeña aclaración, la lógica sería:

petición no autorizado:
-> cualquier URL -> AuthorizeAttribute -> Login.aspx -> contraseña ha caducado -> ChangePassword.aspx

solicitud autorizada :
-> cualquier URL ->??????? -> ChangePassword.aspx

¿Es eso ???? parte de que no estoy seguro de qué hacer.


Creo que voy a ir con extender el AuthorizeAttribute. Lo usaré en todas partes excepto los métodos del controlador de cambio de contraseña.

Respuesta

6
public class DenyExpiredPasswordAttribute : AuthorizeAttribute 
{ 

    public override void OnAuthorization(AuthorizationContext filterContext) 
    { 
     IPrincipal user = filterContext.HttpContext.User; 

     if(user != null) 
     { 
      if (user.Identity.IsAuthenticated) 
      { 

       if (CurrentUser.PasswordExpired) // your checking of password expiration 
       { 
        filterContext.HttpContext.Response.Redirect("~/Account/ChangePassword?reason=expired"); 
       } 
      } 
     } 
     base.OnAuthorization(filterContext); 
    } 
} 

esto funciona bien, sólo marcar cada controlador con este atributo excluye "Cuenta" uno. De esta forma, ningún usuario con un atributo vencido puede continuar hasta que se cambie la contraseña.

+1

Esto es esencialmente lo que fui. – Will

+1

Sé que esta es una respuesta anterior, así que pensé en agregar que (al menos para MVC3) 'filterContext.HttpContext.Response.Redirect (" ~/Account/ChangePassword? Reason = expired ");' debería reemplazarse por ' filterContext.Result = new RedirectResult ("~/Account/ChangePassword? reason = expired"); '(Basado en: http://stackoverflow.com/a/2187364/700926 y http://stackoverflow.com/a/2765148/700926) –

1

Puede consultar agregar un controlador de eventos para el evento PostAuthenticateRequest en global.asax.

protected void Application_Start(object sender, EventArgs e) { 
    this.PostAuthenticateRequest += new EventHandler(Global_PostAuthenticateRequest); 
} 

void Global_PostAuthenticateRequest(object sender, EventArgs e) 
{ 
if (passwordExpired) { 
    Context.Response.Redirect("~/ChangePassword.aspx"); 
    } 
} 
+0

Intenté eso, pero aparentemente ese evento se abandonó en MVC. – Will

Cuestiones relacionadas