Вторник, 30 мая, 2017

SimpleMembership: Восстановление пароля учетной записи в проектах ASP.NET MVC 4

комментарии: 7

В данной статье будет рассказано, как реализовать в проекте ASP.NET MVC 4 с системой SimpleMembership возможность восстановления доступа к учетной записи, в случае если пользователь забыл пароль. Пользователь вводит свое имя(user name), система проверяет наличие его в базе данных, и если находит, то высылает e-mail этому пользователю с автоматически сгенерированной ссылкой, которая содержит временный код для назначения нового пароля.

Добавляем возможность сохранения e-mail пользователя при регистрации

Для начала создадим новый проект ASP.NET MVC 4 с шаблоном Internet Application. Откроем базу данных приложения в окне Server Explorer и посмотрим на таблицы, которые сгенерированы системой SimpleMembership. В частности нас интересует таблица UserProfile. По умолчанию в ней создано два поля UserId и UserName. Добавим туда поле для e-mail пользователя Email. Нажимаем Update.

Далее открываем файл Models/AccountModel.cs и находим там класс RegisterModel, добавляем свойство Email.

public class RegisterModel
{
	*****************

    //новое свойство
    [Required, Display(Name = "Email")]
    public string Email { get; set; }
}

Это свойство необходимо для строгой типизации и добавления поля ввода в представлении Views/Account/Register.cshtml. Добавим это поле в представление:

    <fieldset>
        <legend>Registration Form</legend>
        <ol>

		***************************************

            <li>
                @Html.LabelFor(m => m.Email)
                @Html.TextBoxFor(m => m.Email)
            </li>
        </ol>
        <input type="submit" value="Register" />
    </fieldset>

Теперь, когда пользователь вводит свои данные и нажимает кнопку Register, на сервер помимо имени и пароля отправляется еще и e-mail. Следующим шагом будет дописывание серверного кода, который сохраняет e-mail в базу данных.

Открываем файл Controllers/AccountController.cs и находим метод действия Register, нам нужен метод с атрибутом HttpPost, который принимает данные от страницы регистрации. Делаем изменения для передачи значения Email.

[HttpPost, AllowAnonymous, ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
        // Attempt to register the user
        try
        {
            WebSecurity.CreateUserAndAccount(
                    model.UserName, model.Password, 
                    new { Email = model.Email });
            WebSecurity.Login(model.UserName, model.Password);
            return RedirectToAction("Index", "Home");
        }
        catch (MembershipCreateUserException e)
        {
            ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
        }
    }

    // If we got this far, something failed, redisplay form
    return View(model);
}

Итак, мы добавили возможность сохранять e-mail пользователя базе данных. Запустим проект и зарегистрируем в нем нового пользователя с указанием e-mail адреса.

Откроем таблицу UserProfile и видим e-mail успешно сохранен.

Комментарии

Alexander Alexander 01 июня, 2013, 07:39
Здравствуйте! Спасибо за отличный пример! Сделал все как в примере, все работает корректно до момента, когда перехожу по ссылке отправленной на почту. При переходе по этой ссылке показывает следующую ошибку: "Invalid column name 'PasswordChangeDate'." в строке "Line 179: var membership = db.WebpagesMemberships.".Не знаю что делать уже все перепробовал? Помогите пожалуйста, заранее благодарен!
Василий Мажекин Василий Мажекин 01 июня, 2013, 08:25
Александр, спасибо за указанную ошибку, исправил в текcте статьи, и продублирую здесь,что исправить надо. 1) В файле AccountsModels.cs в классе public class webpages_Membership нужно подправить две строчки: public DateTime? LastPasswordFailureDate { get; set; } public DateTime PasswordChangedDate { get; set; } они не совпадают со схемой базы LocalDb. 2) и потом надо добавить представление ResetPassword.cshtml в папку Views/Account
Alex Guevara Alex Guevara 11 февраля, 2014, 03:09
Здравствуйте. Добавил возможность восстановления пароля как вы описали в статье. По большому счёту всё ясно и разложено по полочкам, особенно комментарии в коде выручили. Спасибо. Столкнулся с одной проблемой: При отправке сообщения на SMTP сервер он возвращает вот такую ошибку " Error occured while sending email.The SMTP server requires a secure connection or the client was not authenticated. The server response was: 5.5.1 Authentication Required. Learn more at" Подскажите, в чём проблема? Просто я с SSL дела никогда не имел, как и с отправкой писем на SMTP. Сайт пока в стадии разработки и разворачивается на IIS Express. NetworkCredential("mymail@gmail.com","password"); и MailAddress("mymail@gmail.com"); указал разумеется свои. Буду признателен за любую помощь. Спасибо
Alex Guevara Alex Guevara 11 февраля, 2014, 03:42
Вопрос решился. Вероятнее всего мешала двухэтапная аутентификация на сайте gmail. Создав новый аккаунт всё работает. Спасибо за пост, буду следить за вашими обновлениями.
Alex Guevara Alex Guevara 11 февраля, 2014, 04:36
Всё же возник у меня последний вопрос: Как вы считаете, может не стоит создавать отдельный класс "webpages_Membership" и искать регистрационную информацию по айди и маркеру пароля в Action ResetPassword(), а воспользоваться: var userId = WebSecurity.GetUserIdFromPasswordResetToken(rt); if (userProfile.UserId != userId) { return RedirectToAction("BadLink"); }
Ерен Ерен 28 января, 2015, 09:16
спасибо!!!
Alex Alex 26 января, 2016, 02:23
Вовсе незачем писать public class webpages_Membership и тд. UserID можно получить с помощью метода WebSecurity.GetUserIdFromPasswordResetToken(token);

 

Добавить комментарий

Войти через Twitter Войти через Facebook Войти через ВКонтакте Войти через Github Войти через Google Войти через LinkedIn

Copyright © 2013 All Rights Reserved for CodeHint.ru      Powered by Windows Azure