0

我在使用 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 服务器端组件的输入参数中的错误。

4

1 回答 1

0

您需要注意,您需要使用 Base64 的 URL 安全版本,以避免在通过查询字符串传递 Base64 字符串时出现问题

请参阅 如何在 C# 中实现 Base64 URL 安全编码?

于 2020-10-12T14:35:51.437 回答