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

验证JWT Bearer令牌时出现IDX10503签名验证失败错误求助

JWT令牌验证报错IDX10503的排查与解决

问题描述

后台调用方法验证字符串格式的Bearer JWT令牌时,抛出签名验证失败异常:

IDX10503: Signature validation failed. Keys tried: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
Exceptions caught:
'[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.
token: '[PII is hidden. For more details, see https://aka.ms/IdentityModel/PII.]'.

相关实现代码:

public bool ValidateToken(string authToken)
{
    try
    {
        var tokenHandler = new JwtSecurityTokenHandler();
        var validationParameters = GetValidationParameters();

        SecurityToken validatedToken;
        IPrincipal principal = tokenHandler.ValidateToken(authToken, validationParameters, out validatedToken);
    }
    catch(Exception e)
    {
        _MyLogger.Log(StaticVars.ERROR_UP, "validateToken: "+e.Message, "ValidateToken", 80);
        return false;
    }
    return true;
}


private static TokenValidationParameters GetValidationParameters()
{
    return new TokenValidationParameters()
    {
        ValidateIssuer = false,
        ValidateAudience = false,
        ValidateLifetime = false,
        ValidateIssuerSigningKey = false,
        ValidIssuer = "myissuer",
        ValidAudience = "myissuer",
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("Key..."))
    };
}

问题分析

  1. 关键信息隐藏:异常中的PII(敏感信息)被屏蔽,看不到令牌内容、尝试的密钥等细节,无法直接定位签名不匹配的具体原因。
  2. 配置逻辑冲突:代码中既关闭了ValidateIssuerSigningKey(签名密钥验证),又指定了IssuerSigningKey,导致验证流程混乱——即便关闭了验证开关,带签名的令牌仍会触发签名校验逻辑。
  3. 密钥不匹配:如果令牌本身带签名,本地配置的密钥和生成令牌时的密钥不一致,或密钥编码方式(如UTF-8/Base64)不匹配,都会触发签名验证失败。

解决步骤

1. 开启敏感信息显示获取详细日志

在程序启动阶段添加以下代码,取消PII隐藏,就能看到令牌、密钥的具体内容,方便精准排查:

// .NET Core/.NET 5及以上版本
IdentityModelEventSource.ShowPII = true;

// .NET Framework版本
System.IdentityModel.EventSource.IdentityModelEventSource.ShowPII = true;

2. 修正TokenValidationParameters配置

根据实际业务需求调整配置:

  • 不需要验证签名:要么确保令牌本身无签名,要么删除IssuerSigningKey配置,避免触发不必要的校验。
  • 需要验证签名:将ValidateIssuerSigningKey设为true,同时保证IssuerSigningKey和生成JWT时的密钥完全一致(包括编码方式)。

示例修正后的配置(需要签名验证的场景):

private static TokenValidationParameters GetValidationParameters()
{
    return new TokenValidationParameters()
    {
        ValidateIssuer = false,
        ValidateAudience = false,
        ValidateLifetime = false,
        ValidateIssuerSigningKey = true, // 开启签名密钥验证
        IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("生成令牌时实际使用的密钥"))
    };
}

3. 检查令牌本身

用JWT解析工具(如jwt.io)解析令牌,确认:

  • 令牌的签名算法(alg字段)和本地密钥类型匹配(比如HS256对应对称密钥,RS256对应非对称密钥)。
  • 令牌的基础信息(过期时间、颁发者、受众)是否符合预期(后续若开启对应验证需保持一致)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 09:37:04