web-dev-qa-db-ja.com

Asp.netコアメールの確認でInvalidTokenと表示されることがある

私は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

どんな助けでも感謝します、ありがとう!

15
M.Tanzil

ユーザー作成プロセスに時間がかかりすぎていると思います確認をクリックする前に、ユーザーが作成されたことをデータベースで確認してくださいSQLテーブルでメールがfalseであることを確認してください

0
Jin Thakur

IDサーバーを使用してこの問題を解決する必要はありません。

ユーザー登録時に、ユーザーテーブルに2つの列を追加します。 1つは確認用、もう1つはIsVerified用です。検証トークン列に、Guidを追加します。次に、このGuidとのリンクを生成します。ユーザーがこのリンクをクリックすると、コントローラー内にGuidが表示されます。次に、この列を使用してこのユーザーを取得し、IsVerified列をtrueに設定して、Guid列を削除します。これで、ユーザーが正常に確認されました。

0
tapos ghosh

電子メール確認のリクエストでは、userIdとYour Private keyとして応答が返されますが、トークンのメソッドは、トークンの更新などの別の機能である必要があります。

0
Ahsan Iqbal

_userManager.ConfirmEmailAsync(user, code).ConfigureAwait(false)メソッドに渡す前に、確認コードをデコードする必要があります。

CallBackUrlで使用する確認コードをURLエンコードしました。使用する前にWebUtility.UrlDecode(code)を使用してデコードする必要があります。

0
Matt Schley

これは完全な答えではないかもしれませんが、緊急の修正と頭痛の軽減だけが必要な場合は、災害のない短いトークン/コードを生成してください。

    services.AddIdentity<ApplicationUser, ApplicationRole>(options => {
        options.Tokens.PasswordResetTokenProvider = TokenOptions.DefaultEmailProvider;
        options.Tokens.EmailConfirmationTokenProvider = TokenOptions.DefaultEmailProvider;
    }).AddDefaultTokenProviders()
    .AddEntityFrameworkStores<YourDbContext>();
0
hubert17

エンコードされたコードの最後に「==」が含まれている場合。つまり、コードが「cm9vdA ==」のように出力される場合は、urlencodeまたはbase64エンコードの後。

これをデコードすると、正確にエンコードされた文字列が得られず、無効なコードになります。

したがって、トークンの生成中に、エンコードされた値が「==」で終わるかどうかを確認します。別のトークンが生成されれば問題は解決します。

0
avinash