为啥我们有两个用于 JWT 令牌 JwtSecurityTokenHandler 和 JsonWebTokenHandler 的类?

Posted

技术标签:

【中文标题】为啥我们有两个用于 JWT 令牌 JwtSecurityTokenHandler 和 JsonWebTokenHandler 的类?【英文标题】:Why we have two classes for JWT tokens JwtSecurityTokenHandler vs JsonWebTokenHandler?为什么我们有两个用于 JWT 令牌 JwtSecurityTokenHandler 和 JsonWebTokenHandler 的类? 【发布时间】:2020-06-12 18:16:00 【问题描述】:

它总是令人困惑,没有提到哪个更好用,我个人更喜欢 JsonWebTokenHandler 因为它更适合 ValidateToken 的返回类型

命名空间的区别是Microsoft.IdentityModel.JsonWebTokens vs System.IdentityModel.Tokens.Jwt,也挺相似的?

有任何可用的指南吗?

【问题讨论】:

【参考方案1】:

JsonWebTokenHandler 是新的和改进的版本。

见:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/945

brentschmaltz 写道:

JwtSecurityTokenHandler 是根据现有的 System.IdentityModel.SecurityTokenHandler 建模的。我们必须做出一些妥协,例如在使用 SecurityTokenDescriptor 时使用 System.Security.ClaimsIdentity 作为构建 JWS 或 JWE 的类型。 ValidateToken 有一个 SecurityToken 类型的 out 参数,它不适用于异步。 返回了 ClaimsPrincipal,有时使用声明类型映射来构建声明。 这个模型是新模型,重量更轻,并且适用于原生 Json.Net 对象。 我们计划在顶层进行分层,以便您可以恢复到现有类型,但我们将允许用户控制使用注入和委托返回的内容。

在某些情况下,我们看到性能提升高达 100%。

【讨论】:

另外,在wiki page for the project 上,明确指出Microsoft.IdentityModel.Tokens.JsonWebTokens“是System.IdentityModel.Tokens.Jwt 的更新、更快的版本,具有附加功能。”

以上是关于为啥我们有两个用于 JWT 令牌 JwtSecurityTokenHandler 和 JsonWebTokenHandler 的类?的主要内容,如果未能解决你的问题,请参考以下文章

哪种 JWT 刷新策略更安全?

为啥我应该使用 JWT 而不是简单的散列令牌

一个用于多种服务的 JWT 令牌

为啥对于拥有包含“正确”权限的 JWT 令牌的用户禁止使用此 API?

用于跨域身份验证的 JWT 令牌

为啥 JWT 是无状态认证?