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 サーバーサイド コンポーネントの入力パラメーターのバグであると確信しています。