.NET6中如何使用X509证书验证非JWT格式第三方Token
结论
可以仅通过持有的X509证书完成该非JWT Token的合法性验证,同时提取全部身份相关数据。
原因说明
你当前收到的Token是DotNetOpenAuth默认生成的OAuth2 Bearer Token,属于框架自定义的二进制序列化令牌,并非JWT格式:
- 字符串开头的
gAAAAA是Base64Url编码后二进制序列化结构的典型前缀,令牌本身做了RSA加密+RSA签名双层保护,和你原有代码里「同一个证书同时提供签名验签公钥、解密私钥」的逻辑完全对应。 - 令牌的验证、解密逻辑不依赖DotNetOpenAuth的专有封闭逻辑,所有加密、签名算法都是标准RSA算法,.NET 6内置的加密库完全可以实现。
.NET 6 下的实现步骤
- 第一步:处理Token编码格式。将收到的Token字符串做Base64Url转标准Base64处理:把字符串里的
-替换为+、_替换为/,在末尾补全=填充位直到长度是4的整数倍,解码得到原始二进制字节数组。 - 第二步:解密令牌内容。调用X509证书对象的
GetRSAPrivateKey()方法获取RSA实例,使用OAEP填充模式(和DotNetOpenAuth默认的PKCS#1 v2.0填充规则一致)解密二进制数组,得到带签名的令牌明文字节流。 - 第三步:合法性校验。从解密后的明文字节流中提取签名字段,调用证书公钥对应的验签方法,验证签名是否匹配、令牌内容是否被篡改,同时校验令牌里自带的过期时间字段是否在有效期内。
- 第四步:提取身份数据。校验通过后,按DotNetOpenAuth固定的二进制结构读取明文字节流中的声明字段,即可拿到原逻辑返回的IPrincipal对应的全部信息,包括用户标识、角色、授权范围、签发方信息等。
注意事项
- 不要尝试用JWT解析类库(比如
System.IdentityModel.Tokens.Jwt)处理该Token,它没有JWT的三段式点分结构,无法被JWT解析器识别。 - 整个实现过程不需要依赖任何第三方NuGet包,.NET 6内置的
System.Security.Cryptography命名空间下的RSA相关API已经覆盖全部加解密、验签能力。 - 解密后的明文字节流结构是固定的,前4字节是版本标识,后续依次为签名哈希块、过期时间戳、声明集合、签发方标识,直接用
BinaryReader按顺序读取字段即可,不需要兼容旧框架的二进制序列化引擎。
内容的提问来源于stack exchange,提问作者Roman Matkovskyi
相关产品推荐
相关产品推荐

