我正在致力于创建一种生成 JWT 令牌的方法。该方法的一部分从我的 web.config 中读取一个值,该值作为“秘密”用于生成用于创建 JWT 令牌签名的哈希值。
<add key="MySecret" value="j39djak49H893hsk297353jG73gs72HJ3tdM37Vk397" />
最初,我尝试使用以下方法将“秘密”值转换为字节数组。
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
work?
当我将身份验证服务迁移到 .NET Core 时,我遇到了同样的事情。我查看了我们在之前的实现中使用的库的源代码,差异实际上在于名称本身。
TextEncodings 类有两种类型的文本编码器:Base64TextEncoder 和Base64Url编码器。后一个稍微修改了字符串,以便可以在 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)