我在ASP.NET MVC 5应用程序中工作.用户可以无任何问题进行注册和登录.但是,当一个用户忘记他/她的密码时,忘记密码进程(已经到位)没有做任何事情!没有电子邮件发送给用户,点击此处重置密码链接.
目前我的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); }
我猜这是留给开发人员实现的.我用Google搜索,发现没有什么是直截了当的.
允许这种最简单的方法是什么?
解决方法
忘记密码操作以生成重置令牌:
[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,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( "you@somewhere.com","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); } } }
最后,您需要在用户管理器配置器中注册此类Identity添加以下行:
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#)作为分步教程.