0

Identity ConfirmEmailAsync に問題があり、常に無効なトークンが返されます。そこで、カスタム TokenProvider を作成します。一方では、私はこのコードを持っています:

//string confirmationToken = await userManager.GenerateEmailConfirmationTokenAsync(user);
string confirmationToken = await tokenProvider.GenerateAsyncEmail("mzpurposes", userManager, user);

string confirmationLink =
            $"{httpContext.HttpContext.Request.Scheme}://{httpContext.HttpContext.Request.Host}" +
            $"/account/confirmemail/{System.Web.HttpUtility.UrlEncode(user.Id)}" +
            $"/{System.Web.HttpUtility.UrlEncode(confirmationToken)}";

反対側の ConfirmEmail ページでは、UserID とトークンを入力ルート パラメータとして受け取ります。

//IdentityResult result = await userManager.ConfirmEmailAsync(user, System.Web.HttpUtility.UrlDecode(Token));
    bool result =
        await tokenProvider.ValidateAsyncEmail("mzpurposes", System.Web.HttpUtility.UrlDecode(Token), userManager, user);
    if (result)   //.Succeeded)
    {
        Model = new UserConfirmModel() { Success = true };
    }
    else
    {
        Model = new UserConfirmModel() { Success = false };
    }

私が持っているトークンを作成するメソッドの最後にあるカスタム TokenProvider で:

var protectedBytes = protector.Protect(ms.ToArray());
        return Convert.ToBase64String(protectedBytes);

Validate メソッドの冒頭には、次のものがあります。

 var unprotectedData = protector.Unprotect(Convert.FromBase64String(token));

確認リンクをクリックしてコードがこの行に到達するたびに、次のエラーが発生します。

入力は、base 64 以外の文字、3 つ以上の埋め込み文字、または埋め込み文字に無効な文字が含まれているため、有効な Base-64 文字列ではありません。"}

メソッド GenerateAsyncEmail の最後のバイトを base64string に変換すると、このエラーが発生するのはなぜですか? 私が持っているスタートアップクラスでも:services.AddDataProtection(); それをtokenproviderクラスに注入します。

これは、Blazor サーバーサイド コンポーネントの入力パラメーターのバグであると確信しています。

4

1 に答える 1