如何在Blazor WASM中解密JWE Token?
在Blazor WebAssembly中解密ASP.NET Core生成的JWE Token
问题原因
你生成的是**JWE(JSON Web Encryption)**令牌,这是经过加密的Token,而非普通的JWS(仅签名的JWT)。Jose.JWT.Payload方法仅能直接解析未加密的JWS,无法处理加密后的JWE,因此必须先解密才能获取Claims。
解决方案
使用jose-jwt库的Decode方法解密JWE,再解析Payload中的Claims,具体实现如下:
1. 确认依赖安装
确保Blazor WASM项目已安装jose-jwt NuGet包:
Install-Package jose-jwt
2. 修改Token解析方法
private IEnumerable<Claim> ParseTokenClaims(string access_token) { // 与后端生成JWE时使用的加密密钥完全一致 var encryptionKey = Encoding.UTF8.GetBytes("16CharEncryptKey"); // 解密JWE,获取原始Payload的JSON字符串 var payloadJson = Jose.JWT.Decode(access_token, encryptionKey); // 将JSON反序列化为字典,再转换为Claim集合 var payloadDictionary = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(payloadJson); return payloadDictionary? .Select(kv => new Claim(kv.Key, kv.Value?.ToString() ?? string.Empty)) .ToArray() ?? Enumerable.Empty<Claim>(); }
可选:同时验证签名(防止Token篡改)
如果需要确保Token未被篡改,可以在解密时同时验证签名,传入后端的签名密钥:
private IEnumerable<Claim> ParseTokenClaimsWithValidation(string access_token) { var encryptionKey = Encoding.UTF8.GetBytes("16CharEncryptKey"); var signingKey = Encoding.UTF8.GetBytes("LongerThan-16Char-SecretKey"); // 解密同时验证签名,验证失败会抛出异常 var payloadJson = Jose.JWT.Decode(access_token, encryptionKey, signingKey); var payloadDictionary = System.Text.Json.JsonSerializer.Deserialize<Dictionary<string, object>>(payloadJson); return payloadDictionary? .Select(kv => new Claim(kv.Key, kv.Value?.ToString() ?? string.Empty)) .ToArray() ?? Enumerable.Empty<Claim>(); }
关键注意事项
- 密钥必须与后端完全一致:加密密钥对应后端的
encryptionkey,签名密钥对应后端的secretKey,编码格式也要统一(此处均为UTF8)。 jose-jwt会自动从JWE头部识别加密算法(对应后端的Aes128KW和Aes128CbcHmacSha256),无需手动指定。- 解密或签名验证失败时库会抛出异常,建议添加异常处理逻辑。
内容的提问来源于stack exchange,提问作者Shahram
相关产品推荐
相关产品推荐

