Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core
Рассмотрим механизм сброса пароля в ASP.NET Identity. Для Identity 2.0 уже имеется необходимая инфраструктура для сброса пароля: это представления и методы контроллера.
В файле AccountViewModels.cs уже описаны модели, которые используются для сброса пароля: ForgotPasswordViewModel и ResetPasswordViewModel
А в контроллере AccountController определены методы, необходимые для сброса пароля. В частности, методы ResetPassword
и
ForgotPassword
.
Для сброса пароля мы будем обращаться к методу ForgotPassword
, который будет вызывать представление ForgotPassword.cshtml.
Данное представление содержит форму для ввода электронного адреса, который будет использоваться для сброса пароля.
Данные формы обрабатываются post-версией метода ForgotPassword
, который по умолчанию не содержит функционал для сброса пароля. Поэтому
изменим его следующим образом:
[HttpPost] [AllowAnonymous] [ValidateAntiForgeryToken] public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model) { if (ModelState.IsValid) { var user = await UserManager.FindByEmailAsync(model.Email); if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id))) { return View("ForgotPasswordConfirmation"); } string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); await UserManager.SendEmailAsync(user.Id, "Сброс пароля", "Для сброса пароля, перейдите по ссылке <a href=\"" + callbackUrl + "\">сбросить</a>"); return RedirectToAction("ForgotPasswordConfirmation", "Account"); } return View(model); }
После отправки письма пользователь перенаправляется к методу ForgotPasswordConfirmation. Все остальные действия по сбросу пароля выполняет метод
ResetPassword
, стандартная реализация которого в принципе не требует изменения.
Но чтобы была возможной отправка электронных сообщений, должен быть настроен соответствующим образом сервис отправки почты. Для этого перейдем к файлу
IdentityConfig.cs и найдем в нем класс EmailService
, который и будет отправлять электронные сообщения. Изменим его следующим образом:
public class EmailService : IIdentityMessageService { public Task SendAsync(IdentityMessage message) { // настройка логина, пароля отправителя var from = "somemail@yandex.ru"; var pass = "password"; // адрес и порт smtp-сервера, с которого мы и будем отправлять письмо SmtpClient client = new SmtpClient("smtp.yandex.ru", 25); client.DeliveryMethod = SmtpDeliveryMethod.Network; client.UseDefaultCredentials = false; client.Credentials = new System.Net.NetworkCredential(from, pass); client.EnableSsl = true; // создаем письмо: message.Destination - адрес получателя var mail = new MailMessage(from, message.Destination); mail.Subject = message.Subject; mail.Body = message.Body; mail.IsBodyHtml = true; return client.SendMailAsync(mail); } }
Итак, допустим, у нас в системе уже есть зарегистрированный с почтовым адресом пользователь. Попробуем сбросить пароль и обратимся к методу ForgotPassword:
И после этого мы будем перенаправлены по методу ForgetPasswordConfirmation:
Тем временем на указанную электронную почту приходит письмо с ссылкой. После перехода по этой ссылке срабатывает метод ResetPassword, и мы оказываемся на странице сброса пароля:
Указываем ту же почту и новый пароль и отправляем форму на сервер. После этого post-метод ResetPassword обрабатывает данные и перенаправляет нас на метод ResetPasswordConfirmation:
И после переустановки пароля мы сможем заходить на сайт под тем же электронным адресом и новым паролем.