Pregunta

Necesito redirigir a los usuarios a la página Cambiar contraseña si su contraseña ha caducado.

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

He examinado la posibilidad de ampliar AuthorizeAttribute y anular OnActionExecuting, pero ninguno de los dos funciona / me permite cortocircuitar la lógica de enrutamiento para redirigir a la página de cambio de contraseña.

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

Solicitud no autorizada:
- > cualquier URL - > AuthorizeAttribute - > Login.aspx - > contraseña caducada - > ChangePassword.aspx

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

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


Creo que voy a continuar extendiendo AuthorizeAttribute. Lo usaré en todas partes excepto los métodos del controlador de cambio de contraseña.

¿Fue útil?

Solución

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, solo marque cada controlador con este atributo excluir " Cuenta " uno. De esta manera, ningún usuario con atributo caducado puede continuar hasta que cambie la contraseña.

Otros consejos

Podría considerar 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");
   }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top