2015-06-05 22 views
5

Stworzyłem aplikację MVC 4. W tej aplikacji Jeśli użytkownik zapomniał hasła, mam metodę wysłania wiadomości e-mail do użytkownika, aby zresetować hasło. Korzystam z członkostwa w asp.net IdentityOtrzymywanie błędu podczas resetowania hasła

Otrzymuję następujący komunikat o błędzie podczas wdrażania tego projektu na serwerze sieci Web. Działa doskonale w moim trybie localhost.

Komunikat o błędzie

Nie można edytować tego Użytkownika Operacja ochrony danych nie powiodła się. Przyczyną tego może być brak profilu użytkownika załadowanego dla użytkownika w kontekście bieżącego wątku, co może mieć miejsce w przypadku podszywania się pod wątek .!

jest to metoda zapomniałem hasło

[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("[email protected]", "My Application"), 
       new System.Net.Mail.MailAddress(user.Email)); 
       m.Subject = "Reset your Password"; 
       m.IsBodyHtml = true; 

       m.Body = string.Format("<img src=\"@@[email protected]@\" 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("@@[email protected]@", "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("[email protected]", "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); 
    } 
+0

Zastanawiam się czy to ten sam problem jak [to] (http://stackoverflow.com/questions/23455579/generating-reset-password-token-does-not-work -in-azure-strona internetowa)? Nie zgłoszono "możliwego duplikatu", ponieważ nie wiem na pewno :) –

Odpowiedz

8

miałem taki sam problem, a następnie po wielu badaniach okazało się, że problem jest w rozmieszczania IIS

więc po ten wątek ja w stanie rozwiązać mój Emisja

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.

  • Otwórz swoją Menedżer IIS

  • Sprawdzaj co AppPool aplikacja korzysta wybierając swoją aplikację, kliknij prawym przyciskiem myszy na niego i wybierz Zarządzaj Application -> Zaawansowane
    Ustawienia.

enter image description here

  • Następnie na górnej lewej stronie, wybierz Aplikacje Baseny i iść do przodu i wybierz aplikację Pool używany przez aplikację.

  • prawym przyciskiem myszy na niego i wybierz Ustawienia zaawansowane, przejdź do sekcji modelu i procesu Znajdź „Load Profil użytkownika” Option i ustawić go
    prawda.

enter image description here

+0

Czy istnieje ryzyko, aby ustawić "Załaduj profil użytkownika" = prawda? – Mahdi

Powiązane problemy