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

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

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

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

Решение

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

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

10.12.2008 10:17:15
4 ОТВЕТА
РЕШЕНИЕ

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

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

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

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

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

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

7
10.12.2008 13:48:02

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

0
10.12.2008 13:15:48

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

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

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

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

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

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

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

3
10.12.2008 13:56:28

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

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }
3
14.01.2010 12:40:22