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

Как я могу справиться с тем, что пользователь забыл свой пароль в ASP.NET MVC 5 без подтверждения по электронной почте?

Пробовал вот такой способ: http://www.dominikgorecki.com/2014/01/implementing-password-reset-in-mvc-4-ef-code-first-using-simple-membership-part-2/. Но когда я отправляю электронное письмо, я получаю уведомление «По этому электронному письму не найдено ни одного пользователя».

Код контроллера (AccountController.cs)

// GET: Account/LostPassword
[AllowAnonymous]
public ActionResult LostPassword()
{
    return View();
}

// POST: Account/LostPassword
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult LostPassword(LostPasswordModel model)
{
    if (ModelState.IsValid)
    {
        MembershipUser user;
        var context = new ApplicationDbContext();
        {
            var foundUserName = (from u in context.Users
                                 where u.Email == model.Email
                                 select u.UserName).FirstOrDefault();
            if (foundUserName != null)
            {
                user = Membership.GetUser(foundUserName.ToString());
            }
            else
            {
                user = null;
            }
        }
        if (user != null)
        {
            // Generae password token that will be used in the email link to authenticate user
            var token = WebSecurity.GeneratePasswordResetToken(user.UserName);
            // Generate the html link sent via email
            string resetLink = "<a href='"
               + Url.Action("ResetPassword", "Account", new { rt = token }, "http")
               + "'>Reset Password Link</a>";

            // Email stuff
            string subject = "Reset your password for asdf.com";
            string body = "You link: " + resetLink;
            string from = "[email protected]";

            MailMessage message = new MailMessage(from, model.Email);
            message.Subject = subject;
            message.Body = body;
            SmtpClient client = new SmtpClient();

            // Attempt to send the email
            try
            {
                client.Send(message);
            }
            catch (Exception e)
            {
                ModelState.AddModelError("", "Issue sending email: " + e.Message);
            }
        }
        else // Email not found
        {
            /* Note: You may not want to provide the following information
            * since it gives an intruder information as to whether a
            * certain email address is registered with this website or not.
            * If you're really concerned about privacy, you may want to
            * forward to the same "Success" page regardless whether an
            * user was found or not. This is only for illustration purposes.
            */
            ModelState.AddModelError("", "No user found by that email.");
        }
    }

    /* You may want to send the user to a "Success" page upon the successful
    * sending of the reset email link. Right now, if we are 100% successful
    * nothing happens on the page. :P
    */
    return View(model);
}
// GET: /Account/ResetPassword
[AllowAnonymous]
public ActionResult ResetPassword(string rt)
{
    ResetPasswordModel model = new ResetPasswordModel();
    model.ReturnToken = rt;
    return View(model);
}

// POST: /Account/ResetPassword
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ResetPassword(ResetPasswordModel model)
{
    if (ModelState.IsValid)
    {
        bool resetResponse = WebSecurity.ResetPassword(model.ReturnToken, model.Password);
        if (resetResponse)
        {
            ViewBag.Message = "Successfully Changed";
        }
        else
        {
            ViewBag.Message = "Something went horribly wrong!";
        }
    }
    return View(model);
}

Код модели (AccountViewModel.cs)

public class LostPasswordModel
{
    [Required(ErrorMessage = "We need your email to send you a reset link!")]
    [Display(Name = "Your account email")]
    [EmailAddress(ErrorMessage = "Not a valid email--what are you trying to do here?")]
    public string Email { get; set; }
}

public class ResetPasswordModel
{
    [Required]
    [Display(Name = "New Password")]
    [DataType(DataType.Password)]
    public string Password { get; set; }

    [Required]
    [Display(Name = "Confirm Password")]
    [DataType(DataType.Password)]
    [Compare("Password", ErrorMessage = "New password and confirmation does not match.")]
    public string ConfirmPassword { get; set; }

    [Required]
    public string ReturnToken { get; set; }
}

Просмотреть код (LostPassword.cshatml)

    @model AppZillafy.Models.LostPasswordModel
@{
    ViewBag.Title = "Lost Password";
}

<h2>Lost Password</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()
    <fieldset>
        <legend>Lost Password Form</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)
            </li>
        </ol>
        <input type = "submit" value = "Recover Account" />
    </fieldset>
}

Просмотреть код (ResetPassword.cshatml)

@model AppZillafy.Models.ResetPasswordModel

@{
    ViewBag.Title = "ResetPassword";
}

<h2>Reset Password</h2>

@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    @Html.ValidationSummary()

    <fieldset>
        <legend>Resetting password form</legend>
        <ol>
            <li>
                @Html.LabelFor(m => m.Password)
                @Html.PasswordFor(m => m.Password)
            </li>
            <li>
                @Html.LabelFor(m => m.ConfirmPassword)
                @Html.PasswordFor(m => m.ConfirmPassword)
            </li>
            @Html.HiddenFor(m => m.ReturnToken)
        </ol>
        <input type = "submit" value = "Reset" />
    </fieldset>
    <h2>@ViewBag.Message</h2>
}

Если вы вызываете одну из перегрузок Membership.GetUser (), которая принимает имя пользователя и возвращает значение null, то этот пользователь не существует в источнике данных членства. форумы.asp.net/t/…

Chetan Ranpariya 31.03.2018 11:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
1 153
0

Другие вопросы по теме