2009-05-07 5 views
6

Je dois rediriger les utilisateurs vers la page Modifier le mot de passe si leur mot de passe a expiré.Où dois-je placer un chèque pouvant rediriger une demande?

Je souhaite placer ce code au même endroit afin que toute demande puisse être redirigée vers la page de modification du mot de passe.

J'ai envisagé d'étendre AuthorizeAttribute, et de surcharger OnActionExecuting, mais ni travailler ni me permettre de court-circuiter la logique de routage pour rediriger vers la page de changement de mot de passe.

Pour une petite précision, la logique serait:

demande non autorisée:
-> une URL -> AuthorizeAttribute -> Login.aspx -> Mot de passe expiré -> ChangePassword.aspx

demande autorisée :
-> n'importe quelle URL ->??????? -> ChangePassword.aspx

C'est ça ???? part que je ne suis pas sûr de ce qu'il faut faire.


Je pense que je vais aller avec l'extension AuthorizeAttribute. Je vais utiliser cela partout sauf les méthodes de contrôleur de changement de mot de passe.

Répondre

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

cela fonctionne très bien, marquer simplement chaque contrôleur avec cet attribut exclure « compte » un. De cette façon, aucun utilisateur ayant un attribut expiré ne peut continuer jusqu'à ce que le mot de passe change.

+1

C'est essentiellement ce que je suis allé avec. – Will

+1

Je sais que c'est une vieille réponse, donc j'ai pensé que j'ajouterais que (au moins pour MVC3) 'filterContext.HttpContext.Response.Redirect (" ~/Account/ChangePassword? Raison = expiré ");' devrait être remplacé par ' filterContext.Result = new RedirectResult ("~/Account/ChangePassword? raison = expiré"); '(Basé sur: http://stackoverflow.com/a/2187364/700926 et http://stackoverflow.com/a/2765148/700926) –

1

Vous pouvez ajouter un gestionnaire d'événements pour l'événement PostAuthenticateRequest dans 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

Essayé cela, mais apparemment cet événement est abandonné dans MVC. – Will

Questions connexes