当前位置: 首页 > 知识库问答 >
问题:

JWT验证在.NET Core中有效,在.NET Framework中失败

严修谨
2023-03-14

与这里提到的问题类似,我有一个问题,当运行在.NET Core2.2(在macOS和Windows上)上时,JWT验证可以工作,但在.NET Framework 4.7.2上却无法运行;在那里,它抛出一个异常:

Microsoft.IdentityModel.Tokens.SecurityTokenInvalidSignatureException:“IDX10503:签名验证失败。已尝试的密钥:“Microsoft.IdentityModel.Tokens.RsaseCurityKey,KeyId:”。捕获的异常:“”。内标识:“{”typ“:”jwt“,”alg“:”rs256“}.{”sub“:”username“,”scope“:”exampleScope“,”roles“:[”exampleRole“],”iss“:”https://example.com/“,”exp“:1556788122,”iat“:1555316893}”.“
在C:\agent1_work\109\s\src\system.identitymodel.tokens.jwt.jwtsecuritytokenhandler.validateSignature(String token,

测试程序:

using System;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Security.Cryptography;
using Microsoft.IdentityModel.Logging;
using Microsoft.IdentityModel.Tokens;

namespace JWTTest {
    class Program {
        static void Main(string[] args) {
            // Validation parameters
            //var rsa = new RSACryptoServiceProvider(); // this works in .NET Core on macOS but not on Windows ...
            var rsa = RSA.Create();
            rsa.KeySize = 2048;
            rsa.ImportParameters(new RSAParameters {
                  Modulus = Convert.FromBase64String("AM/Nh9cX8U+8ZeOcKyodBcZun1dgQysFZWLplOof9SpHt45vmh7gy3FxhLQEj2NrhV44AiymRxr1mmZ7K9K105MfDe/QAAFBy715/NHmKZxH7QvypiiPMf2jwpb+n/Ss0oUZ68zPSfO9aZwhUBWO+J7NBnWEwoq3Bxda5IQPMRkMohD5VZ0IPvUotcg6k7cOoRamvOiDyVQ58uVx+Wd+vucdVo6uT/kMKlBZoahU/hnREfNZojf0lAkzcxOlZcKbms/+Mu8vb/jeZSGYZpykL0c3ohGJ49NteFIXggx8AH6E8ROpijq2NeA7AK3Y+33LEJmSwOdNnZ1ZaY515AqeN/S+ay4Ra15V91qdu4ph1B+G5aKV3rcu0v1Y6/eG5dgHPIBRaf7sGVG7rCDOgrfbjaEdNvqX1TgNnmfogZElFt2qs5VVWKE5zEuOEkOngTEuvlJAsTgh/Uw/OS7vinbSmtGXFhKS2teatITyuNALaPeFAdA9qz9c90IJs9vbf9Uf9FFWvfrer9lhDhLUuehKJTt8vBtoqea46nf3IGthLeiGQmrVSEytoTGW67gGpVo8Xd+iat5ilhciNWX1/rscv66cg0S1IK7A/oXqWJO/WNq6EzFxI/f/0klMrcC8M5qioiiwNMvpAj/6KDZSxoII+rS9RDz/E0xWprkErrIa7aVv"),
                  Exponent = Convert.FromBase64String("AQAB")
            });
            var validationParameters = new TokenValidationParameters {
                ClockSkew = TimeSpan.FromMinutes(1),
                ValidateAudience = false,
                ValidateIssuer = true,
                ValidIssuer = "https://example.com/",
                IssuerSigningKey = new RsaSecurityKey(rsa)
            };

            // Verify token
            IdentityModelEventSource.ShowPII = true;
            JwtSecurityTokenHandler handler = new JwtSecurityTokenHandler();
            var token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJzdWIiOiJ1c2VybmFtZSIsInNjb3BlIjoiZXhhbXBsZXNjb3BlIiwicm9sZXMiOlsiZXhhbXBsZXJvbGUiXSwiaXNzIjoiaHR0cHM6Ly9leGFtcGxlLmNvbS8iLCJleHAiOjE1NTY3ODgxMjIsImlhdCI6MTU1NTMxNjg5M30.XHowlwvKX73I2KqKFInaadAGZNtj7UVvjh1EuodnttlUOmC59Q6XPSwrKkATLqicl46c7ItYGl75Mj5PVy03tOXXlxgsgoP81t1WM08QeHlrbPvay1aSFqcj7JcnX6fu9qiXzRhhh2XYw5UrT8-R3kIQMQA7d4cnT6Z1oeoHzV38ywi3rv3BapwuFtrFmSXHHsQMcTUK_Whf-5CEPj6O9CEdCXKFh05McGZDBoYBgZpn7d2H2EJNV9KhsasafsD7TVs6w3myOfc3HaqtHhFDUmpzwmWZdzn-i0zSxz1qussd9ovDaf03zkd7OWtau9_44T1KkWVK8GlAxuXnuPmCuh76ELQjpNqQerRL-F4EYkUwUJEQHFf2IolpCx4i2pDkzyax-fL4ZwjsncWNUJdXyex3Pk-OcSD11lJl0UWRE5gh-pOeEd1Ybhxu4z42Vet1rAM3VWXXyJQzAz2diVTJIbvaG3uq4-HxoBTkvfpXLj_2RN_oSTkyD8JoBIHQtMT1h7eZhHbxFLsxLoGNQVWJmyU_BPCs282m41n2Jd4ezR1M1XlLUixk8v1M1Rjxg3s7c8Q_PezmXzv3IrK8ftrmfb73uBwTxJukOeFk3yC7e7ZLhYJsBlJsyeGfJF8ayNSjxwkrXJN3JVZMOzZCQNnl3zc8AL6gjloFFlhgB5nlxJU";
            // exception is thrown on the next line:
            var user = handler.ValidateToken(token, validationParameters, out SecurityToken validatedToken);

            foreach (var role in user.Claims.Where(c => c.Type == ClaimTypes.Role)) {
                Console.WriteLine("Role: " + role.Value);
            }
        }
    }
}

JWT是用这个Java库生成的,但我不确定这是否重要;根据jwt.io,它是有效的。(链接说签名无效,但这是网站中的一个bug;只需在公钥末尾添加一个换行符即可触发验证。)我试过RS256和RS512算法生成的代币,但这没有什么区别。

我不确定它是否取决于Visual Studio设置;

  • Macos Mojave 10.14.4;Visual Studio for Mac 7.7.3(build 43);.NET Core SDK版本2.2.105(works)
  • Windows 10,版本1809;Visual Studio 2017,v15.9.11
    • .NET Core SDK 2.2.106(works)
    • .NET Framework 4.7.2(不工作)

共有1个答案

莫选
2023-03-14

不,Java图书馆不应该是问题所在。该问题在您所附的同一链接中提及。您需要重写并使用自定义密钥验证,因为库中的RSA解密附带了某种错误。

看看这和这更多的信息[再次它是相同的链接,你附上]。

该问题被引用到另一个问题中并被关闭。可能它应该被修复,除非一些包没有更新或在那里提到的版本。

 类似资料:
  • 编辑: 阅读有关bug的讨论:https://github.com/tymondesigns/jwt-auth/issues/83 我原来的问题是: 我正在使用jwt auth my protected resources实现,该资源需要经过身份验证的用户,代码如下: 当用户在API上登录时,将创建一个授权令牌,并将响应授权标头发送到调用资源的客户端应用程序。因此,客户端应用程序在截获任何响应的头

  • 我一直在关注Caroline的博客来设置一个多用户composer rest服务器。所以,我有两个服务器,即。管理服务器和用户服务器。 正如教程I中提到的: null 我第一次从Java服务交换JWT令牌。为了创建承载令牌,我编写了以下代码: 有了这个,我就能拿到令牌了。接下来,我使用这个令牌将卡导入到用户服务器上的钱包中: 然而,这导致:

  • 使用Mockito示例页面中最基本的示例,我能够在JUnit中成功运行。 然而,当我在斯波克运行相同的测试时,它失败了。 JUnit/Java版本(通过): Spock/Groovy版本(此失败): 以下是斯波克测试失败时出现的错误: 有什么想法或建议吗?我真的很喜欢斯波克和莫奇托,希望他们能很好地合作。非常感谢!

  • null 问题: 如何在前端获取此? 有效负载可以保存关于用户的任何信息(而不是任何敏感信息,如密码)。由于JWT在途中可能被篡改,所以在前端不验证JWT的情况下使用有效负载信息不危险吗?

  • 安装NoDJS、Ruby和Git + Buver后,尝试安装基础。 我一直收到以下错误,我不知道如何修复它: 找不到有效的宝石'基础'( 有什么想法吗?