使用A256GCM加密JWT遇IDX10617异常,求.NET 6.0适配方案
关于Microsoft.IdentityModel.JsonWebTokens 6.35.0中A256GCM加密JWT的问题解答
问题场景
使用Microsoft.IdentityModel.JsonWebTokens库6.35.0版本时,尝试用A256GCM算法加密JWT抛出异常,相关代码如下:
string token = handler.CreateToken(new SecurityTokenDescriptor { Audience = "api1", Issuer = "https://test.com", Claims = new Dictionary<string, object> { { "sub", "811e790749a24d8a8f766e1a44dca28a" } }, SigningCredentials = new SigningCredentials(privateSigningKey, SecurityAlgorithms.EcdsaSha256), EncryptingCredentials = new EncryptingCredentials(publicEncryptionKey, SecurityAlgorithms.RsaOAEP, SecurityAlgorithms.Aes256Gcm) // 引发异常的代码行 });
抛出的异常信息:
Microsoft.IdentityModel.Tokens.SecurityTokenEncryptionFailedException: 'IDX10617: Encryption failed. Keywrap is only supported for: 'A128CBC-HS256', 'A192CBC-HS384' and 'A256CBC-HS512'. The content encryption specified is: 'A256GCM'.'
问题解答
1. 解密使用该算法加密的JWE是否也会失败?
是的。当前6.35.0版本的库不支持A256GCM算法的密钥包装逻辑,首先加密环节就无法生成有效JWE;如果是其他合规工具生成的A256GCM格式JWE,用这个版本的库解密同样会失败,因为它没有实现该算法的解密逻辑。
2. .NET 6.0环境下,有没有可替代方案能使用A256GCM算法?
有两种可行方案:
- 升级库版本:将Microsoft.IdentityModel.JsonWebTokens从6.35.0升级到6.40.0及以上版本,后续版本已经修复了这个限制,支持A256GCM等GCM类加密算法的密钥包装,升级后原代码即可正常运行。
- 切换第三方JWT库:使用
Jose-JWT库,它在.NET 6环境下原生支持A256GCM加密JWE,示例代码如下:
var payload = new Dictionary<string, object> { { "sub", "811e790749a24d8a8f766e1a44dca28a" }, { "iss", "https://test.com" }, { "aud", "api1" } }; // 生成A256GCM加密的JWE string jwe = Jose.JWT.Encode(payload, publicEncryptionKey, Jose.JweAlgorithm.RSA_OAEP, Jose.JweEncryption.A256GCM); // 解密JWE var decodedPayload = Jose.JWT.Decode<Dictionary<string, object>>(jwe, privateEncryptionKey, Jose.JweAlgorithm.RSA_OAEP, Jose.JweEncryption.A256GCM);
内容的提问来源于stack exchange,提问作者Sohlae
相关产品推荐
相关产品推荐

