| Четверг, 16 мая, 2013
Метки: ASP.NET MVC, SimpleMembership Комментарии: 0
Теперь реализуем, собственно, возможность отсылки письма на e-mail пользователя с временной ссылкой для изменения пароля. Добавляем ссылку для восстановления пароля на странице авторизации пользователя.
 
Код ссылки:
<p>
@Html.ActionLink("Recover", "ForgotPassword") if you forgot your password.
</p>
Ссылка перенаправляет пользователя на метод действия, который нужно добавить в контроллер AccountController.
[AllowAnonymous]
public ActionResult ForgotPassword()
{
    return View();
}
И добавим в папку Views/Account новое представление ForgotPassword.cshtml.
@{
    ViewBag.Title = "Forgot Password";
}
<h2>Forgot Password</h2>
@using (Html.BeginForm())
{
    @Html.AntiForgeryToken()
    <fieldset>
        <legend>Forgot Password Form</legend>
        <ol>
            <li>
                @Html.Label("User Name", new { @for = "UserName" })
                @Html.TextBox("UserName")
                <span style="color:red;">@TempData["Message"]</span>
            </li>
        </ol>
        <input type="submit" value="Recover" />
    </fieldset>
}
Обратите внимание на три вещи, в Html.Textbox указано имя UserName. Элемент span выводит сообщения красным цветом, и имя пользователя отправляется post-запросом.
Ниже метод действия, который принимает данные от страницы:
[HttpPost, AllowAnonymous, ValidateAntiForgeryToken]
public ActionResult ForgotPassword(string UserName)
{
    // проверяем существование пользователя
    var user = Membership.GetUser(UserName);
    if (user == null)
    {
        TempData["Message"] = "User Not exist.";
    }
    else
    {
        // генерируем маркер пароля
        var token = WebSecurity.GeneratePasswordResetToken(UserName);
        // создаем урл с маркером пароля
        var resetLink = "Reset Password";
        // получим e-mail прользователя
        UsersContext db = new UsersContext();
        var email = db.UserProfiles.Where(x => x.UserName == UserName).Select(x => x.Email).FirstOrDefault();
        // отсылаем email
        string subject = "Password Reset Token";
        string body = "Please find the Password Reset Token
" + resetLink; 
        try
        {
            SendEmail(email, subject, body);
            TempData["Message"] = "Mail Sent.";
        }
        catch (Exception ex)
        {
            TempData["Message"] = "Error occured while sending email." + ex.Message;
        }
        // это для тестирования
        TempData["Message"] = resetLink;
    }
    return View();
}
В вышеприведенном коде мы получаем имя пользователя, и находим этого пользователя в базе, если он найден, то WebSecurity.GeneratePasswordResetToken генерирует маркер для сброса пароля. И далее генерируется url с этим маркером. Функция SendEmail пока ничего не делает и для теста мы выводим url в сообщении на самой странице. Метод действия ResetPassword будет реализован тоже позднее. Запускаем проект открываем страницу восстановления пароля и вводим имя пользователя. Нажимаем кнопку Recover. Проявится тестовое сообщение выделенное красным цветом с кодом ссылки и адресом для изменения пароля.

Copyright © CodeHint.ru 2013-2025 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля