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

| Четверг, 16 мая, 2013

Метки: ASP.NET MVC, SimpleMembership Комментарии: 0

Создаем страницу изменения пароля

Нам нужно реализовать GET-метод ResetPassword в контроллере Account, так как эта ссылка будет выслана пользователю на e-mail.

[AllowAnonymous]
public ActionResult ResetPassword(string un, string rt)
{
    UsersContext db = new UsersContext();

    // ищем пользователя с заданным именем
    var userProfile = db.UserProfiles.
        FirstOrDefault(x => x.UserName.Equals(un));
    if (userProfile == null)
    {
        return RedirectToAction("BadLink");
    }

    // ищем регистрационную информацию по айди и маркеру пароля
    var membership = db.webpages_Memberships.
        FirstOrDefault(x => x.UserId == userProfile.UserId && 
                                  x.PasswordVerificationToken == rt);
    if (membership == null)
    {
        return RedirectToAction("BadLink");
    }

    // генерируем новый пароль
    string newpassword = GenerateRandomPassword(6);

    // устанавливаем новый пароль
    if (!WebSecurity.ResetPassword(rt, newpassword))
    {
        return RedirectToAction("BadLink");
    }

    // высылаем письмо с новым паролем
    string subject = "Новый пароль";
    string body = "Новый пароль
" + newpassword; try { SendEMail(userProfile.Email, subject, body); ViewBag.Message = "Письмо с паролем выслано."; } catch (Exception ex) { ViewBag.Message = "Возникла ошибка при отсылки письма. " + ex.Message; } return View(); }

Плюс добавим представление Views/Account/ResetPassword.cshtml, для метода, представленного выше.

@{
    ViewBag.Title = "ResetPassword";
}

@ViewBag.Title

@ViewBag.Message

В коде выше метод получает в качестве параметров имя пользователя un и маркер изменения пароля rt. По имени пользователя находим профиль пользователя, из него получаем идентификатор и пытаемся получить объект webpages_Membership по айди и маркеру пароля. Данная строка не будет компилировался потому, что нужно добавить класс webpages_Membership в файле AccountsModels.cs.

public class UsersContext : DbContext
{
   public UsersContext()
       : base("DefaultConnection")
   {
   }

   public DbSet<UserProfile> UserProfiles { get; set; }
   public DbSet<webpages_Membership> webpages_Memberships { get; set; }
}

[Table("webpages_Membership")]
public class webpages_Membership
{
    [Key]
    public int UserId { get; set; }
    public DateTime CreateDate { get; set; }
    public string ConfirmationToken { get; set; }
    public bool IsConfirmed { get; set; }
    public DateTime? LastPasswordFailureDate { get; set; }
    public int PasswordFailuresSinceLastSuccess { get; set; }
    public string Password { get; set; }
    public DateTime PasswordChangedDate { get; set; }
    public string PasswordSalt { get; set; }
    public string PasswordVerificationToken { get; set; }
    public DateTime PasswordVerificationTokenExpirationDate { get; set; }
}

Далее генерируется новый пароль. Этот метод можно реализовать так:

private string GenerateRandomPassword(int length)
{
    string allowedChars = "abcdefghijkmnopqrstuvwxyz" + 
                                 "ABCDEFGHJKLMNOPQRSTUVWXYZ" + 
                                 "0123456789!@$?_-*&#+";
    char[] chars = new char[length];
    Random rd = new Random();
    for (int i = 0; i < length; i++)
    {
        chars[i] = allowedChars[rd.Next(0, allowedChars.Length)];
    }
    return new string(chars);
}

В общем это все, но мы использовали дважды функцию SendEMail. Приведем ниже ее реализацию.

private void SendEMail(string emailid, string subject, string body)
{
    SmtpClient client = new SmtpClient();
    client.DeliveryMethod = SmtpDeliveryMethod.Network;
    client.EnableSsl = true;
    client.Host = "smtp.gmail.com";
    client.Port = 587;

    System.Net.NetworkCredential credentials = 
      new System.Net.NetworkCredential("xxxxx@gmail.com","xxxxx");
    client.UseDefaultCredentials = false;
    client.Credentials = credentials;

    MailMessage msg = new MailMessage();
    msg.From = new MailAddress("xxxxx@gmail.com");
    msg.To.Add(new MailAddress(emailid));

    msg.Subject = subject;
    msg.IsBodyHtml = true;
    msg.Body = body;

    client.Send(msg);
}

Комментарии
Никто еще не оставил здесь комментарий.
Войдите, чтобы написать комментарий , или воспользуйтесь формой ниже.
 

Copyright © CodeHint.ru 2013-2019