TextEncodings.Base64Url.Decode 与 Convert.FromBase64String

2023-11-24

我正在致力于创建一种生成 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(使用前将#替换为@)

TextEncodings.Base64Url.Decode 与 Convert.FromBase64String 的相关文章

随机推荐

  • 是否可以在 iOS 9 上将 iPad 应用程序设置为不进行多任务处理

    我有一个大型应用程序 需要一些时间来针对 iOS9 进行优化 编辑 我担心的是当应用程序窗口大小减小时 所有 UI 都会被挤在一起 所以我的问题是 有什么方法可以强制应用程序全屏显示吗 要为您的应用程序选择退出 禁用 多任务处理 选择您的目
  • Random.nextGaussian() 的问题

    Random nextGaussian 应该给出均值 0 和标准差 1 的随机数 它生成的许多数字都超出了 1 1 范围 我如何设置才能使其给出仅在 1到1范围内的正态分布随机数 均值为 0 标准差为 1 的高斯分布意味着分布的平均值为 0
  • 谷歌登录gapi未定义

    我正在尝试在我的网站上启用谷歌登录 该按钮有效 与我的帐户同步 但我无法从谷歌访问用户ID 这就是我的想法
  • jQuery 按类计数元素 - 实现此目的的最佳方法是什么?

    我想做的是计算当前页面中具有相同类的所有元素 然后将其添加到输入表单的名称中 基本上我允许用户单击 span 然后通过这样做为更多相同类型的项目添加另一个 但我想不出一种方法来简单地用 jQuery JavaScript 来计算所有这些 然
  • IllegalStateException 地图大小不应为 0 [重复]

    这个问题在这里已经有答案了 我有一个MapFragment显示地图 如果用户带着地图离开活动 或设备进入睡眠状态 然后回来onResume接到电话后 我将地图移回到标记处 但是当我移动相机时我遇到了异常 07 23 16 28 42 725
  • 使用 jQuery 删除文本

    有没有办法使用 jQuery 删除未包含在任何标签中的文本 p This is some text p This is unwrapped text to be removed span some more text span 感谢您的帮助
  • 为什么要执行更高阶的程序?

    因此 如果一种语言提供了更高阶的过程 那么我可以拥有返回过程的过程 就像是 define Proc a b c lambda x method body here in terms of a b c and x 要创建新程序 我只需执行以下
  • 难以实现 1Gbit UDP 吞吐量

    对于负载小于1470的UDP数据包 是否有可能达到1Gbit的吞吐量 由于数据包较小 实现这样的吞吐量应该存在一些瓶颈 I O 操作系统 网络等 我想驱动程序和硬件可能必须调整为小数据包 高吞吐量 有人尝试用小 UDP 数据包成功实现 1G
  • 如何用JavaScript获取HTML页面的标题?

    如何使用 JavaScript 获取 HTML 页面的标题 Use document title console log document title MDN 网络文档
  • 监听 .NET 控制台应用程序中的按键

    How can I continue to run my console application until a key press like Esc is pressed 我假设它缠绕在 while 循环中 我不喜欢ReadKey因为它会
  • 仅抑制对其他人代码的 pytest 警告

    我正在尝试pytest首次 如何抑制有关我的代码所依赖的其他人的代码发出的警告 而不抑制有关我自己的代码的警告 现在我的里面有这个pytest ini所以我不必看到 pytest 警告我有关某些弃用的信息jsonschema我正在使用的包
  • jQuery:触发 .click() 事件,一个接着一个

    我遇到的情况是 我必须在页面上执行多个操作才能初始化其设置 我还没有任何代码 因为坦率地说 我很难找到开始的地方 这是我想做的 jQuery document ready function element one trigger click
  • 跨域窗口之间的 postMessage 在 IE10 中不起作用(它适用于框架)

    我按照这个教程http davidwalsh name window postmessage 并创建了可在 Chrome 和 Firefox 中运行但不能在 IE 10 中运行的跨域消息传递脚本 有人能给我一些关于如何针对 IE 8 修改它
  • cocoa 获取已安装应用程序的列表

    有没有办法在可可中获取当前用户所有已安装的应用程序 NSArray runningApps NSWorkspace sharedWorkspace launchedApplications 上面给出了我当前正在运行的应用程序 但对于我的应用
  • 在 C# 中向图表添加水平线

    我正在使用一个System Windows Forms DataVisualization Chart绘制一些 x y 散点数据 如下所示 chart1 Series Series2 Points AddXY stringX doubleY
  • 如何使用 Gradle 构建在 Android Studio 中导入 com.google.android.gms.*?

    我已按照此处描述的程序进行操作 Setup我点击了 与 Gradle 同步项目 小按钮 Gradle 和 Android Studioseem找到所有内容 但我实际上无法使用 gms 代码 如果我尝试导入 我将获得 com google a
  • 如何获取 mscorlib.ni.lib (.Net Framework 3.5) 的 PDB 文件

    经过大量搜索后 我仍然无法找到该问题的解决方案 我有一个 mdmp 文件 调用堆栈显示它正在使用 mscorlib ni dll 因此 要获取函数信息 我需要获取其 pdb 文件 mscorlib ni dll的版本是2 0 50727 3
  • FullCalendar - 图像作为事件

    希望使用完整日历并将图像包含为事件和可拖动 简而言之 很想看看这个例子如何https fullcalendar io js fullcalendar 3 0 1 demos external dragging html将使用小缩略图而不是文
  • JAVA 中带有 JSON 字符串的 HTTP POST 请求

    我必须使用我已经生成的 JSON 字符串发出 http Post 请求 我尝试了两种不同的方法 1 HttpURLConnection 2 HttpClient 但我从他们两个那里得到了同样的 不想要的 结果 到目前为止我的代码HttpUR
  • TextEncodings.Base64Url.Decode 与 Convert.FromBase64String

    我正在致力于创建一种生成 JWT 令牌的方法 该方法的一部分从我的 web config 中读取一个值 该值作为 秘密 用于生成用于创建 JWT 令牌签名的哈希值