Где я должен разместить чек, который может перенаправить запрос?
-
10-07-2019 - |
Вопрос
Мне нужно перенаправить пользователей на страницу изменения пароля, если срок действия их пароля истек.
Я хочу разместить этот код в одном месте, чтобы любой запрос можно было перенаправить на страницу смены пароля.
Я рассмотрел расширение AuthorizeAttribute и переопределение OnActionExecuting, но ни одна из них не работает / не позволяет мне закорачивать логику маршрутизации для перенаправления на страницу смены пароля.
Для небольшого пояснения логика будет такой:
Несанкционированный запрос:
- & GT; любой URL - > AuthorizeAttribute - > Login.aspx - > срок действия пароля истек - > ChangePassword.aspx
Авторизованный запрос:
- & GT; любой URL - > ??????? - > ChangePassword.aspx
Это что ???? часть, что я не уверен, что делать.
<Ч>Я думаю, что я собираюсь пойти с расширением AuthorizeAttribute. Я буду использовать это везде кроме методов контроллера смены пароля. Р>
Решение
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);
}
}
это работает нормально, просто пометьте каждый контроллер этим атрибутом exclude " Account " один. Таким образом, ни один пользователь с атрибутом expired не сможет продолжить работу до смены пароля.
Другие советы
Вы можете посмотреть, как добавить обработчик события PostAuthenticateRequest в 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");
}
}