.NET 6中如何将Bearer令牌转换为JWT令牌并解析其载荷?
在.NET 6中解析Bearer携带的JWT令牌
首先明确核心概念:Bearer是HTTP认证的方案标识,真正的令牌内容是Authorization请求头中Bearer 前缀后的字符串。如果供应商声称发送的是JWT,那这个后缀字符串应该是标准三段式结构(header.payload.signature,由两个英文点分隔)。
步骤1:正确提取令牌内容
从请求的Authorization头中移除Bearer 前缀,得到原始令牌字符串即可,无需额外编码转换(你之前代码中对URL做Base64转换是错误逻辑,那是生成认证头的操作,和解析收到的令牌无关)。
步骤2:使用官方库解析JWT
.NET 6中推荐使用官方的System.IdentityModel.Tokens.Jwt库解析JWT,无需依赖第三方工具。
1. 安装NuGet包
在项目中安装对应包:
Install-Package System.IdentityModel.Tokens.Jwt
或通过.NET CLI执行:
dotnet add package System.IdentityModel.Tokens.Jwt
2. 解析代码示例
using System.IdentityModel.Tokens.Jwt; using System.Text.Json; // 假设你已从请求头中获取到完整的Authorization字段值 string authorizationHeader = "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c"; // 提取JWT令牌核心内容 string jwtToken = authorizationHeader.Replace("Bearer ", string.Empty).Trim(); // 先验证是否为标准JWT格式 if (!jwtToken.Contains('.')) { throw new InvalidOperationException("令牌不符合JWT标准格式,请联系供应商确认"); } var handler = new JwtSecurityTokenHandler(); if (handler.CanReadToken(jwtToken)) { JwtSecurityToken jwt = handler.ReadJwtToken(jwtToken); // 获取JWT头部信息 var header = jwt.Header; Console.WriteLine("头部信息:"); Console.WriteLine(JsonSerializer.Serialize(header, new JsonSerializerOptions { WriteIndented = true })); // 获取JWT载荷信息 var payload = jwt.Payload; Console.WriteLine("\n载荷信息:"); Console.WriteLine(JsonSerializer.Serialize(payload, new JsonSerializerOptions { WriteIndented = true })); // 获取JWT签名(原始Base64Url编码字符串) string signature = jwt.RawSignature; Console.WriteLine("\n签名:"); Console.WriteLine(signature); } else { throw new InvalidOperationException("无法解析该令牌,请确认其为有效的JWT"); }
关键注意事项
- 如果提取后的令牌不是三段式结构,说明供应商发送的并非标准JWT,需要直接联系对方确认令牌格式。
- 上述代码仅完成解析操作,不验证签名的有效性。若需要验证签名合法性,需额外配置供应商提供的密钥或证书(遵循对方的认证规则)。
内容的提问来源于stack exchange,提问作者Pxaml
相关产品推荐
相关产品推荐

