当前位置:  开发笔记 > 编程语言 > 正文

TextEncodings.Base64Url.Decode与Convert.FromBase64String

如何解决《TextEncodings.Base64Url.Decode与Convert.FromBase64String》经验,为你挑选了1个好方法。

我正在创建一个将生成JWT令牌的方法。该方法的一部分从我的web.config中读取一个值,该值用作“秘密”,用于生成用于创建JWT令牌签名的哈希。


最初,我尝试使用以下命令将“秘密”值转换为字节数组。

byte[] key = Convert.FromBase64String(ConfigurationManager.AppSettings["MySecret"]);

但是,到达此行时引发了异常。

输入内容不是有效的Base-64字符串,因为它包含非base 64字符,两个以上的填充字符或填充字符中的非法字符。

因此,我查看了OAuth代码,然后使用了另一种方法将base64字符串更改为字节数组

byte[] key = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["MySecret"]);

此方法没有问题。在我看来,他们在做同样的事情。将Base64文本值更改为字节数组。但是,我一定会丢失一些东西。为什么Convert.FromBase64String失败并TextEncodings.Base64Url.Decode起作用?



1> Iris Classon..:

将身份验证服务迁移到.NET Core时遇到了同样的事情。我看了我们在先前实现中使用的库的源代码,实际上区别在于名称本身。

TextEncodings类具有两种类型的文本编码器,Base64TextEncoder和Base64UrlEncoder。后者稍微修改了字符串,以便可以在URL中使用base64字符串。

我的理解是,用+和_替换+和/ 是很常见的。事实上,我们一直在使用握手令牌进行相同的操作。另外,末尾的填充字符也可以删除。这为我们提供了以下实现(来自源代码):

public class Base64UrlTextEncoder : ITextEncoder
{
    public string Encode(byte[] data)
    {
        if (data == null)
        {
            throw new ArgumentNullException("data");
        }

        return Convert.ToBase64String(data).TrimEnd('=').Replace('+', '-').Replace('/', '_');
    }

    public byte[] Decode(string text)
    {
        if (text == null)
        {
            throw new ArgumentNullException("text");
        }

        return Convert.FromBase64String(Pad(text.Replace('-', '+').Replace('_', '/')));
    }

    private static string Pad(string text)
    {
        var padding = 3 - ((text.Length + 3) % 4);
        if (padding == 0)
        {
            return text;
        }
        return text + new string('=', padding);
    }
}

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有