在重置密码时出错

Cha*_*thz 6 c# asp.net forgot-password asp.net-mvc-4 asp.net-identity

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

我在Web服务器中部署此项目时收到以下错误消息.它完全在我的localhost模式下工作.

错误信息

无法编辑此用户数据保护操作失败.这可能是由于没有为当前线程的用户上下文加载用户配置文件引起的,这可能是线程模拟时的情况.

这是忘记密码的方法

    [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);
    }
Run Code Online (Sandbox Code Playgroud)

Kel*_*ane 9

我有同样的问题,经过多次研究后我发现问题出在IIS部署中

所以按照这个线程,我能解决我的问题

数据保护操作失败.这可能是由于没有为当前线程的用户上下文加载用户配置文件引起的,这可能是线程模拟时的情况.

  • 打开IIS管理器

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

在此输入图像描述

  • 之后,在左上角,选择"应用程序池",然后继续选择应用程序使用的应用程序池.

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

在此输入图像描述