¿Dónde debo colocar un cheque que pueda redirigir una solicitud?
-
10-07-2019 - |
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.
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");
}
}