Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Замечание
С момента написания этой статьи, поставщики членства ASP.NET были заменены на ASP.NET Identity. Настоятельно рекомендуется обновлять приложения для использования платформы ASP.NET Identity вместо поставщиков членства, которые использовались на момент написания этой статьи. ASP.NET Identity имеет ряд преимуществ по сравнению с системой членства ASP.NET, в том числе:
- Улучшенная производительность
- Улучшенная расширяемость и возможность тестирования
- Поддержка OAuth, OpenID Connect и двухфакторной проверки подлинности
- Поддержка идентификации на основе утверждений
- Улучшение взаимодействия с ASP.Net Core
В этом руководстве мы рассмотрим, как проверить учетные данные пользователя в хранилище пользователей членства с помощью программных средств и элемента управления входа. Мы также рассмотрим, как настроить внешний вид и поведение элемента управления входа.
Введение
В предыдущем руководстве мы рассмотрели, как создать новую учетную запись пользователя в платформе членства. Сначала мы рассмотрели программное создание учетных записей пользователей с помощью Membership метода класса CreateUser , а затем изучили с помощью веб-элемента управления CreateUserWizard Web. Однако страница входа в настоящее время проверяет предоставленные учетные данные в жестко закодированном списке пар имени пользователя и пароля. Нам нужно обновить логику страницы входа, чтобы она проверяла учетные данные в хранилище пользователей платформы членства.
Как и при создании учетных записей пользователей, учетные данные можно проверять программным способом или декларативно. API членства включает метод программной проверки учетных данных пользователя в хранилище пользователей. И ASP.NET поставляется с веб-элементом управления login, который отображает пользовательский интерфейс с текстовыми полями для имени пользователя и пароля и кнопкой для входа.
В этом руководстве мы рассмотрим, как проверить учетные данные пользователя в хранилище пользователей членства с помощью программных средств и элемента управления входа. Мы также рассмотрим, как настроить внешний вид и поведение элемента управления входа. Давайте приступим!
Шаг 1. Проверка учетных данных в хранилище данных о пользователях членства
Для веб-сайтов, использующих проверку подлинности форм, пользователь входит на веб-сайт, перейдя на страницу входа и введя свои учетные данные. Затем эти учетные данные сравниваются с пользовательским хранилищем. Если они действительны, пользователь получает билет проверки подлинности форм, который является маркером безопасности, указывающим удостоверение и подлинность посетителя.
Чтобы проверить пользователя на платформе членства, используйте Membership метод классаValidateUser. Метод ValidateUser принимает два входных параметра — username и password — и возвращает логическое значение, указывающее, допустимы ли учетные данные. Как и в случае с методом CreateUser, рассмотренным в предыдущем руководстве, метод ValidateUser делегирует фактическую валидацию настроенному поставщику системы членства.
Компонент SqlMembershipProvider проверяет предоставленные учетные данные; для этого он получает пароль указанного пользователя с помощью хранимой процедуры aspnet_Membership_GetPasswordWithFormat. Помните, что SqlMembershipProvider пароли пользователей хранятся в одном из трех форматов: в открытом виде, зашифрованном или хэшированном. Хранимая aspnet_Membership_GetPasswordWithFormat процедура возвращает пароль в его необработанном формате. Для зашифрованных или хэшированных паролей SqlMembershipProvider преобразует значение password, переданное в метод ValidateUser, в его эквивалентное зашифрованное или хэшированное состояние, а затем сравнивает это с тем, что возвращено из базы данных. Если пароль, хранящийся в базе данных, совпадает с отформатированным паролем, введенным пользователем, учетные данные действительны.
Обновим страницу входа (~/Login.aspx), чтобы проверить предоставленные учетные данные в хранилище пользователей платформы членства. Мы создали эту страницу входа в учебнике по проверке подлинности форм, создав интерфейс с двумя текстовыми полями для имени пользователя и пароля, флажком "Запомнить меня" и кнопкой входа (см. рис. 1). Код проверяет введенные учетные данные в жестко закодированном списке пар имени пользователя и пароля (Scott/password, Jisun/password и Sam/password).
Рис. 1. Интерфейс страницы входа включает два текстовых поля, checkBoxList и кнопку (нажмите, чтобы просмотреть изображение полного размера)
Пользовательский интерфейс страницы входа может оставаться неизменным, но нам нужно заменить обработчик событий кнопки Click входа кодом, который проверяет пользователя в хранилище пользователей платформы членства. Обновите обработчик событий, чтобы его код отображалось следующим образом:
Protected Sub LoginButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LoginButton.Click
' Validate the user against the Membership framework user store
If Membership.ValidateUser(UserName.Text, Password.Text) Then
' Log the user into the site
FormsAuthentication.RedirectFromLoginPage(UserName.Text, RememberMe.Checked)
End If
' If we reach here, the user's credentials were invalid
InvalidCredentialsMessage.Visible = True
End Sub
Этот код удивительно прост. Начнем с вызова метода Membership.ValidateUser, передавая в него предоставленные имя пользователя и пароль. Если этот метод возвращает значение True, пользователь вошел на сайт с помощью FormsAuthentication метода RedirectFromLoginPage класса. (Как мы обсуждали в Обзоре руководства по проверке подлинности форм, FormsAuthentication.RedirectFromLoginPage создает билет проверки подлинности форм, а затем перенаправляет пользователя на соответствующую страницу.) Если учетные данные недопустимы, отображается метка InvalidCredentialsMessage, сообщая пользователю, что имя пользователя или пароль неверны.
Вот и всё!
Чтобы проверить, работает ли страница входа должным образом, попытайтесь войти с помощью одной из учетных записей пользователей, созданных в предыдущем руководстве. Или, если вы еще не создали учетную запись, перейдите к созданию учетной записи и создайте ее на ~/Membership/CreatingUserAccounts.aspx странице.
Замечание
Когда пользователь вводит свои учетные данные и отправляет форму страницы входа, учетные данные, включая пароль, передаются через Интернет на веб-сервер в виде обычного текста. Это означает, что любой хакер, прослушивающий сетевой трафик, может видеть имя пользователя и пароль. Чтобы предотвратить это, необходимо зашифровать сетевой трафик с помощью протоколов SSL. Это гарантирует, что учетные данные (а также разметка HTML всей страницы) шифруются с момента их выхода из браузера, пока они не будут получены веб-сервером.
Как платформа членства обрабатывает недопустимые попытки входа
Когда посетитель достигает страницы входа и отправляет свои учетные данные, браузер отправляет HTTP-запрос на страницу входа. Если учетные данные действительны, http-ответ включает запрос проверки подлинности в файл cookie. Таким образом, хакер, пытающийся взломать сайт, может создать программу, которая исчерпывающим образом отправляет HTTP-запросы на страницу входа с допустимым именем пользователя и предположением по паролю. Если угадать пароль правильно, страница входа вернет файл cookie запроса проверки подлинности, в какой момент программа знает, что наткнулся на допустимую пару имени пользователя и пароля. Благодаря принудительному подбору такой программы может быть в состоянии наткнуться на пароль пользователя, особенно если пароль слаб.
Чтобы предотвратить такие атаки методом подбора, фреймворк Membership блокирует пользователя, если в течение определенного периода времени было совершено определенное количество неудачных попыток входа. Точные параметры можно настроить с помощью следующих двух параметров конфигурации поставщика членства:
-
maxInvalidPasswordAttempts— указывает, сколько недопустимых попыток пароля разрешено пользователю за период времени до блокировки учетной записи. Значение по умолчанию — 5. -
passwordAttemptWindow— указывает период времени в минутах, в течение которого указанное число недопустимых попыток входа приведет к блокировке учетной записи. Значение по умолчанию — 10.
Если пользователь заблокирован, она не сможет войти, пока администратор не разблокирует ее учетную запись. Если пользователь заблокирован, метод ValidateUser всегда возвращает False, даже если указаны правильные учетные данные. Хотя такое поведение уменьшает вероятность того, что хакер взламывает ваш сайт с помощью методов грубой силы, оно может в конечном итоге заблокировать законного пользователя, который просто забыл свой пароль, случайно включил Caps Lock или у которого неудачный день для набора текста.
К сожалению, встроенное средство для разблокировки учетной записи пользователя отсутствует. Чтобы разблокировать учетную запись, можно напрямую изменить базу данных — изменить IsLockedOut поле в aspnet_Membership таблице для соответствующей учетной записи пользователя или создать веб-интерфейс, который содержит заблокированные учетные записи с параметрами разблокировки. Мы рассмотрим создание административных интерфейсов для выполнения общих задач, связанных с учетной записью пользователя и ролями, в будущем руководстве.
Замечание
Одним из недостатков ValidateUser метода является то, что если предоставленные учетные данные недопустимы, он не предоставляет никаких объяснений о том, почему. Учетные данные могут быть недопустимыми, так как в хранилище пользователей отсутствует соответствующая пара имени пользователя или пароля, или из-за того, что пользователь еще не утвержден, или так как пользователь был заблокирован. На шаге 4 мы посмотрим, как отобразить более подробное сообщение пользователю при сбое попытки входа.
Шаг 2. Сбор учетных данных с помощью веб-элемента управления входа
Сетевой элемент управления Login отображает пользовательский интерфейс по умолчанию, аналогичный тому, который мы создали в руководстве Обзор проверки подлинности форм. Используя элемент управления входа, мы сохраняем работу над созданием интерфейса для сбора учетных данных посетителя. Кроме того, элемент управления входом автоматически авторизует пользователя (при условии, что предоставленные учетные данные действительны), благодаря чему нам не нужно писать дополнительный код.
Давайте обновим Login.aspx, заменив созданный вручную интерфейс и код элементом управления Login. Начните с удаления существующей разметки и кода в Login.aspx. Вы можете удалить его или просто закомментировать его. Чтобы закомментировать декларативную разметку, окружите ее разделителями <%-- и --%>. Вы можете ввести эти разделители вручную или, как показано на рисунке 2, можно выбрать текст, чтобы закомментировать, а затем щелкнуть значок "Закомментировать выбранные строки" на панели инструментов. Аналогичным образом можно использовать значок "Закомментировать выбранные строки", чтобы закомментировать выбранный код в классе code-behind.
Рис. 2. Закомментируйте существующую декларативную разметку и исходный код в Login.aspx (щелкните, чтобы просмотреть полноразмерное изображение)
Замечание
Значок "Закомментировать выбранные строки" недоступен при просмотре декларативной разметки в Visual Studio 2005. Если вы не используете Visual Studio 2008, необходимо вручную добавить разделители <%-- и --%>.
Затем перетащите элемент управления "Вход" из панели элементов на страницу и задайте для свойства значение IDmyLogin. На этом этапе экран должен выглядеть примерно так, как на рис. 3. Обратите внимание, что интерфейс элемента управления входа по умолчанию включает текстовые поля TextBox для имени пользователя и пароля, флажок "Запомнить меня в следующий раз" и кнопку "Вход". Существуют также RequiredFieldValidator элементы управления для двух текстовых полей.
Рис. 3. Добавление элемента управления входа на страницу (щелкните, чтобы просмотреть изображение полного размера)
Ну вот и всё! При нажатии кнопки "Вход" элемента управления "Вход" происходит postback, и элемент управления "Вход" вызовет метод Membership.ValidateUser, передавая введенное имя пользователя и пароль. Если учетные данные недопустимы, элемент управления "Вход" отображает сообщение, указывающее такое. Однако если учетные данные действительны, элемент управления "Вход" создает запрос проверки подлинности форм и перенаправляет пользователя на соответствующую страницу.
Элемент управления входа использует четыре фактора, чтобы определить соответствующую страницу для перенаправления пользователя в случае успешного входа:
- Указывает, находится ли элемент управления "Вход" на странице входа, как определено настройкой
loginUrlв конфигурации проверки подлинности форм; значение этого параметра по умолчаниюLogin.aspx. - Наличие
ReturnUrlпараметра querystring - Значение свойства элемента управления Login
DestinationUrl - Значение
defaultUrl, указанное в параметрах конфигурации проверки подлинности форм; значение по умолчанию этого параметра — Default.aspx
На рисунке 4 показано, как элемент управления входа использует эти четыре параметра для получения соответствующего решения страницы.
Рис. 4. Добавление элемента управления входа на страницу (щелкните, чтобы просмотреть изображение полного размера)
Проверьте элемент управления "Вход", перейдя на сайт через браузер и войдите в систему в качестве существующего пользователя в платформе членства.
Отрисованный интерфейс элемента управления login можно настроить с высокой степенью настройки. Существует ряд свойств, влияющих на его внешний вид; Более того, элемент управления входа можно преобразовать в шаблон для точного управления макетом элементов пользовательского интерфейса. Оставшаяся часть этого шага проверяет, как настроить внешний вид и макет.
Настройка внешнего вида элемента управления входа
Параметры свойств элемента управления входа по умолчанию отрисовывают пользовательский интерфейс с заголовком (вход в систему), текстовым полем и меткой для входных данных имени пользователя и пароля, флажком "Запомнить меня в следующий раз" и кнопкой "Войти". Внешний вид этих элементов можно настроить с помощью многочисленных свойств элемента управления Login. Кроме того, можно добавить дополнительные элементы пользовательского интерфейса, например ссылку на страницу для создания новой учетной записи пользователя, задав свойство или два.
Давайте уделим немного времени, чтобы улучшить внешний вид нашего элемента управления Login. Так как страница Login.aspx уже содержит текст в верхней части страницы, где указано имя входа, заголовок элемента управления входа является лишним. Таким образом, удалите значение свойства TitleText, чтобы удалить заголовок элемента управления входа.
Имя пользователя и пароль: метки слева от двух элементов управления TextBox можно настроить с помощью UserNameLabelText и PasswordLabelText свойств соответственно. Давайте изменим имя пользователя: метка для чтения имени пользователя:. Стили Label и TextBox настраиваются с помощью LabelStyle и TextBoxStyle свойств соответственно.
Свойство текста CheckBox "Запомнить меня в следующий раз" можно задать через свойство RememberMeText элемента управления Login, а состояние по умолчанию "проверено" можно настроить с помощью свойства RememberMeSet (по умолчанию оно имеет значение False). Просто задайте для свойства RememberMeSet значение True, чтобы флажок "Запомнить меня в следующий раз" был установлен по умолчанию.
Элемент управления "Вход" предлагает два свойства для изменения макета элементов интерфейса пользователя.
СвойствоTextLayout указывает, отображаются ли метки Имя пользователя: и Пароль: слева от соответствующих текстовых полей (по умолчанию) или над ними.
СвойствоOrientation указывает, расположены ли входные данные имени пользователя и пароля по вертикали (один над другим) или горизонтально. Я собираюсь оставить эти два свойства заданными по умолчанию, но я призываю вас попытаться задать эти два свойства в их значениях, отличных от по умолчанию, чтобы увидеть результирующий эффект.
Замечание
В следующем разделе Настройка макета элемента управления входом мы рассмотрим использование шаблонов для определения точного макета элементов пользовательского интерфейса элемента управления макетом.
Завершите настройку свойств элемента управления входа, установив для свойств ~/Membership/CreatingUserAccounts.aspx, соответственно. Это добавляет гиперссылку на интерфейс элемента управления входа, указывающий на страницу, созданную в предыдущем руководстве. Элемент управления HelpPageText, а также его свойства HelpPageUrl и PasswordRecoveryText, и свойства PasswordRecoveryUrl работают одинаково, создавая ссылки на страницу справки и страницу восстановления пароля.
После внесения этих изменений в свойство декларативная разметка и внешний вид элемента управления Login должен выглядеть примерно так, как показано на рис. 5.
Рис. 5. Значения свойств элемента управления входа определяют его внешний вид (щелкните, чтобы просмотреть изображение полного размера)
Настройка макета элемента управления входа
Пользовательский интерфейс веб-контрола управления входом по умолчанию отображает интерфейс в HTML <table>. Но что делать, если нам нужен более тонкий контроль над результатом вывода? Может быть, мы хотим заменить <table> на ряд тегов <div>. Или что делать, если приложению требуются дополнительные учетные данные для проверки подлинности? Например, многие финансовые веб-сайты требуют, чтобы пользователи предоставляли не только имя пользователя и пароль, но и личный идентификационный номер (ПИН-код) или другую информацию для идентификации. Независимо от того, какие причины могут быть, можно преобразовать элемент управления Login в шаблон, из которого можно явно определить декларативную разметку интерфейса.
Для обновления элемента управления входа необходимо выполнить два действия, чтобы получить дополнительные учетные данные:
- Обновите интерфейс элемента управления входа, чтобы включить веб-элементы управления, чтобы получить дополнительные учетные данные.
- Переопределите внутреннюю логику проверки подлинности элемента управления входа, чтобы пользователь прошел проверку подлинности только в том случае, если его имя пользователя и пароль действительны, а также их дополнительные учетные данные.
Чтобы выполнить первую задачу, необходимо преобразовать элемент управления login в шаблон и добавить необходимые веб-элементы управления. Что касается второй задачи, логика проверки подлинности элемента управления входа может быть заменена путем создания обработчика событий для события элемента управленияAuthenticate.
Давайте обновим элемент управления входа, чтобы он запрашивал пользователям имя пользователя, пароль и адрес электронной почты, а также проверял подлинность пользователя, если указанный адрес электронной почты совпадает с адресом электронной почты в файле. Сначала необходимо преобразовать интерфейс элемента управления входа в шаблон. В смарт-теге элемента управления "Вход" выберите параметр "Преобразовать в шаблон".
Рис. 6. Преобразование элемента управления входа в шаблон (щелкните, чтобы просмотреть изображение полного размера)
Замечание
Чтобы вернуть элемент управления входа в его дошаблонную версию, щелкните на ссылку "Сброс" в смарт-теге элемента управления.
Преобразование элемента управления Login в шаблон добавляет в декларативную разметку этого элемента управления элементы HTML и веб-контролы, определяющие пользовательский интерфейс. Как показано на рисунке 7, преобразование элемента управления в шаблон удаляет ряд свойств из окна свойств, таких как TitleTextCreateUserUrl, и т. д., так как эти значения свойств игнорируются при использовании шаблона.
Рис. 7. Меньше свойств доступны при преобразовании элемента управления входа в шаблон (щелкните, чтобы просмотреть изображение полного размера)
Разметка HTML в LayoutTemplate может быть изменена по мере необходимости. Аналогичным образом вы можете добавить новые веб-элементы управления в шаблон. Однако важно, чтобы основные веб-элементы управления входа оставались в шаблоне и сохраняли их назначенные ID значения. В частности, не удаляйте и не переименовывайте TextBox UserName или Password, CheckBox RememberMe, Button LoginButton, Label FailureText или другие элементы управления RequiredFieldValidator.
Чтобы собрать адрес электронной почты посетителя, необходимо добавить текстовое поле в шаблон. Добавьте следующую декларативную разметку между строкой таблицы (<tr>), содержащей Password текстовое поле и строку таблицы, в которой хранится флажок "Запомнить меня в следующий раз":
<tr>
<td align="right">
<asp:Label ID="EmailLabel" runat="server" AssociatedControlID="Email">Email:</asp:Label>
</td>
<td>
<asp:TextBox ID="Email" runat="server"></asp:TextBox>
<asp:RequiredFieldValidator ID="EmailRequired" runat="server"
ControlToValidate="Email" ErrorMessage="Email is required."
ToolTip="Email is required." ValidationGroup="myLogin">*</asp:RequiredFieldValidator>
</td>
</tr>
После добавления Email TextBox посетите страницу через браузер. Как показано на рисунке 8, пользовательский интерфейс элемента управления входа теперь включает в себя третье текстовое поле.
Рис. 8. Элемент управления входа теперь содержит текстовое поле для адреса электронной почты пользователя (щелкните, чтобы просмотреть изображение полного размера)
На этом этапе элемент управления входа по-прежнему использует Membership.ValidateUser метод для проверки предоставленных учетных данных. Соответственно, значение, введенное в Email TextBox, не имеет никакого отношения к тому, может ли пользователь войти в систему. На шаге 3 мы рассмотрим, как переопределить логику проверки подлинности элемента управления входа, чтобы учетные данные рассматривались только в том случае, если имя пользователя и пароль действительны, а указанный адрес электронной почты совпадает с адресом электронной почты в файле.
Шаг 3. Изменение логики проверки подлинности элемента управления входа
Когда посетитель предоставляет свои учетные данные и нажимает кнопку "Войти", выполняется обратная передача данных, и модуль входа проходит через рабочий процесс проверки подлинности. Рабочий процесс начинается с вызова LoggingIn события. Любые обработчики событий, связанные с этим событием, могут отменить операцию входа, установив свойство e.Cancel в True.
Если операция входа не отменена, рабочий процесс выполняется путем вызова Authenticate события. Если для события есть обработчик Authenticate событий, он отвечает за определение допустимости предоставленных учетных данных. Если обработчик событий не указан, элемент управления Login использует метод Membership.ValidateUser для определения допустимости учетных данных.
Если предоставленные учетные данные действительны, создается запрос проверки подлинности форм, LoggedIn событие вызывается и пользователь перенаправляется на соответствующую страницу. Однако если учетные данные считаются недействительными, то событие возникает, LoginError и отображается сообщение, информирующее пользователя о том, что их учетные данные были недействительными. По умолчанию, при сбое элемент управления Login просто устанавливает свойство Text элемента управления Label на сообщение об ошибке («Ваш вход не был успешным. Пожалуйста, попробуйте еще раз»). Однако, если для свойства элемента управления Login задано RedirectToLoginPage, то элемент управления Login выдает Response.Redirect, направляя на страницу входа и добавляя параметр loginfailure=1 в строку запроса (что приводит к отображению сообщения об ошибке этого элемента управления).
На рисунке 9 представлена блок-схема рабочего процесса проверки подлинности.
Рис. 9. Рабочий процесс проверки подлинности элемента управления входа (щелкните, чтобы просмотреть изображение полного размера)
Замечание
Если вы интересуетесь, когда вы бы использовали опцию страницы FailureActionRedirectToLogin, рассмотрите следующий сценарий. Сейчас на нашей Site.master главной странице в левом столбце отображается текст "Здравствуйте, незнакомец," когда её посещает анонимный пользователь. Представьте, что мы хотели бы заменить этот текст на элемент управления входом. Это позволит анонимному пользователю войти с любой страницы на сайте, а не требовать непосредственного посещения страницы входа. Однако если пользователю не удалось войти с помощью элемента управления входа, отображаемого главной страницей, может потребоваться перенаправить их на страницу входа (Login.aspx), так как эта страница, скорее всего, включает дополнительные инструкции, ссылки и другую справку , например ссылки на создание новой учетной записи или получение потерянного пароля , которые не были добавлены на главную страницу.
Создание обработчикаAuthenticateсобытий
Для того чтобы интегрировать нашу пользовательскую логику проверки подлинности, необходимо создать обработчик для события Authenticate элемента управления входа. Создание обработчика для события Authenticate приведет к следующему определению обработчика событий:
Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate
End Sub
Как видно, Authenticate обработчик событий передает объект типа AuthenticateEventArgs в качестве второго входного параметра. Класс AuthenticateEventArgs содержит логическое свойство с именем Authenticated , которое используется для указания допустимости предоставленных учетных данных. Наша задача заключается в том, чтобы написать код здесь, который определяет, являются ли предоставленные учетные данные допустимыми или нет, и задать e.Authenticate свойство соответствующим образом.
Определение и проверка предоставленных учетных данных
Используйте элемент управления UserName и свойства Password, чтобы определить учетные данные имени пользователя и пароля, введенные пользователем. Чтобы определить значения, введенные в любые дополнительные веб-элементы управления (например Email , TextBox, добавленные на предыдущем шаге), используйте ( LoginControlID.FindControl"controlID") для получения программной ссылки на веб-элемент управления в шаблоне, свойство которого ID равно controlID. Например, чтобы получить ссылку на Email TextBox, используйте следующий код:
Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)
Чтобы проверить учетные данные пользователя, необходимо выполнить две действия:
- Убедитесь, что указанные имя пользователя и пароль допустимы
- Убедитесь, что введенный адрес электронной почты соответствует адресу электронной почты в файле для пользователя, пытающегося войти в систему.
Чтобы выполнить первую проверку, мы можем просто использовать Membership.ValidateUser метод, как мы видели на шаге 1. Для второй проверки необходимо определить адрес электронной почты пользователя, чтобы сравнить его с адресом электронной почты, введенным в элемент управления TextBox. Чтобы получить сведения о конкретном пользователе, используйте Membership метод классаGetUser.
Метод GetUser имеет ряд перегрузок. Если он используется без передачи параметров, он возвращает сведения о пользователе, вошедшего в систему. Чтобы получить сведения о конкретном пользователе, вызовите GetUser, передав его имя пользователя. В любом случае GetUser возвращает MembershipUser объект, имеющий такие свойства, как UserName, Email, IsApprovedи IsOnlineт. д.
Следующий код реализует эти две проверки. Если оба условия выполнены, то e.Authenticate присваивается значение True, в противном случае ему присваивается False.
Protected Sub myLogin_Authenticate(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.AuthenticateEventArgs) Handles myLogin.Authenticate
' Get the email address entered
Dim EmailTextBox As TextBox = CType(myLogin.FindControl("Email"), TextBox)
Dim email As String = EmailTextBox.Text.Trim()
' Verify that the username/password pair is valid
If Membership.ValidateUser(myLogin.UserName, myLogin.Password) Then
' Username/password are valid, check email
Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)
If usrInfo IsNot Nothing AndAlso String.Compare(usrInfo.Email, email, True) = 0 Then
' Email matches, the credentials are valid
e.Authenticated = True
Else
' Email address is invalid...
e.Authenticated = False
End If
Else
' Username/password are not valid...
e.Authenticated = False
End If
End Sub
С помощью этого кода попытайтесь войти в систему в качестве допустимого пользователя, введя правильное имя пользователя, пароль и адрес электронной почты. Повторите попытку, но на этот раз используйте неправильный адрес электронной почты (см. рис. 10). Наконец, попробуйте в третий раз использовать несуществующее имя пользователя. В первом случае вы должны успешно войти на сайт, но в последних двух случаях вы увидите сообщение с недопустимыми учетными данными элемента управления входа.
Рис. 10. Tito не удается войти при указании неправильного адреса электронной почты (щелкните, чтобы просмотреть изображение полного размера)
Замечание
Как описано в разделе "Как платформа членства обрабатывает недопустимые попытки входа" на шаге 1, когда Membership.ValidateUser метод вызывается и передает недопустимые учетные данные, он отслеживает недопустимую попытку входа и блокирует пользователя, если он превышает определенное пороговое значение недопустимых попыток в течение указанного периода времени. Так как наша пользовательская логика проверки подлинности вызывает ValidateUser метод, неправильный пароль для допустимого имени пользователя увеличивает недопустимый счетчик попыток входа, но этот счетчик не увеличивается в случае, если имя пользователя и пароль допустимы, но адрес электронной почты неверный. Скорее всего, такое поведение оправдано, так как маловероятно, что хакер знает имя пользователя и пароль, но ему придется использовать методы перебора для определения адреса электронной почты пользователя.
Шаг 4. Улучшение сообщения о недопустимых учетных данных контрола входа
Когда пользователь пытается войти с недопустимыми учетными данными, элемент управления "Вход" отображает сообщение, объясняющее, что попытка входа была неудачной. В частности, элемент управления отображает сообщение, указанное его FailureText свойством, которое по умолчанию определено как "Ваше значение для входа не было успешным". Повторите попытку.
Помните, что существует множество причин, по которым учетные данные пользователя могут быть недопустимыми:
- Имя пользователя может не существовать
- Имя пользователя существует, но пароль недопустим.
- Имя пользователя и пароль допустимы, но пользователь еще не утвержден
- Имя пользователя и пароль допустимы, но пользователь заблокирован (скорее всего, из-за превышения количества недопустимых попыток входа в течение указанного интервала времени)
При использовании пользовательской логики проверки подлинности могут возникнуть другие причины. Например, с кодом, написанным на шаге 3, имя пользователя и пароль могут быть допустимыми, но адрес электронной почты может быть неверным.
Независимо от того, почему учетные данные недопустимы, элемент управления "Вход" отображает одно и то же сообщение об ошибке. Это отсутствие отзывов может быть запутано для пользователя, чья учетная запись еще не утверждена или кто был заблокирован. Однако при работе с элементом управления "Вход" можно отобразить более подходящее сообщение.
Всякий раз, когда пользователь пытается войти с недопустимыми учетными данными, элемент управления вход вызывает событие LoginError. Давайте создадим обработчик событий для этого события и добавьте следующий код:
Protected Sub myLogin_LoginError(ByVal sender As Object, ByVal e As System.EventArgs) Handles myLogin.LoginError
' Determine why the user could not login...
myLogin.FailureText = "Your login attempt was not successful. Please try again."
' Does there exist a User account for this user?
Dim usrInfo As MembershipUser = Membership.GetUser(myLogin.UserName)
If usrInfo IsNot Nothing Then
' Is this user locked out?
If usrInfo.IsLockedOut Then
myLogin.FailureText = "Your account has been locked out because of too many invalid login attempts. Please contact the administrator to have your account unlocked."
ElseIf Not usrInfo.IsApproved Then
myLogin.FailureText = "Your account has not yet been approved. You cannot login until an administrator has approved your account."
End If
End If
End Sub
Приведенный выше код начинается с задания свойства элемента управления FailureText входа значением по умолчанию (попытка входа не прошла успешно. Повторите попытку). Затем он проверяет, сопоставляется ли имя пользователя с существующей учетной записью пользователя. Если да, он обращается к результирующему объекту MembershipUser и свойствам IsLockedOut и IsApproved, чтобы определить, заблокирована ли учетная запись или еще не утверждена. В любом случае FailureText свойство обновляется до соответствующего значения.
Чтобы протестировать этот код, намеренно попытайтесь войти в систему в качестве существующего пользователя, но используйте неправильный пароль. Выполните это пять раз подряд в течение 10-минутного интервала, и учетная запись будет заблокирована. Как показано на рисунке 11, последующие попытки входа всегда завершаются ошибкой (даже с правильным паролем), но теперь будет отображаться более информативное сообщение: ваша учетная запись была заблокирована из-за слишком большого количества недопустимых попыток входа. Обратитесь к администратору, чтобы разблокировать вашу учетную запись.
Рис. 11. Tito выполнил слишком много недопустимых попыток входа и был заблокирован (щелкните, чтобы просмотреть изображение полного размера)
Сводка
До этого руководства наша страница входа проверила предоставленные учетные данные в жестко закодированном списке пар имени пользователя и пароля. В этом руководстве мы обновили страницу для проверки учетных данных в рамках платформы членства. На шаге 1 мы рассмотрели использование метода Membership.ValidateUser программно. На шаге 2 мы заменили созданный вручную пользовательский интерфейс и код элементом управления Login.
Элемент управления входа отображает стандартный пользовательский интерфейс входа и автоматически проверяет учетные данные пользователя в рамках платформы членства. Кроме того, в случае допустимых учетных данных элемент управления входа подписывает пользователя с помощью проверки подлинности форм. Короче говоря, полнофункциональный пользовательский интерфейс входа доступен путем простого перетаскивания элемента управления "Вход" на страницу, без дополнительной декларативной разметки или кода. Кроме того, логин-контрол высоко настраиваемый, что позволяет точно контролировать как визуальный интерфейс, так и логику аутентификации.
На этом этапе посетители нашего веб-сайта могут создать новую учетную запись пользователя и войти на сайт, но мы еще не рассмотрели ограничение доступа к страницам на основе прошедшего проверку подлинности пользователя. В настоящее время любой пользователь, прошедший проверку подлинности или анонимный, может просматривать любую страницу на нашем сайте. Наряду с контролем доступа к страницам нашего сайта для каждого пользователя отдельно, у нас могут быть определенные страницы, функциональность которых зависит от пользователя. В следующем руководстве объясняется, как ограничить доступ и функциональность на странице в зависимости от вошедшего пользователя.
Счастливое программирование!
Дальнейшее чтение
Дополнительные сведения о разделах, описанных в этом руководстве, см. в следующих ресурсах:
- Отображение настраиваемых сообщений для заблокированных и не утвержденных пользователей
- Изучение системы членства, ролей и профилей в ASP.NET 2.0
- Практическое руководство. Создание страницы входа ASP.NET
- Техническая документация по контролю входа
- Использование элементов управления входа
Сведения о авторе
Скотт Митчелл, автор нескольких книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с технологиями Microsoft Web с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга — Sams Teach Yourself ASP.NET 2.0 за 24 часа. Со Скоттом можно связаться по mitchell@4guysfromrolla.com или через его блог на http://ScottOnWriting.NET.
Особое спасибо кому
Эта серия учебников была проверена многими полезными рецензентами. Ведущими рецензентами этого руководства были Тереса Мерфи и Майкл Оливеро. Хотите просмотреть мои предстоящие статьи MSDN? Если да, напишите мне на mitchell@4GuysFromRolla.com.