Блокировка пользователя в провайдере нестандартного членства ASP .Net

Мне пришлось создать пользовательский поставщик членства для моего текущего проекта ASP .Net, чтобы он соответствовал нашей схеме базы данных, и у меня возникают проблемы с его настройкой для блокировки пользователя, если он трижды неправильно введет свой пароль, что поддерживается стандартные провайдеры.

Это то, что мне нужно реализовать самому, или это должно быть поддержано изначально?

У меня нет кода, который конкретно занимается этим (и, похоже, никто из членов интерфейса не занимается этим конкретно), но если мне нужно реализовать его самостоятельно, как мне проинформировать пользователя, что он заблокирован? Нужно ли вызывать какие-то исключения в ValidateUser?

Решение

Жаль, что я не могу отметить два ответа, ссылки, предоставленные Дейвом R, дают глубокое представление о том, как работает членство, и то, на что указал Жаф, было именно тем, что я в итоге сделал, обработав заблокированную логику в провайдере нестандартного членства.

Затем я обработал условие ошибки, используя событие LoginError элемента управления Login, и зарегистрировался там, чтобы узнать, не заблокирован ли пользователь, чтобы показать соответствующее сообщение об ошибке.

4 ответа

Решение

Скотт Митчелл написал отличную серию руководств на сайте ASP.NET. Эта ссылка содержит информацию о создании собственного провайдера и обсуждает логику блокировки:

http://www.asp.net/LEARN/security/tutorial-06-cs.aspx

Также нет встроенного метода для разблокировки учетных записей (т.е. вы должны делать это с помощью инструментов базы данных, если вы используете что-то похожее на SqlMembershipProvider). Скотт также написал статью о создании пользовательского интерфейса для управления этим, которую вы можете найти здесь:

http://www.asp.net/LEARN/security/tutorial-14-vb.aspx

Я действительно рекомендую прочитать всю серию. Скотт отличный коммуникатор.

Надеюсь, это поможет.

Воспроизведите условия, которые приводят к блокировке (слишком много неудачных попыток входа в систему). Поскольку поставщики членства каждый раз совершают поездки в свой бэкэнд, разумно ограничить этот подход поставщиками с разумным количеством MaxInvalidPasswordAttempts.

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }

Это то, что вы должны написать сами.

Схема базы данных по умолчанию имеет следующие столбцы в таблице aspnet_Membership:

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

Счетчик попыток будет увеличиваться при каждой неудачной попытке в окне попытки, а время первой неудачной попытки сохраняется в столбце начала окна, как только FailedPasswordAttemptCount равен maxInvalidPasswordAttempts из конфигурации, устанавливается IsLockedOut.

Как утверждает Михил, ваш метод ValidateUser должен будет проверить эти значения на основе настроек в конфигурации провайдера - по умолчанию это:

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

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

В вашем пользовательском провайдере членства вы должны реализовать функцию ValidateUser. Там вы не только проверяете правильность имени пользователя и пароля, но и извлекаете количество попыток ввода неверного пароля и т. Д. Из хранилища данных. Если имя пользователя / пароль верны, сбросьте счетчик попыток ввода пароля, иначе увеличьте количество попыток ввода пароля. SqlMembershipProvider также хранит дату и время LastAttempt, поэтому вы не можете перебить вас, потому что вам не разрешено делать попытки в течение определенного периода времени.

Другие вопросы по тегам