2009-05-07 16 views
6

Devo reindirizzare gli utenti alla pagina Cambia password se la loro password è scaduta.Dove dovrei effettuare un controllo che potrebbe reindirizzare una richiesta?

Desidero inserire questo codice in un'unica posizione in modo che qualsiasi richiesta possa essere reindirizzata alla pagina di modifica della password.

Ho cercato di estendere l'AuthorizeAttribute e di eseguire l'override di OnActionExecuting, ma nessuno dei due funziona/mi consente di cortocircuitare la logica di routing per reindirizzare alla pagina di modifica della password.

Per un piccolo chiarimento, la logica sarebbe:

richiesta non autorizzata:
-> qualsiasi URL -> AuthorizeAttribute -> Login.aspx -> password scaduta -> ChangePassword.aspx

richiesta autorizzato :
-> qualsiasi URL ->??????? -> ChangePassword.aspx

E che ???? parte che non sono sicuro di cosa fare.


Penso che andrò ad estendere l'AuthorizeAttribute. Lo userò ovunque eccetto i metodi del controller di modifica della password.

risposta

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); 
    } 
} 

questo funziona bene, basta contrassegnare ogni controller con questo attributo escludere "Account" uno. In questo modo nessun utente con attributo scaduto può continuare fino alla modifica della password.

+1

Questo è essenzialmente ciò che sono andato con. – Will

+1

So che questa è una vecchia risposta, quindi ho pensato di aggiungere (almeno per MVC3) 'filterContext.HttpContext.Response.Redirect (" ~/Account/ChangePassword? Reason = expired ");' deve essere sostituito da ' filterContext.Result = new RedirectResult ("~/Account/ChangePassword? reason = expired"); '(Basato su: http://stackoverflow.com/a/2187364/700926 e http://stackoverflow.com/a/2765148/700926) –

1

Si potrebbe aggiungere un gestore di eventi per l'evento PostAuthenticateRequest in 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

Provato, ma apparentemente quell'evento è stato abbandonato in MVC. – Will

Problemi correlati