ASP.NET Core 3.1使用JWT生成Token时报IDX10653错误如何解决?
错误根因
IDX10653 错误的核心触发原因是JWT签名使用的对称密钥长度不满足所选加密算法的最低要求,.NET Identity组件会在校验密钥长度不匹配时直接抛出该异常,因此不会生成Token返回。你的用户注册逻辑和JWT生成逻辑解耦,所以用户数据可以正常入库。
具体可能的问题点:
- 配置的JWT安全密钥长度过短:不同的HMAC签名算法对密钥长度有明确要求,低于要求就会触发报错
- 密钥字符串转字节的实现错误:比如编码格式使用错误,导致实际生成的SymmetricSecurityKey长度不足
- 签名算法配置不匹配:所选算法要求的密钥长度远高于你实际配置的密钥长度
解决步骤
- 确认你使用的签名算法,匹配对应最低密钥长度要求:
- HS256(HmacSha256):密钥字节长度≥32位(对应纯英文/数字字符串最少32个字符)
- HS384(HmacSha384):密钥字节长度≥48位
- HS512(HmacSha512):密钥字节长度≥64位
直接将配置文件中的SecurityKey值修改为满足长度要求的随机字符串即可,示例HS256可用密钥:a2V5Zm9yand0dXNlMjAyNGFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6
- 修正
SecurityKeyHelper.CreateSecurityKey方法的实现,确保使用UTF8编码转字节,参考正确实现:
using System.Text; using Microsoft.IdentityModel.Tokens; public static class SecurityKeyHelper { public static SecurityKey CreateSecurityKey(string securityKey) { return new SymmetricSecurityKey(Encoding.UTF8.GetBytes(securityKey)); } }
- 检查创建JWT时传入的签名算法参数,确保和密钥长度匹配,示例
CreateJwtSecurityToken方法的核心实现:
private JwtSecurityToken CreateJwtSecurityToken(TokenOptions tokenOptions, User user, SigningCredentials signingCredentials, List<OperationClaim> operationClaims) { var jwt = new JwtSecurityToken( issuer: tokenOptions.Issuer, audience: tokenOptions.Audience, expires: DateTime.Now.AddHours(1), claims: SetClaims(user, operationClaims), notBefore: DateTime.Now, // 确保此处算法和密钥长度匹配,比如用HS256就写下面的参数 signingCredentials: new SigningCredentials(signingCredentials.Key, SecurityAlgorithms.HmacSha256) ); return jwt; }
- 调试验证:可以在生成密钥后加一行日志输出密钥长度,确认符合要求:
Debug.WriteLine($"当前生成密钥的位数为:{securityKey.KeySize}");
如果输出的数值大于等于你所选算法要求的最低位数,即可正常生成Token。
内容的提问来源于stack exchange,提问作者coytex
相关产品推荐
相关产品推荐

