Où devrais-je placer un chèque qui peut rediriger une demande?
-
10-07-2019 - |
Question
Je dois rediriger les utilisateurs vers la page Modifier le mot de passe si leur mot de passe a expiré.
Je souhaite placer ce code à un endroit unique 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 remplacer OnActionExecuting, mais cela ne me permet ni de me permettre de court-circuiter la logique de routage afin de le rediriger vers la page de modification du mot de passe.
Pour une petite précision, la logique serait la suivante:
Demande non autorisée:
- > n'importe quelle URL - > AuthorizeAttribute - > Login.aspx - > mot de passe expiré - > ChangePassword.aspx
Demande autorisée:
- > n'importe quelle URL - > ??????? - > ChangePassword.aspx
C'est ça ???? partie que je ne sais pas quoi faire.
Je pense que je vais aller avec l'extension de AuthorizeAttribute. J'utiliserai cela partout sauf les méthodes du contrôleur de changement de mot de passe.
La solution
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 bien, il suffit de marquer chaque contrôleur avec cet attribut exclure "Compte". un. De cette façon, aucun utilisateur avec un attribut arrivé à expiration ne peut continuer jusqu'à ce que le mot de passe soit changé.
Autres conseils
Vous pouvez envisager d'ajouter un gestionnaire d'événement 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");
}
}