@Olya_Ann

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

Добрый вечер, я вот пишу ве-приложение на платформе asp.net core (MVC) и пытаюсь реализовать функционал восстановления пароля. Нашла хороший сайт с описанием примера, но не очень понимаю, как адаптировать под себя, там они, вроде Identity используют и Entity Framework.

Вот я создала две модели:
public class ForgotPasswordViewModel
    {
        [Required]
        [EmailAddress]
        public string Email { get; set; }
    }


public class ResetPasswordViewModel
    {
        [EmailAddress]
        public string Email { get; set; }

        [DataType(DataType.Password)]
        public string Password { get; set; }

        [DataType(DataType.Password)]
        [Display(Name = "Confirm password")]
        [Compare("Password", ErrorMessage = "Пароли не совпадают")]
        public string ConfirmPassword { get; set; }

        public string Code { get; set; }
    }


Дошла до создания контроллера:
public class AccountController : Controller
    {
        private IConfiguration _config;
        CommonHelper _helper;

        public string readerSubunit;

        IWebHostEnvironment _appEnvironment;

        public AccountController(IConfiguration config, IWebHostEnvironment appEnvironment)
        {
            _config = config;
            _helper = new CommonHelper(_config);
            _appEnvironment = appEnvironment;
        }

        [HttpGet]
        [AllowAnonymous]
        public IActionResult ForgotPassword()
        {
            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> ForgotPassword(ForgotPasswordViewModel model)
        {
            string connectionString = _config["ConnectionStrings:DefaultConnection"];
            var userEmail = HttpContext.Session.GetString("email");
           

            if (ModelState.IsValid)
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    connection.Open();
                    SqlCommand cmd = new SqlCommand("showSubunit", connection);
                    cmd.Parameters.AddWithValue("userEmail", userEmail);
                    cmd.CommandType = CommandType.StoredProcedure;
                    var readerSubunit = cmd.ExecuteScalar();

                }

                if (readerSubunit == null)
                {
                    // пользователь с данным email может отсутствовать в бд
                    // тем не менее мы выводим стандартное сообщение, чтобы скрыть 
                    // наличие или отсутствие пользователя в бд
                    return View("ForgotPasswordConfirmation");
                }

            }
            return View(model);
        }
    }


Вот сайт, откуда я это взяла: https://metanit.com/sharp/aspnet5/16.6.php
И я вот не понимаю, как мне действовать, начиная с этой строки? Подскажите, пожалуйста?
var code = await _userManager.GeneratePasswordResetTokenAsync(user);
  • Вопрос задан
  • 157 просмотров
Решения вопроса 2
Раз ты работаешь без identity и ef, то тебе нужно самостоятельно сгенерировать этот токен.

Норм практика будет использовать тут JWT.
Вот описание этого формата и библиотеки, которые можно будет использовать:
https://jwt.io/
В него следует встроить id пользователя, email на который было отправлено письмо, и время жизни, чтобы в случае изменения email или просрачивания - токен стал невалидным.

Этот токен надо будет встроить в ссылку, которую отправишь пользователю.

На странице сброса пароля тебе нужно будет этот токен отправить на сервер вместе с новым паролем.

На сервере тебе надо будет проверить валидностт токена, что он не просрочен, и что почта не изменилась.
В случае успеха - изменить пароль.

А туториал, который ты нашла, сделан для старой версии asp net и сейчас устарел.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы