私はasp.netコアアイデンティティ2.1を使用していますが、メール確認でランダムな問題が発生しますが、メール確認で時々result.Error = InvalidTokenと表示されます。トークンも有効期限が切れていません。
注:複数のサーバーを使用しており、すべてのサーバーが同じキーを使用できるように、キーを1か所に格納しています。
メール確認のコードスニペット。
メール確認
var confCode = await _userManager.GenerateEmailConfirmationTokenAsync(user);
var callbackUrl = Url.Action("ConfirmEmail", "Account", new
{
userId = user.Id,
code = WebUtility.UrlEncode(confCode)
}, protocol: HttpContext.Request.Scheme);
string confirmationEmailBody = string.Format(GetTranslatedResourceString("ConfirmationEmailBody"), "<a href='" + callbackUrl + "'>") + "</a>";
トークンの検証
public async Task<bool> ConfirmEmailAsync(string userId, string code)
{
if (string.IsNullOrEmpty(userId) || string.IsNullOrEmpty(code))
return false;
var user = await _userManager.FindByIdAsync(userId);
if (user == null)
return false;
var result = await _userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false);
if (!result.Succeeded)
result = await _userManager.ConfirmEmailAsync(user, WebUtility.UrlDecode(code)).ConfigureAwait(false);
return result.Succeeded;
}
無効なトークン
以下のトークンは2回エンコードされていますが、その状況を処理します
CfDJ8HYrrpCgcr5GvrItPOWapXRy8WF8odd%252BVKuDup7buRsl1x4agRpfgQlEIPWiBqM0Wuilu9tCv5l%252B3lNaAb89%252Fi%252B4k0y%252FH0jdXAbabz0%252FXDGA0eUrmcKdIsDFNuXeyP5ezTVmTx8t0ky9xCTXaKLAfvTsCJviETk5Ag9JbUs3l3%252BnUon6fyYOHsslJI5VKLqhMM0Sm%252BW1EE%252B%252FPEJ%252BXcn%252FPS1My%252BI1lExuF1R1hFEZScEsUCG%252Bx%252BVIFB9bzs1IoLC%252Baw%253D%253D
どんな助けでも感謝します、ありがとう!
ユーザー作成プロセスに時間がかかりすぎていると思います確認をクリックする前に、ユーザーが作成されたことをデータベースで確認してくださいSQLテーブルでメールがfalseであることを確認してください
IDサーバーを使用してこの問題を解決する必要はありません。
ユーザー登録時に、ユーザーテーブルに2つの列を追加します。 1つは確認用、もう1つはIsVerified用です。検証トークン列に、Guidを追加します。次に、このGuidとのリンクを生成します。ユーザーがこのリンクをクリックすると、コントローラー内にGuidが表示されます。次に、この列を使用してこのユーザーを取得し、IsVerified列をtrueに設定して、Guid列を削除します。これで、ユーザーが正常に確認されました。
電子メール確認のリクエストでは、userIdとYour Private keyとして応答が返されますが、トークンのメソッドは、トークンの更新などの別の機能である必要があります。
_userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false)
メソッドに渡す前に、確認コードをデコードする必要があります。
CallBackUrlで使用する確認コードをURLエンコードしました。使用する前にWebUtility.UrlDecode(code)
を使用してデコードする必要があります。
これは完全な答えではないかもしれませんが、緊急の修正と頭痛の軽減だけが必要な場合は、災害のない短いトークン/コードを生成してください。
services.AddIdentity<ApplicationUser, ApplicationRole>(options => {
options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
}).AddDefaultTokenProviders()
.AddEntityFrameworkStores<YourDbContext>();
エンコードされたコードの最後に「==」が含まれている場合。つまり、コードが「cm9vdA ==」のように出力される場合は、urlencodeまたはbase64エンコードの後。
これをデコードすると、正確にエンコードされた文字列が得られず、無効なコードになります。
したがって、トークンの生成中に、エンコードされた値が「==」で終わるかどうかを確認します。別のトークンが生成されれば問題は解決します。