【问题标题】:IDataProtector Unprotect: The input is not a valid Base-64 stringIDataProtector Unprotect:输入不是有效的 Base-64 字符串
【发布时间】: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


【解决方案1】:

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

How to achieve Base64 URL safe encoding in C#?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多