| Четверг, 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-2025 (v2.4.7 - работает на Angular Universal)Калькулятор инвест-портфеля