更新到 .NET 6 后使用 JWT Bearer Token 进行身份验证时未经授权(无效令牌)

Mo *_* B. 39 c# authentication jwt asp.net-core

将软件包Microsoft.AspNetCore.Authentication.JwtBearer从版本 3.1.14 更新到 6.0.1 后,身份验证请求失败,并显示 401 Unauthorized invalid token

新的软件包版本需要更改哪些内容?

Mo *_* B. 81

这似乎是一个错误。添加事件处理程序 ( JwtBearerEvents),故障可以被识别为MissingMethodException

Method not found: 'Void Microsoft.IdentityModel.Tokens.InternalValidators.ValidateLifetimeAndIssuerAfterSignatureNotValidatedJwt(Microsoft.IdentityModel.Tokens.SecurityToken, System.Nullable`1<System.DateTime>, System.Nullable`1<System.DateTime>, System.String, Microsoft.IdentityModel.Tokens.TokenValidationParameters, System.Text.StringBuilder)'.
Run Code Online (Sandbox Code Playgroud)

带有堆栈跟踪

at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateSignature(String token, TokenValidationParameters validationParameters)
at System.IdentityModel.Tokens.Jwt.JwtSecurityTokenHandler.ValidateToken(String token, TokenValidationParameters validationParameters, SecurityToken& validatedToken)
at Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerHandler.HandleAuthenticateAsync()",
Run Code Online (Sandbox Code Playgroud)

只需添加当前版本即可System.IdentityModel.Tokens.Jwt解决问题。


更新:另请注意下面@Rubenisme 的评论。

  • 谢谢,您的修复有效,并且很容易搜索,但您也可以做其他事情。此问题在此处确定:https://github.com/AzureAD/azure-activedirectory-identitymodel-extensions-for-dotnet/issues/1792,正如 ericbl 在那里所述,它也可以通过删除对 Microsoft 的显式引用来修复。 IdentityModel.Tokens。我在我的应用程序上测试了这两个修复程序。 (16认同)
  • 我确认删除显式参考是有效的,恕我直言,这是最好的解决方案。 (3认同)
  • 两个修复都有效。但是,如果您无法删除对 Microsoft.IdentityModel.Tokens 的显式引用,则为 System.IdentityModel.Tokens.Jwt 添加显式引用将解决该问题。猜猜这两个会互相覆盖或者其他什么 (3认同)

小智 13

虽然我猜你找到了正确的解决方案,但我认为我的答案可能对某些问题有所帮助。

在花了一整天的时间调查同样的问题并没有找到解决方案后,我决定升级这些库以匹配相同的版本:6.16.0 (2022年3月23日)

  • Microsoft.IdentityModel.JsonWebTokens
  • Microsoft.IdentityModel.Logging
  • Microsoft.IdentityModel.Protocols
  • Microsoft.IdentityModel.Protocols.OpenIdConnect
  • Microsoft.IdentityModel.Tokens

然后问题就消失了

  • 它对我有用,我必须将所有这些引用更新为同一版本,谢谢 (2认同)