重置密码时出错

Posted

技术标签:

【中文标题】重置密码时出错【英文标题】:Getting an error while going to reset password 【发布时间】:2015-08-20 01:52:59 【问题描述】:

我创建了 MVC 4 应用程序。在该应用程序中,如果用户忘记了密码,我有方法向用户发送电子邮件以重置密码。我正在使用 asp.net 身份成员身份

我在 Web 服务器中部署此项目时收到以下错误消息。它在我的本地主机模式下完美运行。

错误信息

无法编辑此用户 数据保护操作不成功。 这可能是由于没有为 当前线程的用户上下文,当 线程正在模拟。!

这是忘记密码的方法

    [AllowAnonymous]
    public ActionResult ForgotPassword()
    
        return View();
                

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> ForgotPassword(ForgotPasswordViewModel model)
    

        if (model.UserName == null)
        
            ModelState.AddModelError("", "Please enter the Username");
        

        if (model.Email == null)
        
            ModelState.AddModelError("", "Please enter the Email ID");
        

        if (model.Email == null & model.UserName == null)
        
            ModelState.AddModelError("", "Please enter the Username and Email ID");
        

        if(ModelState.IsValid)
        
            var username = await UserManager.FindByNameAsync(model.UserName);
            var user = await UserManager.FindByEmailAsync(model.Email);



            if (user != null && username != null)
            
                ApplicationDbContext context = new ApplicationDbContext();
                UserStore<ApplicationUser> store = new UserStore<ApplicationUser>(context);


                var provider = new Microsoft.Owin.Security.DataProtection.DpapiDataProtectionProvider("MyProject"); 
                UserManager.UserTokenProvider = new Microsoft.AspNet.Identity.Owin.DataProtectorTokenProvider<ApplicationUser>(provider.Create("EmailConfirmation"));
                var code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id);

                System.Net.Mail.MailMessage m = new System.Net.Mail.MailMessage(
                new System.Net.Mail.MailAddress("sample@email.lk", "My Application"),
                new System.Net.Mail.MailAddress(user.Email));
                m.Subject = "Reset your Password";
                m.IsBodyhtml = true;

                m.Body = string.Format("<img src=\"@@IMAGE@@\" alt=\"\"><BR/><BR/>Hi 0,<BR/><BR/>Please click the below link to reset your password. <BR/><BR/> <a href=\"1\" title=\"Reset Password\">Reset Password</a>", user.UserName, Url.Action("ResetPassword", "Account", new  UserId = user.Id, code = code , Request.Url.Scheme)) + string.Format("<BR/><BR/>Regards,<BR/>We Are <BR/>");



                 string attachmentPath = Server.MapPath("~/Images/hec-logo.png");

                string contentID = Path.GetFileName(attachmentPath).Replace(".", "") + "@zofm";

                Attachment inline = new Attachment(attachmentPath);
                inline.ContentDisposition.Inline = true;
                inline.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
                inline.ContentId = contentID;
                inline.ContentType.MediaType = "image/png";
                inline.ContentType.Name = Path.GetFileName(attachmentPath);
                m.Attachments.Add(inline);

                // replace the tag with the correct content ID
                m.Body = m.Body.Replace("@@IMAGE@@", "cid:" + contentID);

                System.Net.Mail.SmtpClient smtp = new System.Net.Mail.SmtpClient("11.11.11.111");
                smtp.Port = 11;
                smtp.Credentials = new System.Net.NetworkCredential("sample@email.lk", "8888888");
                smtp.EnableSsl = false;
                smtp.Send(m);

                // Don't reveal that the user does not exist or is not confirmed

            



            return View("ForgotPasswordConfirmation");
        


      else 
      
            ModelState.AddModelError("", "The Username or Email ID is invalid.");
      
        // If we got this far, something failed, redisplay form
        return View(model);
    

【问题讨论】:

不知道是不是和this一样的问题? Havent'标记为可能重复,因为我不确定:) 【参考方案1】:

我也遇到了同样的问题,经过多次研究我发现问题出在 IIS 部署中

所以按照这个帖子我可以解决我的问题

The data protection operation was unsuccessful. This may have been caused by not having the user profile loaded for the current thread’s user context, which may be the case when the thread is impersonating.

打开 IIS 管理器

通过选择您的应用程序,右键单击它,然后选择管理应用程序 -> 高级,找出您的应用程序正在使用的 AppPool 设置。

之后,在左上角选择 Applications Pools,然后继续选择您的应用使用的 App Pool。

右键单击它,然后选择高级设置,转到流程模型部分并找到“加载用户配置文件”选项并将其设置为 是的。

【讨论】:

设置“加载用户配置文件”=true 有风险吗?

以上是关于重置密码时出错的主要内容,如果未能解决你的问题,请参考以下文章

尝试在 Laravel 5 上使用 mandrill 重置密码时出错

sudo mysqld_safe --skip-grant-tables & , /var/lib/mysql 重置root密码时出错

任意用户密码重置:重置凭证未校验

任意用户密码重置:重置凭证可暴破

Django 在密码重置时不会重定向到正确的路径

在使用 Django 框架构建的博客 Web 应用程序中单击重置密码时,我没有收到密码重置电子邮件链接