2009-05-07 8 views
6

Ich muss Benutzer auf die Seite Passwort ändern umleiten, wenn ihr Passwort abgelaufen ist.Wo sollte ich einen Check platzieren, der eine Anfrage umleiten kann?

Ich möchte diesen Code an einem Ort platzieren, so dass jede Anfrage auf die Seite zum Ändern des Passworts umgeleitet werden kann.

Ich habe in Erweiterung der AuthorizeAttribute und überschreiben OnActionExecuting, aber weder arbeiten/erlauben Sie mir, die Routing-Logik kurzschließen, um auf die Seite Passwort ändern umzuleiten.

Für eine kleine Klarstellung würde die Logik sein:

Unerlaubte Anfrage:
-> jede URL -> AuthorizeAttribute -> Login.aspx -> Passwort abgelaufen -> ChangePassword.aspx

Autorisierte Anfrage :
-> beliebige URL ->??????? -> ChangePassword.aspx

Es ist das ???? Teil, dass ich nicht sicher bin, was ich tun soll.


Ich denke, ich werde mit Verlängerung der AuthorizeAttribute gehen. Ich werde das überall verwenden außer die Passwort-Controller-Methoden ändern.

Antwort

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

das funktioniert gut, markieren Sie einfach jeden Controller mit diesem Attribut ausschließen "Konto" ein. Auf diese Weise kann kein Benutzer mit abgelaufenem Attribut fortfahren, bis das Passwort geändert wird.

+1

Dies ist im Wesentlichen, was ich mit ging. – Will

+1

Ich weiß, das ist eine alte Antwort, also dachte ich, ich würde hinzufügen (zumindest für MVC3) 'filterContext.HttpContext.Response.Redirect (" ~/Account/ChangePassword? Grund = abgelaufen ");' sollte durch 'ersetzt werden filterContext.Result = new RedirectResult ("~/Account/ChangePassword? Grund = abgelaufen"); '(basierend auf: http://stackoverflow.com/a/2187364/700926 und http://stackoverflow.com/a/2765148/700926) –

1

Sie könnten einen Event-Handler für das PostAuthenticateRequest-Ereignis in global.asax hinzufügen.

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

Versucht, dass, aber anscheinend dieses Ereignis in MVC aufgegeben wird. – Will

Verwandte Themen