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

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

Примечание.

С тех пор как эта статья была написана, поставщики членства 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 классов ChangePassword и ResetPassword методов.

Шаг 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 в режим Success.

После того как пользователь предоставил свое имя пользователя, а при условии, если 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: RequiresQuestionAndAnswer, EnablePasswordRetrieval, и EnablePasswordReset, влияющие на внешний вид и поведение элемента управления PasswordRecovery (щелкните, чтобы просмотреть изображение полного размера)

Примечание.

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

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

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

Пользователь отправляет сообщение электронной почты с новым паролем

Рис. 4. Пользователь отправляет сообщение электронной почты с новым паролем (щелкните, чтобы просмотреть изображение полного размера)

Настройка электронной почты

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

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

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

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

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

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

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

Protected Sub RecoverPwd_SendingMail(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.MailMessageEventArgs)Handles RecoverPwd.SendingMail
 e.Message.CC.Add("webmaster@example.com")
End Sub

Сообщение электронной почты также можно настроить с помощью декларативных средств. Свойство PasswordRecovery MailDefinition является объектом типа MailDefinition. Класс MailDefinition предлагает множество свойств, связанных с электронной почтой, включая From, , CC, Priority, Subjectи IsBodyHtmlBodyFileNameдругие. Для начала установите 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), и что тема и текст были обновлены.

Тема, тело письма и список CC обновлены

Рис. 5: Обновлены Тема, Тело письма и список CC (Нажмите, чтобы просмотреть изображение в полном размере)

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

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

Примечание.

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

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

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

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

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

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

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

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

Слово о создании случайных паролей

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

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

Примечание.

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

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

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

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

Примечание.

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

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

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

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

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

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

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

Примечание.

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

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

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

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

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

Отправка сообщения электронной почты подтверждения

По умолчанию элемент управления 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>

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

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

Сообщение электронной почты сообщает пользователю об изменении пароля.

Рис. 8. Сообщение электронной почты сообщает пользователю, что его пароль изменен (щелкните, чтобы просмотреть изображение полного размера)

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

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

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

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

Dim usr As MembershipUser = Membership.GetUser(username)
Dim resetPwd As String = 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 странице отображаются сведения о выбранном пользователе и текстовые поля для изменения пароля (см. рисунок 9).

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

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

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

Примечание.

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

Итоги

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

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

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

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

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

Об авторе

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

Особое спасибо кому

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