【发布时间】:2019-07-21 20:53:42
【问题描述】:
我在使用 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 作为输入路由参数:
//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 服务器端组件的输入参数中的错误。
【问题讨论】:
-
看起来您在
FromBase64String中传递的内容与ToBase64String之后得到的不同,我想您不需要UrlDecode -
我之前测试过删除它,但它也没有用。我终于创建了一个 6 位随机数并将其传递给 ConfirmEmail 页面,从而解决了我的问题。但它不如令牌安全,我花了几天时间在 Blazor 服务器端预览版 6 中解决这个问题(它在 blazor 客户端预览版 5 中工作)并尝试了所有场景但没有成功。
标签: token data-protection blazor-server-side