我在使用 Identity ConfirmEmailAsync 时遇到问题,并且总是返回 Invalid Token。所以我写了一个自定义的 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 和 Token 作为输入 Route 参数:
//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);
并且在验证方法的开头有:
var unprotectedData = protector.Unprotect(Convert.FromBase64String(token));
每次我单击确认链接并且代码到达此行时,我都会收到此错误:
输入不是有效的 Base-64 字符串,因为它包含非 base 64 字符、两个以上的填充字符或填充字符中的非法字符。"}
当我将 GenerateAsyncEmail 方法末尾的字节转换为 base64string 时,为什么会收到此错误?同样在我的启动类中: services.AddDataProtection(); 我将它注入到 tokenprovider 类。
我确定这是 Blazor 服务器端组件的输入参数中的错误。