2009-07-02 8 views
9

Каков наилучший способ обработки истек пароль в приложении ASP.NET MVC?ASP.NET MVC - Как обрабатывать истекший пароль?

Позвольте мне объяснить, - ASP.NET MVC, очевидно, установить (как в усеченный приложение на примере NerdDinner) для обработки следующих сценариев:

  • Регистрация новых пользователей
  • позволит им изменить свой пароль
  • Вход с использованием действительного учетной записи/пароля

Что не является действительно хорошим способом сделать следующее:

  • Force пользователю изменить свой пароль, если он истек

ASP.NET MVC способ мышления указывает на мысли о том, пользователь перейти к отдельному URL/целью выполнить изменение пароля ,

Проблема с этой идеей в том, что я не хочу, чтобы люди могли пойти на этот URL, если они не вошли в систему, и я не хочу, чтобы они были в состоянии пойти куда-нибудь еще на сайте с истекшим паролем.

В прошлом, когда я справлялся с этим, нужно, чтобы пользователь не покидал страницу входа и имел панель ASP.NET, показывающую бит «о, эй, вам нужно изменить пароль», и скрыть остальной части страницы. На этом этапе пользователь еще не вошел в систему, поэтому они не будут проходить проверку подлинности и не могут идти никуда, пока они не изменят свой пароль.

Но ASP.NET MVC затрудняет это. Если я делаю что-то вроде выше и имею все на странице входа в систему, то у меня должно быть очень громоздкое действие Login(), чтобы обрабатывать все возможные опубликованные значения. Если у меня есть сообщение для другого действия/представления, то я рискую либо войти в систему пользователя, либо не будет защищена паролем с изменением подлинности (поскольку, в отличие от бит «сменить пароль», который вам предоставляется, я не хотите, чтобы они были аутентифицированы, когда они видят страницу).

Я могу представить несколько сценариев, в которых вы бы установили что-то в ViewData, чтобы указать, что срок действия пароля истек, и настаивать на перенаправлении пользователя на страницу «Сменить пароль», но я не уверен, что это безопасная вещь. ,

ответ

6

Я бы предпочел использовать пользовательский (расширение существующего) AuthorizeFilter, который устанавливает ActionResult в AuthorizationContext для перенаправления на действие смены пароля, если пользователь аутентифицирован, но пароль истек. Это позволит им войти в систему в обычном режиме, но ограничить их только этим действием, если срок их пароля истек. Я использую аналогичный подход в одном из моих приложений, который перенаправляет человека на страницу регистрации событий, если они зарегистрированы на сайте, но еще не подписались на какое-либо событие (это приложение для управления благотворительными мероприятиями).

Возможно, вы сможете реализовать его как отдельный фильтр и использовать существующий для авторизации.

[Authorize] 
[RequiresUnexpiredPassword] 
public class MyController : Controller 
{ 
    ... 
} 

Конечно, вы должны убедиться, что действие ChangePassword разрешено продолжить без перенаправления с помощью фильтра.

+1

Я думаю, что это не очень хорошая идея создать атрибут RequiresUnexpiredPassword, потому что вам придется применить этот атрибут ко всем контроллерам [Предполагая, что автор не хочет, чтобы пользователь просматривал приложение с истекшим паролем]. Лучше изменить поведение самого атрибута Authorize. – SolutionYogi

+1

Не забудьте также украсить методы/контроллеры атрибутом Authorize. Как я уже сказал, вы можете либо расширить фильтр авторизации ИЛИ иметь отдельный атрибут. Отдельный атрибут будет соответствовать принципу единой ответственности, а также быть гибким. В этом случае, однако, я, вероятно, поеду с моим первым предложением, которое также является вашим предложением минус исключение, и используйте специальный фильтр авторизации. – tvanfosson

+0

Да, но атрибут Authorize уже установлен, так что это спорный вопрос. – SolutionYogi

4

Как насчет создания пользовательского атрибута AuthorizationAttribute и переопределения метода OnAuthorization [Пример кода: asp.net mvc Adding to the AUTHORIZE attribute].

В этом методе вы можете проверить, истек ли пароль, бросить PasswordExpiredException. Поймайте это исключение в базовом контроллере и перенаправьте пользователя на действие «Изменить пароль».

+5

Зачем бросать исключение, когда можете просто установите свойство свойства AuthorizeContext и выполните перенаправление? – tvanfosson

Смежные вопросы