在重置密码时出错

时间:2015-06-05 07:40:28

标签: c# asp.net asp.net-mvc-4 asp.net-identity forgot-password

我创建了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);
    }

1 个答案:

答案 0 :(得分:9)

我有同样的问题,经过多次研究后我发现问题出在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管理器

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

  •   

enter image description here

  
      
  • 之后,在左上角选择“应用程序池”,然后选择应用程序使用的应用程序池。

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

  •   

enter image description here