MVC 4 Восстановление пароля
Во-первых, я новичок в MVC и пытаюсь реализовать функциональность восстановления пароля для MVC 4. Я реализую это, используя эту технику, опубликованную здесь: Где найти пример кода C# для восстановления пароля в ASP .NET MVC2
Я понял, как это работает, однако отсутствует вспомогательный класс, который я пытаюсь реализовать прямо сейчас. Я говорю о классе: NotificationsHelper.SendPasswordRetrieval(model.Email, this.ControllerContext);
Контроллер действия RetrievePassword на контроллере имеет параметр PasswordRetrievalModel model. Я предполагаю, что это модель класса, которая подключается к базе данных и реализует некоторые свойства темы. Это свойство строки называется Email. Это правильно?
Затем NotificationsHelper.SendPasswordRetrieval(model.Email, this.ControllerContext); Статический класс реализует этот статический метод SendPasswordRetrievla с двумя параметрами: model.Email, который является строковым свойством класса модели PasswordRetrievalModel, поэтому это будет электронная почта пользователя, на которую мы отправим электронную почту. Второй параметр - это this.ControllerContext. Какой смысл этого параметра, какие значения будут содержать те, которые отправляются в метод SendPasswordRetrieval?
Чем я реализовал класс следующим образом:
public static class NotificationsHelper
{
public static bool SendPasswordRetrieval(string emailAddress, ControllerContext ctx)
{
try
{
StringBuilder emailMessage = new StringBuilder();
emailMessage.Append("<br />");
emailMessage.Append("Hello,");
emailMessage.Append("You have requested a password recovery.");
emailMessage.Append("<br />");
emailMessage.Append("Please click the link below to change your password: <br />");
emailMessage.Append("<br />");
emailMessage.Append(string.Format("http://www.example.com/Account/Validate?email={0}&token={1}", emailAddress, "**345982374532453435345**"));
emailMessage.Append("<br />");
MailMessage email = new MailMessage();
email.From = new MailAddress("noreplay@example.com");
email.To.Add(new MailAddress(emailAddress));
email.Subject = "domain.com Password Recovery";
email.Body = emailMessage.ToString();
email.IsBodyHtml = true;
SmtpClient smtpServer = new SmtpClient();
smtpServer.Host = "smtp.gmail.com";
smtpServer.Port = 587;
smtpServer.Credentials = new NetworkCredential("username", "password");
smtpServer.EnableSsl = true;
smtpServer.Send(email);
return true;
}
catch (Exception e)
{
Trace.WriteLine(String.Format("Failure to send email to {0}.", emailAddress));
return false;
}
}
}
В приведенном выше коде я перечислил строку, в которой отформатирован URL, как мне перенести туда токен, используя предоставленный код @agarcian? Идет ли токен из второго параметра ControllerContext? Если да, как я могу получить это оттуда?
1 ответ
Добавить новый столбец для usertable
назови это pwdresetTocket
, когда пользователь запрос на сброс пароля вставьте Guid.NewGuid()
в поле pwdresetTocket для этого пользователя добавьте то же самое в URL обратного вызова
если вы не хотите добавлять столбец в существующую таблицу, вы можете создать новую таблицу и сопоставить ее с пользовательской таблицей.
Тогда ваш метод выглядит следующим образом.
public static bool SendPasswordRetrieval(string emailAddress, ControllerContext ctx)
{
try
{
StringBuilder emailMessage = new StringBuilder();
string token = Guid.NewGuid();
// call to a method that will update the table with token
updateUsertablewithResetTocket(tocken);
emailMessage.Append("<br />");
emailMessage.Append("Hello,");
emailMessage.Append("You have requested a password recovery.");
emailMessage.Append("<br />");
emailMessage.Append("Please click the link below to change your password: <br />");
emailMessage.Append("<br />");
emailMessage.Append(string.Format("http://www.example.com/Account/Validate?email={0}&token={1}", emailAddress, token));
emailMessage.Append("<br />");
MailMessage email = new MailMessage();
email.From = new MailAddress("noreplay@example.com");
email.To.Add(new MailAddress(emailAddress));
email.Subject = "domain.com Password Recovery";
email.Body = emailMessage.ToString();
email.IsBodyHtml = true;
SmtpClient smtpServer = new SmtpClient();
smtpServer.Host = "smtp.gmail.com";
smtpServer.Port = 587;
smtpServer.Credentials = new NetworkCredential("username", "password");
smtpServer.EnableSsl = true;
smtpServer.Send(email);
return true;
}
catch (Exception e)
{
Trace.WriteLine(String.Format("Failure to send email to {0}.", emailAddress));
return false;
}
}
как только пользователь сбросит пароль, очистите поле токена сброса