Onde devo colocar um cheque que pode redirecionar uma solicitação?
-
10-07-2019 - |
Pergunta
Eu preciso para redirecionar os usuários para a página de alteração de senha, se sua senha expirou.
Eu quero colocar esse código em um só lugar para que qualquer pedido pode ser redirecionado para a página de alteração de senha.
Eu olhei para estender a AuthorizeAttribute, e substituindo OnActionExecuting, mas nenhum trabalho / permitam-me curto-circuito a lógica de roteamento de redirecionamento para a página de alteração de senha.
Para um pouco de esclarecimento, a lógica seria:
pedido não autorizado:
-> qualquer URL -> AuthorizeAttribute -> Login.aspx -> senha expirou -> ChangePassword.aspx
pedido autorizado:
-> qualquer URL -> ??????? -> ChangePassword.aspx
Seu que ???? parte que eu não tenho certeza o que fazer.
Eu acho que estou indo para ir com o alargamento do AuthorizeAttribute. Eu vou usar isso em todos os lugares os métodos do controlador de alteração de senha.
Solução
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);
}
}
Isso funciona bem, basta marcar cada controlador com este atributo exclui uma "Conta". Desta forma, nenhum usuário com o atributo expirado capaz de continuar até alteração de senha.
Outras dicas
Você pode olhar para adicionar um manipulador de eventos para o evento PostAuthenticateRequest no global.
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");
}
}