Поделиться через


Восстановление и смена паролей (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 классов 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, парольrecovery отправляет пользователю пароль. EnablePasswordRetrieval Если для параметра задано значение True, пользователь отправляет сообщение электронной почты по текущему паролю. Если для него задано значение False и EnablePasswordReset задано значение True, то элемент управления PasswordRecovery создает новый случайный пароль для пользователя и отправляет им новый пароль. Если оба EnablePasswordRetrieval и EnablePasswordReset имеют значение False, элемент управления PasswordRecovery создает исключение.

Примечание.

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

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

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

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

Примечание.

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

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

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

Когда пользователь посещает эту страницу, она введет имя пользователя и нажмите кнопку "Отправить". Так как свойство 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), а затем отображает представление "Успешно".

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

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

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

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

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

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

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

Это сообщение можно настроить программным способом с помощью обработчика событий для события элемента управления SendingMail PasswordRecovery или декларативно через 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и BodyFileNameIsBodyHtmlдругие. Для начальных элементов задайте 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 автоматически заменяет эти два заполнителя именем пользователя и восстановленным паролем перед отправкой сообщения электронной почты.

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

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

Обновлен список темы, тела и 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 метод делегирует настроенного поставщика. aspnet_Membership_ResetPassword Вызывает SqlMembershipProvider хранимую процедуру, передавая имя пользователя, новый пароль и предоставленный ответ на пароль, среди других полей. Хранимая процедура гарантирует, что ответ на пароль совпадает, а затем обновляет пароль пользователя.

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

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

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

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

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

Примечание.

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

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

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

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

Примечание.

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

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

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

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

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

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

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

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

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

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

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

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).

После ввода нового пароля подтвердите его во втором текстовом поле и нажмите кнопку "Обновить пользователя", после этого выполняется обратная связь 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.

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

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

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

Об авторе

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

Особое спасибо

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