You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#序列化JWT负载数据异常:scope字段序列化结果错误

JWT Payload序列化scope字段异常解决方法

问题现象

验证JWT后,使用Newtonsoft.Json序列化Payload时,scope字段本该输出"scope":["scope1","scope2"],实际却得到"scope":[[],[]],但已确认原始令牌的scope字段值和数据类型均正确。

问题原因

JwtSecurityToken.Payload是ClaimsDictionary类型,多值声明(如scope)会被存储为多个Claim实例的集合。Newtonsoft.Json默认序列化该集合时,会解析每个Claim的内部结构,导致输出异常格式的数组。

解决方案

方案一:直接解析原始JWT的Payload段

跳过JwtSecurityTokenHandler的Payload解析逻辑,直接从原始令牌中提取并解码Payload部分,得到最原始的正确JSON:

public static void ParseToken(string token)
{
    try
    {
        var tokenParts = token.Split('.');
        if (tokenParts.Length != 3)
        {
            throw new ArgumentException("无效的JWT格式");
        }

        // Base64Url解码Payload段
        var payloadBytes = Base64UrlDecode(tokenParts[1]);
        var payloadJSON = Encoding.UTF8.GetString(payloadBytes);

        // 直接使用该JSON发送至其他服务
        // perform sending the token and other operations
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
    }
}

// 实现Base64Url解码
private static byte[] Base64UrlDecode(string input)
{
    input = input.Replace('-', '+').Replace('_', '/');
    switch (input.Length % 4)
    {
        case 2: input += "=="; break;
        case 3: input += "="; break;
    }
    return Convert.FromBase64String(input);
}

方案二:手动转换Payload为正确字典结构

如果必须使用JwtSecurityToken解析后的结果,手动处理多值声明,将其转换为字符串数组:

public static void ParseToken(string token)
{
    try
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var validatedToken = tokenHandler.ReadJwtToken(token);

        var payloadDict = new Dictionary<string, object>();
        foreach (var kvp in validatedToken.Payload)
        {
            if (kvp.Key == "scope" && kvp.Value is IEnumerable<Claim> scopeClaims)
            {
                // 将Claim集合转换为字符串数组
                payloadDict[kvp.Key] = scopeClaims.Select(c => c.Value).ToArray();
            }
            else
            {
                payloadDict[kvp.Key] = kvp.Value;
            }
        }

        var payloadJSON = JsonConvert.SerializeObject(payloadDict);

        // perform sending the token and other operations
    }
    catch (Exception e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
    }
}

内容的提问来源于stack exchange,提问作者JAYC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:47:37