Восстановление и смена паролей (C#)

Скотт Митчелл

Примечание

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

  • более высокая производительность;
  • Улучшенная расширяемость и тестируемость
  • Поддержка OAuth, OpenID Connect и двухфакторной проверки подлинности
  • Поддержка удостоверений на основе утверждений
  • Улучшенное взаимодействие с ASP.Net Core

ASP.NET включает два веб-элемента управления для помощи в восстановлении и изменении паролей. Элемент управления PasswordRecovery позволяет посетителю восстановить потерянный пароль. Элемент управления ChangePassword позволяет пользователю обновить свой пароль. Как и другие веб-элементы управления, связанные с именем входа, которые мы видели в этой серии руководств, элементы управления PasswordRecovery и ChangePassword работают с платформой членства в фоновом режиме для сброса или изменения паролей пользователей.

Введение

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

ASP.NET включает два веб-элемента управления для помощи в восстановлении и изменении паролей. Элемент управления PasswordRecovery позволяет посетителю восстановить потерянный пароль. Элемент управления ChangePassword позволяет пользователю обновить свой пароль. Как и другие веб-элементы управления, связанные с именем входа, которые мы видели в этой серии руководств, элементы управления PasswordRecovery и ChangePassword работают с платформой членства в фоновом режиме для сброса или изменения паролей пользователей.

В этом руководстве мы рассмотрим использование этих двух элементов управления. Мы также посмотрим, как программно изменить и сбросить пароль пользователя с помощью MembershipUser методов и ResetPassword класса ChangePassword .

Шаг 1. Помощь пользователям в восстановлении потерянных паролей

Все веб-сайты, поддерживающие учетные записи пользователей, должны предоставлять пользователям какой-то механизм для восстановления забытых паролей. Хорошая новость заключается в том, что реализация таких функций в ASP.NET является простой благодаря веб-элементу управления PasswordRecovery. Элемент управления PasswordRecovery отображает интерфейс, который запрашивает у пользователя имя пользователя и, при необходимости, ответ на его контрольный вопрос. Затем он отправляет пользователю пароль по электронной почте.

Примечание

Так как сообщения электронной почты передаются по сети в виде обычного текста, при отправке пароля пользователя по электронной почте возникают риски безопасности.

Элемент управления PasswordRecovery состоит из трех представлений:

  • UserName — запрашивает у посетителя имя пользователя. Это исходное представление.
  • Вопрос — отображает имя пользователя и контрольный вопрос в виде текста, а также текстовое поле, чтобы пользователь ввел ответ на свой контрольный вопрос.
  • Успешно— отображает сообщение, информирующее пользователя о том, что пароль отправлен по электронной почте.

Отображаемые представления и действия, выполняемые элементом управления PasswordRecovery, зависят от следующих параметров конфигурации членства:

  • RequiresQuestionAndAnswer
  • EnablePasswordRetrieval
  • EnablePasswordReset

Параметр платформы RequiresQuestionAndAnswer членства указывает, должны ли пользователи указывать контрольный вопрос и ответ при регистрации учетной записи. Как мы говорили в руководстве По созданию учетных записей пользователей, если RequiresQuestionAndAnswer имеет значение True (по умолчанию), интерфейс CreateUserWizard включает элементы управления TextBox для контрольного вопроса и ответа нового пользователя; если RequiresQuestionAndAnswer имеет значение False, такая информация не собирается. Аналогичным образом, если RequiresQuestionAndAnswer имеет значение True, элемент управления PasswordRecovery отображает представление вопросов после ввода пользователем имени пользователя. Пароль восстанавливается только в том случае, если пользователь введет правильный ответ безопасности. Однако RequiresQuestionAndAnswer если имеет значение False, элемент управления PasswordRecovery перемещается прямо из представления UserName в представление Успешно.

После того как пользователь указал свое имя пользователя или его имя пользователя и ответ безопасности, если RequiresQuestionAndAnswer имеет значение True, passwordRecovery отправляет пользователю его пароль по электронной почте. EnablePasswordRetrieval Если для параметра задано значение True, пользователю будет отправляться текущий пароль по электронной почте. Если задано значение False и EnablePasswordReset значение True, то элемент управления PasswordRecovery создает новый случайный пароль для пользователя и отправляет ему этот новый пароль по электронной почте. Если оба EnablePasswordRetrieval значения и EnablePasswordReset имеют значение False, элемент управления PasswordRecovery создает исключение.

Примечание

Напомним SqlMembershipProvider , что пароли пользователей хранятся в одном из трех форматов: Clear, Hashed (по умолчанию) или Encrypted. Используемый механизм хранения зависит от параметров конфигурации членства; демонстрационное приложение использует формат хэшированного пароля. При использовании формата EnablePasswordRetrieval хэшированного пароля параметру необходимо задать значение False, так как система не может определить фактический пароль пользователя из хэшируемой версии, хранящейся в базе данных.

На рисунке 1 показано, как интерфейс и поведение PasswordRecovery зависит от конфигурации членства.

RequiresQuestionAndAnswer, EnablePasswordRetrieval и EnablePasswordReset влияют на внешний вид и поведение элемента управления PasswordRecovery

Рис. 1. RequiresQuestionAndAnswerEnablePasswordRetrievalВнешний вид и поведение элемента управления PasswordRecovery , и EnablePasswordReset (щелкните для просмотра полноразмерного изображения)

Примечание

В учебнике Создание схемы членства в SQL Server мы настроили поставщик членства, задав RequiresQuestionAndAnswer значение True, EnablePasswordRetrieval Значение False и EnablePasswordReset Значение True.

Использование элемента управления PasswordRecovery

Рассмотрим использование элемента управления PasswordRecovery на странице ASP.NET. Откройте RecoverPassword.aspx и перетащите элемент управления PasswordRecovery с панели элементов на Designer; задайте для этого IDRecoverPwdэлемента значение . Как и веб-элементы управления Login и CreateUserWizard, представления элемента управления PasswordRecovery отображают многофункциональный составной интерфейс, включающий элементы управления Labels, TextBoxes, Button и validation. Внешний вид представлений можно настроить с помощью свойств стиля элемента управления или путем преобразования представлений в шаблоны. Я оставляю это как упражнение для заинтересованного читателя.

Когда пользователь посещает эту страницу, он вводит свое имя пользователя и нажимает кнопку Отправить. Так как в параметрах конфигурации членства для свойства задано RequiresQuestionAndAnswer значение True, элемент управления PasswordRecovery отобразит представление вопросов. Когда пользователь введет правильный ответ системы безопасности и нажмет кнопку Отправить, элемент управления PasswordRecovery обновит пароль пользователя на случайно созданный и отправит его по электронной почте на адрес электронной почты в файле. Все это было возможно без написания одной строки кода!

Перед тестированием этой страницы есть один последний элемент конфигурации: необходимо указать параметры доставки почты в Web.config. Элемент управления PasswordRecovery использует эти параметры для отправки сообщения электронной почты.

Конфигурация доставки почты задается с помощью <system.net><mailSettings> элемента . Используйте элемент ,<smtp> чтобы указать метод доставки и адрес from по умолчанию. Следующая разметка настраивает параметры почты для использования сетевого SMTP-сервера с именем smtp.example.com через порт 25 и учетными данными имени пользователя и пароля.

Примечание

<system.net>является дочерним элементом корневого <configuration> элемента и одноуровневым элементом .<system.web> Поэтому не помещайте <system.net> элемент в элемент , <system.web> а поместите его на тот же уровень.

<configuration>
 ...
 <system.net>
 <mailSettings>
 <smtp deliveryMethod="Network" from="youraddress@example.com">
 <network
 host="smtp.example.com"
 userName="username"
 password="password"
 port="25" />
 </smtp>
 </mailSettings>
 </system.net>
</configuration>

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

Настроив параметры SMTP, перейдите на страницу RecoverPassword.aspx в браузере. Сначала попробуйте ввести имя пользователя, которое не существует в хранилище пользователей. Как показано на рисунке 2, элемент управления PasswordRecovery отображает сообщение о том, что не удалось получить доступ к данным пользователя. Текст сообщения можно настроить с помощью свойства элемента управления UserNameFailureText.

Если введено недопустимое имя пользователя, отображается сообщение об ошибке

Рис. 2. Если введено недопустимое имя пользователя, отображается сообщение об ошибке (щелкните для просмотра полноразмерного изображения)

Теперь введите имя пользователя. Используйте имя пользователя учетной записи в системе с адресом электронной почты, к которому вы можете получить доступ, и ответом безопасности которого вы знаете. После ввода имени пользователя и нажатия кнопки Отправить элемент управления PasswordRecovery отображает представление вопросов. Как и в представлении UserName, при вводе неверного ответа элемент управления PasswordRecovery отображает сообщение об ошибке (см. рис. 3). Используйте свойство дляQuestionFailureText настройки этого сообщения об ошибке.

Если пользователь вводит недопустимый ответ безопасности, отображается сообщение об ошибке.

Рис. 3. Если пользователь вводит недопустимый ответ безопасности, отображается сообщение об ошибке (щелкните для просмотра полноразмерного изображения)

Наконец, введите правильный ответ безопасности и нажмите кнопку Отправить. В фоновом режиме элемент управления PasswordRecovery создает случайный пароль, назначает его учетной записи пользователя, отправляет сообщение электронной почты, информирующее пользователя о новом пароле (см. рис. 4), а затем отображает представление Успешно.

Пользователю отправляется Email с новым паролем

Рис. 4. Пользователю отправляется Email с новым паролем (щелкните для просмотра полноразмерного изображения)

Настройка Email

Сообщение электронной почты по умолчанию, отправленное элементом управления PasswordRecovery, довольно скучное (см. рис. 4). Сообщение отправляется из учетной записи, указанной <smtp> в атрибуте from элемента с паролем темы и текстом в виде обычного текста:

Вернитесь на сайт и войдите в систему, используя следующие сведения.

Имя пользователя: имя пользователя

Пароль: пароль

Это сообщение можно настроить программным способом с помощью обработчика событий для события элемента управления SendingMailPasswordRecovery или декларативно с помощью MailDefinition свойства . Давайте рассмотрим оба этих варианта.

Событие SendingMail запускается непосредственно перед отправкой сообщения электронной почты, и это наша последняя возможность программно изменить сообщение электронной почты. При возникновении этого события обработчику событий передается объект типа MailMessageEventArgs, свойство которого Message содержит ссылку на сообщение электронной почты, которое будет отправлено.

Создайте обработчик событий для SendingMail события и добавьте следующий код, который программным способом добавляется webmaster@example.com в список cc.

protected void RecoverPwd_SendingMail(object sender, MailMessageEventArgs e)
{
    e.Message.CC.Add("webmaster@example.com");
}

Сообщение электронной почты также можно настроить декларативными средствами. Свойство PasswordRecovery MailDefinition является объектом типа MailDefinition. Класс MailDefinition предлагает множество свойств, связанных с электронной почтой, включая From, CC, Priority, Subject, IsBodyHtml, BodyFileNameи другие. Для начала присвойте свойствуSubject более описательное значение, чем используемое по умолчанию ( Пароль ), например Ваш пароль был сброшен...

Чтобы настроить текст сообщения электронной почты, необходимо создать отдельный файл шаблона электронной почты, содержащий содержимое текста сообщения. Начните с создания новой папки на веб-сайте с именем EmailTemplates. Затем добавьте новый текстовый файл в эту папку с именем PasswordRecovery.txt и добавьте следующее содержимое:

Your password has been reset, <%UserName%>!

According to our records, you have requested that your password be reset. Your new
password is: <%Password%>

If you have any questions or trouble logging on please contact a site administrator.

Thank you!

Обратите внимание на использование заполнителей <%UserName%> и <%Password%>. Элемент управления PasswordRecovery автоматически заменяет эти два заполнителя именем пользователя и восстановленным паролем перед отправкой сообщения электронной почты.

Наконец, укажите MailDefinitionBodyFileName для свойства только что созданный шаблон электронной почты (~/EmailTemplates/PasswordRecovery.txt).

После внесения этих изменений вернитесь на страницу RecoverPassword.aspx и введите имя пользователя и ответ безопасности. Вы получите сообщение электронной почты, похожее на сообщение на рисунке 5. Обратите внимание, что webmaster@example.com был cc'd, а тема и основной текст обновлены.

Обновлены тема, текст и список cc

Рис. 5. Обновлены тема, текст и список cc (щелкните для просмотра полноразмерного изображения)

Чтобы отправить сообщение электронной почты в формате HTML, задайте значение IsBodyHtml True (значение по умолчанию — False) и обновите шаблон электронной почты, чтобы включить HTML.

Свойство MailDefinition не является уникальным для класса PasswordRecovery. Как мы увидим на шаге 2, элемент управления ChangePassword также предлагает MailDefinition свойство . Кроме того, элемент управления CreateUserWizard содержит такое свойство, которое можно настроить для автоматической отправки приветственного сообщения электронной почты новым пользователям.

Примечание

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

Программный сброс пароля пользователя

При сбросе пароля пользователя элемент управления PasswordRecovery вызывает MembershipUser метод объекта ResetPassword. У этого метода две перегрузки.

  • ResetPassword — сбрасывает пароль пользователя. Используйте эту перегрузку, если RequiresQuestionAndAnswer имеет значение False.
  • ResetPassword(securityAnswer) — сбрасывает пароль пользователя, только если указан правильный параметр securityAnswer . Используйте эту перегрузку, если RequiresQuestionAndAnswer имеет значение True.

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

Как и в случае с другими методами в платформе членства, ResetPassword метод делегирует настроенного поставщика. Вызывает SqlMembershipProvider хранимую aspnet_Membership_ResetPassword процедуру, передавая имя пользователя, новый пароль и предоставленный ответ пароля, а также другие поля. Хранимая процедура гарантирует, что ответ на пароль совпадает, а затем обновляет пароль пользователя.

Несколько низкоуровневых примечаний о реализации:

  • Заблокированный пользователь не может сбросить пароль. Однако неутвержденный пользователь может. Более подробно мы обсудим заблокированные и утвержденные состояния в руководстве по разблокировке и утверждению учетных записей пользователей.
  • Если ответ на пароль неправильный, число неудачных попыток ответа пароля увеличивается. Если в течение указанного периода времени произошло указанное количество недопустимых попыток ответов безопасности, пользователь блокируется.

Word о том, как создаются случайные пароли

Случайные пароли, отображаемые в сообщениях электронной почты на рис. 4 и 5, создаются методом классаGeneratePassword Membership. Этот метод принимает два целочисленных входных параметра — length и numberOfNonAlphanumericCharacters — и возвращает строку длиной по меньшей мере длиной с числом не менее numberOfNonAlphanumericCharacters , не являющихся буквенно-цифровыми символами. При вызове этого метода из классов членства или веб-элементов управления, связанных с именем входа, значения этих двух параметров определяются свойствами и MinRequiredNonalphanumericCharacters конфигурации MinRequiredPasswordLength членства, для которых задано значение 7 и 1 соответственно.

Метод GeneratePassword использует криптографически сильный генератор случайных чисел, чтобы гарантировать отсутствие смещения в выборе случайных символов. Кроме того, GeneratePassword имеет значение , publicто есть вы можете использовать его непосредственно из приложения ASP.NET, если вам нужно создать случайные строки или пароли.

Примечание

Класс SqlMembershipProvider всегда создает случайный пароль длиной не менее 14 символов, поэтому если MinRequiredPasswordLength значение меньше 14, его значение игнорируется.

Шаг 2. Изменение паролей

Пароли, созданные случайным образом, трудно запомнить. Рассмотрим пароль, показанный на рис. 4: WWGUZv(f2yM:Bd. Попробуйте зафиксировать это в памяти! Нет необходимости говорить, что после того, как пользователю отправляется случайно созданный пароль такого рода, он захочет изменить пароль на что-то более запоминающееся.

Используйте элемент управления ChangePassword, чтобы создать интерфейс для изменения пароля пользователем. Как и элемент управления PasswordRecovery, элемент управления ChangePassword состоит из двух представлений: "Изменить пароль" и "Успешно". В представлении "Смена пароля" пользователю предлагается ввести старые и новые пароли. При указании правильного старого пароля и нового пароля, соответствующего минимальной длине и небуквенно-цифровым символам, элемент управления ChangePassword обновляет пароль пользователя и отображает представление Успешно.

Примечание

Элемент управления ChangePassword изменяет пароль пользователя, вызывая MembershipUser метод объекта ChangePassword. Метод ChangePassword принимает два string входных параметра — oldPassword и newPassword — и обновляет учетную запись пользователя с помощью newPassword при условии, что предоставленный oldPassword является правильным .

Откройте страницу ChangePassword.aspx и добавьте на нее элемент управления ChangePassword, назвав его ChangePwd. На этом этапе в представлении Конструктор должно отображаться представление Смена пароля (см. рис. 6). Как и в случае с элементом управления PasswordRecovery, можно переключаться между представлениями с помощью смарт-тега элемента управления. Кроме того, внешний вид этих представлений можно настроить с помощью различных свойств стиля или путем их преобразования в шаблон.

Добавление элемента управления ChangePassword на страницу

Рис. 6. Добавление элемента управления ChangePassword на страницу (щелкните для просмотра полноразмерного изображения)

Элемент управления ChangePassword может обновить пароль текущего пользователя или пароль другого указанного пользователя. Как показано на рисунке 6, представление смены пароля по умолчанию отображает только три элемента управления TextBox: один для старого пароля и два для нового пароля. Этот интерфейс по умолчанию используется для обновления пароля текущего вошедшего пользователя.

Чтобы использовать элемент управления ChangePassword для обновления пароля другого пользователя, задайте для свойства элемента управления DisplayUserName значение True. При этом на страницу добавляется четвертый элемент TextBox, предлагающий ввести имя пользователя, пароль которого нужно изменить.

Задать DisplayUserName значение True полезно, если вы хотите, чтобы пользователь, выошедший из системы, менял свой пароль без необходимости входа в систему. Лично я думаю, что нет ничего плохого в том, чтобы пользователь вошел, прежде чем позволить ей изменить свой пароль. Поэтому оставьте DisplayUserName значение False (значение по умолчанию). Однако при принятии этого решения мы, по сути, запрещаем анонимным пользователям переходить на эту страницу. Обновите правила авторизации URL-адресов сайта, чтобы запретить анонимным пользователям посещать ChangePassword.aspx. Если вам нужно обновить память с помощью синтаксиса правила авторизации URL-адресов, вернитесь к руководству по авторизации на основе пользователей.

Примечание

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

Перейдите на страницу ChangePassword.aspx в браузере и измените пароль. Обратите внимание, что при вводе нового пароля, который не соответствует длине пароля и требованиям к небуквенно-цифровым символам, указанным в конфигурации членства (см. рис. 7).

Если вы вводите новый пароль, который не соответствует длине пароля и не буквенно-цифровым символам, отображается сообщение об ошибке.

Рис. 7. Добавление элемента управления ChangePassword на страницу (щелкните для просмотра полноразмерного изображения)

При вводе правильного старого и допустимого нового пароля пароль вошедшего пользователя изменяется и отображается представление Успешно.

Отправка Email подтверждения

По умолчанию элемент управления ChangePassword не отправляет сообщение электронной почты пользователю, пароль которого был только что обновлен. Если вы хотите отправить сообщение электронной почты, просто настройте свойство элемента управления MailDefinition . Давайте настроим элемент управления ChangePassword так, чтобы пользователю отправлялось сообщение электронной почты в формате HTML, содержащее новый пароль.

Начните с создания нового файла в папке EmailTemplates с именем ChangePassword.htm. Добавьте следующую разметку:

<html>
 <body>
 <h2>Your Password Has Been Changed!</h2>
 <p>
 This email confirms that your password has been changed.
 </p>
 <p>
 To log on to the site, use the following credentials:
 </p>
 <table>
 <tr>
 <td>
 <b>Username:</b>
 </td>
 <td>
 <%UserName%>
 </td>
 </tr>
 <tr>
 <td>
 <b>Password:</b>
 </td>
 <td>
 <%Password%>
 </td>
 </tr>
 </table>
 <p>
 If you have any questions or encounter any problems logging in,
 please contact a site administrator.
 </p>
 </body>
</html>

Затем задайте для свойства , IsBodyHtmlи Subject свойства элемента BodyFileNameуправления MailDefinition ChangePassword равными ~/EmailTemplates/ChangePassword.htm, True и Ваш пароль изменен! соответственно.

После внесения этих изменений вернитесь на страницу и снова измените пароль. На этот раз элемент управления ChangePassword отправляет настроенное сообщение электронной почты в формате HTML на адрес электронной почты пользователя в файле (см. рис. 8).

Сообщение Email уведомляет пользователя об изменении пароля

Рис. 8. Сообщение Email информирует пользователя об изменении пароля (щелкните, чтобы просмотреть полноразмерное изображение)

Шаг 3. Разрешение администраторам изменять пароли пользователей

Распространенной функцией в приложениях, поддерживающих учетные записи пользователей, является возможность для пользователя с правами администратора изменять пароли других пользователей. Иногда эта функциональность требуется, так как система не может изменять собственные пароли. В этом случае единственный способ восстановить забытый пароль — назначить ему новый пароль. Однако при использовании элементов управления PasswordRecovery и ChangePassword пользователям с правами администратора не нужно заниматься изменением паролей пользователей, так как пользователи могут делать это самостоятельно.

Но что делать, если клиент настаивает на том, что пользователи с правами администратора должны иметь возможность изменять пароли других пользователей? К сожалению, добавление этой функции может оказаться немного трудоемким. Чтобы изменить пароль пользователя, в метод объекта ChangePassword необходимо указать MembershipUser как старый, так и новый пароль, но администратору не нужно знать пароль пользователя, чтобы изменить его.

Один из способов решения — сначала сбросить пароль пользователя, а затем изменить его на новый с помощью следующего кода:

MembershipUser usr = Membership.GetUser(username);
string resetPwd = usr.ResetPassword();
usr.ChangePassword(resetPwd, newPassword);

Этот код начинается с получения сведений об имени пользователя, который является пользователем, пароль которого администратор хочет изменить. ResetPassword Затем вызывается метод , который назначает пользователю новый случайный пароль. Этот случайно созданный пароль возвращается методом и сохраняется в переменной resetPwd. Теперь, когда мы знаем пароль пользователя, мы можем изменить его с помощью вызова ChangePassword.

Проблема заключается в том, что этот код работает только в том случае, RequiresQuestionAndAnswer если для конфигурации системы членства задано значение False. Если RequiresQuestionAndAnswer имеет значение True, как и в нашем приложении, методу ResetPassword необходимо передать ответ безопасности, в противном случае он вызовет исключение.

Если платформа членства настроена так, чтобы требовать контрольный вопрос и ответ, но клиент настаивает на том, чтобы администраторы могли изменять пароли пользователей, у вас есть три варианта:

  • Бросьте руки в воздух и скажите клиенту, что это только одна вещь, которую нельзя сделать.
  • Установите значение RequiresQuestionAndAnswer False. Это приводит к снижению безопасности приложения. Представьте, что гнусный пользователь получил доступ к почтовому ящику другого пользователя. Возможно, скомпрометированный пользователь покинул свой рабочий стол, чтобы пойти на обед и не заблокировал свою рабочую станцию, или, возможно, он получил доступ к своей электронной почте из общедоступного терминала и не вышел из него. В любом случае злоумышленник может посетить страницу RecoverPassword.aspx и ввести имя пользователя. После этого система будет отправлять восстановленный пароль по электронной почте, не запрашивая ответ безопасности.
  • Обход уровня абстракции, созданного платформой членства, и работайте непосредственно с базой данных SQL Server. Схема членства включает хранимую процедуру с именем aspnet_Membership_SetPassword , которая задает пароль пользователя и не требует ответ безопасности или старый пароль для выполнения своей задачи.

Ни один из этих вариантов не является особенно привлекательным, но именно так жизнь разработчика идет иногда.

Я пошел вперед и реализовал третий подход, написав код, который обходит Membership классы и и MembershipUser работает непосредственно с базой SecurityTutorials данных.

Примечание

Работая непосредственно с базой данных, инкапсуляция, предоставляемая платформой членства, разрушается. Это решение связывает нас с SqlMembershipProvider, что делает наш код менее переносимым. Кроме того, этот код может не работать должным образом в будущих версиях ASP.NET при изменении схемы членства. Этот подход является обходным решением и, как и большинство обходных решений, не является примером рекомендаций.

Код содержит некоторые непривлекательный бит и довольно длинный. Поэтому я не хочу загромождать этот учебник с подробным изучением его. Если вы хотите узнать больше, скачайте код для этого руководства и посетите страницу ~/Administration/ManageUsers.aspx . На этой странице, созданной в предыдущем руководстве, перечислены все пользователи. Я обновил GridView, чтобы включить ссылку на страницу UserInformation.aspx , передав имя пользователя выбранного пользователя через строку запроса. На UserInformation.aspx странице отображаются сведения о выбранном пользователе и элементах TextBoxes для изменения пароля (см. рис. 9).

После ввода нового пароля, подтверждения его во втором поле TextBox и нажатия кнопки Update User (Обновить пользователя) выполняется обратная связь и aspnet_Membership_SetPassword вызывается хранимая процедура, обновляющая пароль пользователя. Я призываю читателей, заинтересованных в этой функции, более ознакомиться с кодом и попытаться расширить функциональность, чтобы включить отправку сообщения электронной почты пользователю, пароль которого был изменен.

Администратор может изменить пароль пользователя

Рис. 9. Администратор может изменить пароль пользователя (щелкните для просмотра полноразмерного изображения)

Примечание

В UserInformation.aspx настоящее время страница работает только в том случае, если платформа членства настроена для хранения паролей в формате Clear или Hashed. В нем отсутствует код для шифрования нового пароля, хотя вам предлагается добавить эту функцию. Я рекомендую добавить необходимый код с помощью декомпилятора, такого как Reflector, для проверки исходного кода на наличие методов в платформа .NET Framework. Начните с изучения SqlMembershipProvider метода классаChangePassword. Это метод, который я использовал для написания кода для создания хэша пароля.

Сводка

ASP.NET предлагает два элемента управления, помогающие пользователям управлять своим паролем. Элемент управления PasswordRecovery полезен для тех, кто забыл свои пароли. В зависимости от конфигурации платформы членства пользователю будет либо отправляться по электронной почте существующий пароль, либо новый, сгенерированный случайным образом пароль. Элемент управления ChangePassword позволяет пользователю обновлять свой пароль.

Как и элементы управления Login и CreateUserWizard, элементы управления PasswordRecovery и ChangePassword отображают многофункциональный пользовательский интерфейс без необходимости писать декларативную разметку или строку кода. Если пользовательский интерфейс по умолчанию не соответствует вашим потребностям, его можно настроить с помощью различных свойств стиля. Кроме того, интерфейсы элементов управления можно преобразовать в шаблоны для еще более тонкой степени управления. В фоновом режиме эти элементы управления используют API членства, вызывая MembershipUser методы и ChangePassword объектаResetPassword.

Счастливое программирование!

Дополнительные материалы

Дополнительные сведения по темам, рассматриваемым в этом руководстве, см. в следующих ресурсах:

Об авторе

Скотт Митчелл (Scott Mitchell), автор нескольких книг ASP/ASP.NET и основатель 4GuysFromRolla.com, работает с веб-технологиями Майкрософт с 1998 года. Скотт работает независимым консультантом, тренером и писателем. Его последняя книга Sams Teach Yourself ASP.NET 2.0 в 24 часа. Скотт можно связаться по адресу mitchell@4guysfromrolla.com или через его блог по адресу http://ScottOnWriting.NET.

Отдельная благодарность

Эта серия учебников была проверена многими полезными рецензентами. К ведущим рецензентам этого руководства относятся Майкл Эммингс (Michael Emmings) и Suchi Banerjee (Сучи Банерджи). Хотите ознакомиться с моими предстоящими статьями MSDN? Если да, бросить мне линию на mitchell@4GuysFromRolla.com