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

StackOverflow https://stackoverflow.com/questions/355602

Вопрос

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

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

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

Решение

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

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

Это было полезно?

Решение

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

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

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

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

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

Я надеюсь, что это поможет.

Другие советы

Это то, что вам пришлось бы написать самому.

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

IsLockedOut
FailedPasswordAttemptCount
FailedPasswordAttemptWindowStart

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

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

maxInvalidPasswordAttempts="5"
passwordAttemptWindow="10"

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top