Блокировка пользователя в провайдере нестандартного членства ASP .Net - PullRequest
6 голосов
/ 10 декабря 2008

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

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

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

Решение

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

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

Ответы [ 4 ]

7 голосов
/ 10 декабря 2008

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

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

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

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

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

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

3 голосов
/ 14 января 2010

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

if (0 < Membership.MaxInvalidPasswordAttempts && Membership.MaxInvalidPasswordAttempts < 100)
       {
                for(int i = 0; i <= Membership.MaxInvalidPasswordAttempts; i++)
                {
                    Membership.ValidateUser(userName, "jfdlsjflksjlkfjsdlkfjsdl");
                }
        }
3 голосов
/ 10 декабря 2008

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

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

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

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

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

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

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

0 голосов
/ 10 декабря 2008

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

...