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.

Foi útil?

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");
   }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top