c# – ASP.NET MVC5中的密码恢复
发布时间:2020-12-15 08:36:00 所属栏目:百科 来源:网络整理
导读:我在ASP.NET MVC 5应用程序中工作.用户可以无任何问题进行注册和登录.但是,当一个用户忘记他/她的密码时,忘记密码进程(已经到位)没有做任何事情!没有电子邮件发送给用户,点击此处重置密码链接. 目前我的ForgotPassword操作方法如下所示: [HttpPost][AllowA
我在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#)作为分步教程. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |