Сброс пароля в ASP.NET Identity 2.0

Данное руководство устарело. Актуальное руководство: Руководство по ASP.NET Core

Последнее обновление: 31.10.2015

Рассмотрим механизм сброса пароля в 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:

Сброс пароля в ASP.NET MVC

И после этого мы будем перенаправлены по методу ForgetPasswordConfirmation:

Сброс пароля в ASP.NET Identity

Тем временем на указанную электронную почту приходит письмо с ссылкой. После перехода по этой ссылке срабатывает метод ResetPassword, и мы оказываемся на странице сброса пароля:

Указываем ту же почту и новый пароль и отправляем форму на сервер. После этого post-метод ResetPassword обрабатывает данные и перенаправляет нас на метод ResetPasswordConfirmation:

Подтверждение пароля в ASP.NET Identity

И после переустановки пароля мы сможем заходить на сайт под тем же электронным адресом и новым паролем.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850