2017-01-18 2 views
0

MVC 5의 "비밀번호 분실"부분을 프로젝트에 추가하기 만하면 이메일을받은 후에 비밀번호를 변경할 수 없습니다.ASP.NET 토큰 오류 재설정 암호

오류 : Visual Studio에서 앱 =>Image of error in the app

에서 => 오류에서 온 Image of error visual studio

코드 : I 시도

public async Task<ActionResult> ResetPassword(ResetPasswordViewModel model) 
    { 
     if (!ModelState.IsValid) 
     { 
      return View(model); 
     } 
     var user = await UserManager.FindByEmailAsync(model.Email); 
     if (user == null) 
     { 
      // Don't reveal that the user does not exist 
      return RedirectToAction("ResetPasswordConfirmation", "Account"); 
     } 
     var code = model.Code.Replace(" ","+"); 
     **var result = await UserManager.ResetPasswordAsync(user.Id, model.Code, model.Password);** 
     if (result.Succeeded) 
     { 
      return RedirectToAction("ResetPasswordConfirmation", "Account"); 
     } 
     AddErrors(result); 
     return View(); 
    } 

많은 것들에 유래를 찾아 기타는 작동하지 않았습니다.

당신은 내가이 오류 :

내가 비주얼 스튜디오에서 ASP.NET 웹 응용 프로그램의 생성에 제안 된 기본 템플릿을 사용할 수있어 왜 어떤 아이디어를 가지고있는 경우. 원하는 코드 파일을 모두 업로드 할 수 있습니다. 필요한 도움을 요청하면 2 분 안에 업로드 할 수 있습니다!

덕분에 당신은 즉, 이메일로 변경 전송하기 전에 당신이 callbackUrl 당신은 인코딩, code (토큰)를 URL로 필요

string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 

를 생성하는 코드 아래 사용하고있는 기본 템플릿을 사용하는 가정

+0

오류를 생성하는 영역의 관련 코드와 함께보고있는 오류를 적어도 포함하면 도움이됩니다. –

+0

나는 @JamesThorpe를 얻는 오류를 보여주기 위해 초기 게시물을 편집했습니다 –

답변

0

내 callbackUrl는 내가 그럼 내가 잘

를 인코딩, 수동으로 URL을 생성의 ForgotPasswordViewModel에서

첫 번째 토큰 특수 문자를 대문자로 형식을했다

  string code = await UserManager.GeneratePasswordResetTokenAsync(user.Id); 
      code = System.Web.HttpUtility.UrlEncode(code); 
      string datcode = code; 
      //var callbackUrl = Url.Action("ResetPassword", "Account", new { userId = user.Id, code = code }, protocol: Request.Url.Scheme); 
      var datUrl = "http://localhost:62989/Account/Resetpassword?" + user.Id + "&Code=" + code; 

upperCase 문제로 인해 콜백을 my emai 메시지에 할당 할 때 ToTitleCase 메서드를 잊어 버렸기 때문에 제거했습니다.

  message = message.Replace("@ViewBag.Name", CultureInfo.CurrentCulture.TextInfo.ToTitleCase(usernom)); 
      message = message.Replace("@ViewBag.CallBackUrl", datUrl); 
      await MessageServices.SendEmailAsync(model.Email, emailSubject, message); 

둘째, i를 ResetPasswordViewModel, 내가

code = code.Replace(' ', '+'); 

마지막으로는 ResetPasswordAsync 기능에 좋은 일하고,

var code = WebUtility.UrlDecode(model.Code); 

와 토큰을 디코딩하고 원래 +로 빈 공간을 대체 ! 도움

0

code = HttpUtility.UrlEncode(code)

이 라인을 var code = model.Code.Replace(" ","+");

홉이 필요하지 않습니다 이것은 도움이됩니다. 나는 문제가 무엇인지 파악

+0

"code = HttpUtility.UrlEncode (code);"를 추가하여 해결책을 시도했습니다. 하지만 나는 잘못된 토큰 오류 메시지를 계속받습니다./ –

+0

전자 메일을 보내기 전에'code' 값을 확인하고 동일한'code'를 받았는지 확인하십시오. 인코딩으로 인해 + =와 같은 특수 문자의 값이 약간 변경되는 경우가 있습니다. –

+1

빈 공간으로 제거되는 문자열에서 '+'와 함께 hte 문제를 파악했습니다. lowerCase로 대체되는 대문자로 인해 @Ravi에 도움이되었습니다. :) –

1

에 대한

var result = await UserManager.ResetPasswordAsync(user.Id, code, model.Password); 

감사 @Ravi 내 문제는 매우 유사하지만, 모든 URL을 변환 내 라우팅 엔진 (등, 검색 엔진 최적화에 대한) 소문자로 될 일이. 나는 쿼리 문자열 매개 변수가 대소 문자가 혼합되어 있는지 확인해야했습니다. Base64는 대소 문자를 혼합하여 사용합니다.

각 컨트롤러 메소드에 NoLowercaseQueryString 속성을 추가했습니다. 이는 MVC Boilerplate project에만 해당됩니다.

관련 문제