| Четверг, 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)Калькулятор инвест-портфеля