2017-01-19 6 views
1

알다시피,이 질문은 여러 번 묻지 만 문제는 조금 다릅니다.ASP.NET ID 2 전자 메일 확인 잘못된 토큰

나는 GenerateEmailConfirmationTokenAsyncConfirmEmailAsync 방법으로 이상한 문제가 있습니다.

전자 메일을 보내기 전에 HttpUtility.UrlEncodeHttpUtility.UrlDecode 메서드를 올바르게 사용하고 있습니다.

이상한 점은 사용자 생성과 메일 수신 후 오류를 재현 할 수 없다는 것입니다. 그러나 같은 환경에서 10 명 중 3 명이 잘못된 토큰 문제를 신고합니다.

좀 더 검색 한 결과 IIS가 다시 시작되거나 변경 사항이 게시 된 후에 변경 될 수있는 컴퓨터 키로 인해 발생할 수 있음을 발견했습니다. 따라서 동일한 문제를 해결하기 위해 Machine Key를 생성하고 web.config에 보관했지만 여전히 문제가있는 것으로 보입니다.

나는 Azure App Service에서 이것을 호스팅하고 있습니다.

그 외 무엇이 잘못 될지 더 이상 생각하지 않으십니까?

업데이트 : 내가 당신을 위해 여기에 코드를 추가 해요 사람은

string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 

var callbackUrl = new Uri(string.Format("{0}?userId={1}&code={2}", ConfigurationManager.AppSettings["EmailConfirmationURL"], user.Id, HttpUtility.UrlEncode(code))); 

string emailTemplate = MailTemplates.UserRegistrationEmailTemplate(FirstName, CompanyName, callbackUrl); 

await CustomEmail.SendEmail(new List<string> { user.Email }, "Confirm your account", emailTemplate); 

을 검토하고

IdentityResult result = await UserManager.ConfirmEmailAsync(userId, HttpUtility.UrlDecode(code)); 
+0

사용자가 토큰을 제출하는 데 너무 오래 걸리면 제출되기 전에 토큰이 만료 될 수 있습니다. 토큰은 무효화되기 전에 사용해야하는 수명이 있습니다. – Nkosi

+0

토큰을 올바르게 인코딩하고 있다고 확신하는 동안. 당신이 한 일을 보여주십시오. 코드에 대해 더 많은 관심을 기울일 수 있다면 어떤 문제라도 발견 할 수 있습니다. – Nkosi

+0

당신은 이것을 보았습니까? http : //tech.trailmax.info/2015/05/asp-net-identity-invalid-token-for-password-reset-or-email-confirm/사용자를위한 보안 스탬프를 언급하지 않았습니다. – trailmax

답변

0

한 가지 가능한 이유는 토큰 전에 만료되는 것을 막을 수 있으므로 확인 작동 사용자가 토큰을 제출하는 데 너무 오래 걸리는 경우 유효성이 검사됩니다. 토큰은 무효화되기 전에 사용해야하는 수명이 있습니다. 하루 TokenLifespanis 기본값 (24 시간).

토큰 수명에 변경된 사항을 확인하려면 ID 구성 코드를 확인하십시오.

예를 들어 다음 코드 3 시간 3시간 만료됩니다 위의 코드, 잊어 버린 암호와 이메일 확인 토큰으로

if (dataProtectionProvider != null) 
{ 
    manager.UserTokenProvider = 
     new DataProtectorTokenProvider<ApplicationUser> 
      (dataProtectionProvider.Create("ASP.NET Identity")) 
      {      
      TokenLifespan = TimeSpan.FromHours(3) 
      }; 
} 

에 만료 토큰을 설정합니다. 만기 후에 토큰을 사용하려고하면 유효하지 않은 토큰 오류가 발생합니다.

OP는 문제를 재현 할 수 없음을 나타냅니다. 이는 토큰이 토큰 수명 기간 동안 유효성이 검증되기 때문일 수 있습니다.

0

문자열 연결을 사용하여 URL을 만드는 대신 Url.Action을 사용하십시오. Url.Action은 최신 MVC 버전에서 장면 뒤에서 인코딩을 수행하므로 인코딩 및 디코딩 작업을 피할 수 있습니다.

다음은 사용할 수있는 코드입니다.

string code = await UserManager.GenerateEmailConfirmationTokenAsync(user.Id); 

         var callbackUrl = Url.Action("ConfirmEmail", "Account", new 
         { 
          userId = user.Id, 
          code = code, 
          returnUrl = model.ReturnUrl 
         }, protocol: Request.Url.Scheme);