2017-01-19 5 views
1

私は知っていますが、この質問は何度も尋ねられていますが、私の問題は少し異なります。ASP.NET ID 2電子メールの確認無効なトークン

私はGenerateEmailConfirmationTokenAsyncConfirmEmailAsyncメソッドで奇妙な問題が発生しています。

メールを送信する前に、正しくHttpUtility.UrlEncodeHttpUtility.UrlDecodeの方法を使用しています。

奇妙なことは、ユーザーの作成中とメールを受け取った後で、エラーを再現できないことです。確認してください。しかし、同じ環境では、サインアップした10人のユーザーのうち3人が、無効なトークンの問題を報告しています。

私はもう少し調べましたが、IISが再起動されたり、公開された後に変更される可能性のあるマシンキーが原因で発生する可能性があります。だから同じものに取り組むために、マシンキーを生成してweb.configに保存しましたが、それでも問題はそこにあるようです。

私はAzure App Serviceでこれを主催しています。

他に何が間違っているのでしょうか?

UPDATE:私はあなたのためにここのコードを追加している人は

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-confirmation /ユーザーのセキュリティスタンプについて言及していない - その理由が考えられます。 – trailmax

答えて

0

一つの可能​​な理由は、トークンが前に期限切れになることが考えられとして確認が動作しますユーザーがトークンを送信するのに時間がかかりすぎる場合、検証されます。トークンは無効にされる前に使用されなければならない寿命があります。デフォルトのTokenLifespanisは1日(24時間)です。

アイデンティティ設定コードをチェックして、トークンの寿命が変更されたことを確認してください。例えば

次のコードは、トークンは上記のコードでは、3時間

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

で期限切れになるように設定し、パスワードを忘れた場合や確認メールトークンは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); 
関連する問題