C#调用Convert.FromBase64String解析Bearer Token报错求助
解决C#解析Bearer Token的Base64错误问题
首先你犯了一个关键错误:不能把整个Bearer Token当作一个Base64字符串处理,Bearer Token是用.分隔的三段Base64Url编码内容(头部、载荷、签名),每一段都需要单独转换为标准Base64格式后再解码。
正确的处理步骤:
- 先把Token按
.拆分成三个部分,跳过空段(如果有的话) - 对每一段单独进行Base64Url到标准Base64的转换:
- 将字符
-替换为+,_替换为/ - 根据字符串长度补充填充符
=:Base64要求长度是4的倍数,计算当前长度模4的结果:- 余数为0:无需填充
- 余数为2:补充2个
= - 余数为3:补充1个
=
- 将字符
- 对转换后的每一段单独调用
Convert.FromBase64String解码
以下是可直接使用的C#代码示例:
string bearerToken = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImFpbV9hcGlvYXV0aGRpdCJ9.eyJzY29wZSI6WyJSUzQwMWsvRW1wbG95ZWUvQmVuZWZpY2lhcnkiXSwiZXhwIjoxNjk1ODgzMDYwLCJqdGkiOiI5ODhjNjcxYS0wMzhlLTRkMTMtYjYzOS1hMGY4YmI3N2VlMDYiLCJjbGllbnRfaWQiOiI1ZDE3MGFjOS1jZDY2LTQxNWYtODMzYS02Nzc2NDMwOTc5MjgifQ.SL3AC06E-OLB2yYmCQsOXdzFjeF2-R271QWswzCiEl_U77el6iWvfCQ2GxeBB2-AjVVJ-5gxiu0LI9sTgucK9Xhjnx5W_ZVQgzr_XSa2QcEIGXT5BH1a7OIEd7XTZT6WWwtzcA4QB5vXamA7KcWhxP1TeqrAl2Vd0AE-JagVS1FIHt70BLiqy21z_fsL4J4sE6gxVn8R5g9Djjy-UsH64anIgEZzrLbbDqP6AbSPLJIqpEq8T7W8ee8KGps2Z-IKg4XRv1_JqYPo4f_Qj21b8bpGp5DzifKu3UF9hrInAS9OxC8e1ZW5jesXiux62oWe7gHAay37m_4sEu0JNrbd_g"; // 拆分Token为三段 string[] tokenParts = bearerToken.Split('.', StringSplitOptions.RemoveEmptyEntries); foreach (string part in tokenParts) { // 转换Base64Url到标准Base64 string base64 = part.Replace('-', '+').Replace('_', '/'); // 补充填充符 switch (base64.Length % 4) { case 2: base64 += "=="; break; case 3: base64 += "="; break; } // 解码 byte[] decodedBytes = Convert.FromBase64String(base64); // 如果需要转成字符串(比如查看载荷内容) string decodedText = System.Text.Encoding.UTF8.GetString(decodedBytes); Console.WriteLine(decodedText); }
另外补充:如果你只是想解析JWT的载荷内容,不用自己处理Base64转换,直接用JWT库(比如System.IdentityModel.Tokens.Jwt)会更简单,避免手动处理的错误。
内容的提问来源于stack exchange,提问作者msbyuva
相关产品推荐
相关产品推荐

