2015-08-15 2 views
4

Я работаю в приложении ASP.NET MVC 5. Пользователи могут зарегистрироваться и войти без проблем. Однако, когда один пользователь забывает свой пароль, процесс забытого пароля (уже на месте) ничего не делает! Никакие электронные письма не отправляются пользователю с ссылкой click here to reset password.Восстановление пароля в ASP.NET MVC5

В настоящее время мой метод действия ForgotPassword выглядит следующим образом:

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = await UserManager.FindByNameAsync(model.Email); 
     if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id))) 
     { 
      // Don't reveal that the user does not exist or is not confirmed 
      return View("ForgotPasswordConfirmation"); 
     } 
    } 

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

Я предполагаю, что осталось от разработчиков для реализации. Я разошлась и ничего не нашла.

Что является самым простым способом разрешить это?

ответ

5

Забудьте действия пароля для генерации сброса маркеров:

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model) 
{ 
    if (ModelState.IsValid) 
    { 
     var user = await UserManager.FindByNameAsync(model.Email); 
     if (user == null || !(await UserManager.IsEmailConfirmedAsync(user.Id))) 
     { 
      // Don't reveal that the user does not exist or is not confirmed 
      return View("ForgotPasswordConfirmation"); 
     } 

     // For more information on how to enable account confirmation and password reset please visit http://go.microsoft.com/fwlink/?LinkID=320771 
     // Send an email with this link 
     string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
     var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme);  
     await UserManager.SendEmailAsync(user.Id, "Reset Password", "Please reset your password by clicking <a href=\"" + callbackUrl + "\">here</a>"); 
     return RedirectToAction("ForgotPasswordConfirmation", "Account"); 
    } 

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

Сбросить действия пароля для сброса пароля на основе сгенерированных маркеров:

[AllowAnonymous] 
public ActionResult ResetPassword(string code) 
{ 
    return code == null ? View("Error") : View(); 
} 

[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model) 
{ 
    if (!ModelState.IsValid) 
    { 
     return View(model); 
    } 
    var user = await UserManager.FindByNameAsync(model.Email); 
    if (user == null) 
    { 
     // Don't reveal that the user does not exist 
     return RedirectToAction("ResetPasswordConfirmation", "Account"); 
    } 
    var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password); 
    if (result.Succeeded) 
    { 
     return RedirectToAction("ResetPasswordConfirmation", "Account"); 
    } 
    AddErrors(result); 
    return View(); 
} 

Релевент Просмотр моделей:

public class ResetPasswordViewModel 
{ 
    public string Email { get; set; } 
    public string Password { get; set; } 
    public string ConfirmPassword { get; set; } 
    public string Code { get; set; } 
} 

public class ForgotPasswordViewModel 
{ 
    public string Email { get; set; } 
} 

Но вы необходимо настроить службу электронной почты перед отправкой сообщений электронной почты.

public class EmailService : IIdentityMessageService 
{ 
    public Task SendAsync(IdentityMessage message) 
    { 
     return configSendGridasync(message); 
    } 

    private Task configSendGridasync(IdentityMessage message) 
    { 
     var myMessage = new SendGridMessage(); 
     myMessage.AddTo(message.Destination); 
     myMessage.From = new System.Net.Mail.MailAddress(
         "[email protected]", "My name"); 
     myMessage.Subject = message.Subject; 
     myMessage.Text = message.Body; 
     myMessage.Html = message.Body; 

     var credentials = new NetworkCredential("userName","Password"); 

     // Create a Web transport for sending email. 
     var transportWeb = new Web(credentials); 

     // Send the email. 
     if (transportWeb != null) 
     { 
      return transportWeb.DeliverAsync(myMessage); 
     } 
     else 
     { 
      return Task.FromResult(0); 
     } 
    } 
} 

В конце вам необходимо зарегистрировать этот класс Идентичность в менеджере пользователей конфигуратор оных следующие строки:

public static ApplicationUserManager Create(IdentityFactoryOptions<ApplicationUserManager> options, IOwinContext context) 
{ 
    var manager = new ApplicationUserManager(new UserStore<ApplicationUser>(context.Get<ApplicationDbContext>())); 

    // some code here 

    manager.EmailService = new EmailService(); 
} 

См Account Confirmation and Password Recovery with ASP.NET Identity (C#) как шаг за шагом учебник.

+0

Спасибо @SamFarajpourGhamari, я думаю, что что-то происходит с 'wait UserManager.SendEmailAsync()', потому что я по-прежнему не получаю никаких писем! – Ciwan

+1

Вам также необходимо настроить службу электронной почты. См. Мое обновленное сообщение. –