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

ASP.Net 5-OAuth不记名令牌(JWT)验证错误

熊博远
2023-03-14

我一直在开发一个系统,使用JSON Web Tokens对我网站上的用户进行身份验证和授权。我的系统即将完成,但当我尝试在我的代码中使用[Authorize(“承载”)]属性时,我遇到了错误。错误如下:

System.IdentityModel.Tokens。消息中出现SecurityTokenInvalidSignatureException:抛出异常:“System.IdentityModel.Tokens。Microsoft.IdentityModel.Logging中的SecurityTokenInvalidSignatureException。dll附加信息:IDX10503:签名验证失败。已尝试的键:“”。捕获异常:“”。令牌:“{类型”:“JWT”,“alg”:“RS256”,“kid”:“null”}。{“名称ID”:“6581f5a0-1775-4ce4-8650-a3d7e613b216”,“唯一名称”:“alex”,“AspNet.Identity.SecurityStamp”:“8da933c3-0f88-42ea-876d-c07e99d1eecc”,“iss”:“Uniti”,“aud”:“Uniti”,“exp”:1436849284,“nbf”:1436845684}”

我不明白为什么它没有使用JWT测试任何密钥。我在启动文件中定义了一个RSA密钥。没有进一步拖动它,我已经提供了解决下面这个错误可能需要的代码。

我的启动代码(生成密钥和OAuthBeber选项):

#region RSA Key Generation

        var rsa = new RSACryptoServiceProvider(2048);
        var rsaKey = rsa.ExportParameters(true);
        var key = new RsaSecurityKey(rsaKey);

        services.AddInstance(new SigningCredentials(key, SecurityAlgorithms.RsaSha256Signature, SecurityAlgorithms.Sha256Digest));

        #endregion

        services.AddInstance(new OAuthBearerAuthenticationOptions
        {
            SecurityTokenValidators = new List<ISecurityTokenValidator>
            {
                new JwtSecurityTokenHandler()
            },
            TokenValidationParameters = new TokenValidationParameters
            {
                IssuerSigningKey = key,
                ValidIssuer = "Uniti",
                ValidAudience = "Uniti"
            },
        });

        services.AddAuthorization();
        services.ConfigureAuthorization(auth =>
        {
            auth.AddPolicy("Bearer", builder =>
            {
                builder.AddAuthenticationSchemes(OAuthBearerAuthenticationDefaults.AuthenticationScheme);
                builder.RequireAuthenticatedUser();
            });
        });

我的代币生成代码:

var claimsIdentity = (ClaimsIdentity) User.Identity;

            var handler = BearerOptions.SecurityTokenValidators.OfType<JwtSecurityTokenHandler>().First();
            var securityToken = handler.CreateToken(
                issuer: "Uniti",
                audience: "Uniti",
                signingCredentials: BearerCredentials,
                subject: claimsIdentity
                );

            var token = handler.WriteToken(securityToken);

是我忘记在某处添加一些内容,还是我生成的密钥不正确?如果你能帮助我,提前谢谢你!

共有1个答案

尉迟龙光
2023-03-14

我打赌这是因为注册OAuth2承载选项的方式不正确,正如我在之前的回答中所解释的:https://stackoverflow.com/a/31322654/542757

services.AddInstance(new OAuthBearerAuthenticationOptions());

当您使用服务时。此外,OAuth2 持有者中间件无法检索选项(以及密钥),因为它在内部使用 IOptions

这是注册 OAuth2 持有者选项的正确方法:

services.ConfigureOAuthBearerAuthentication(options => {
    // Configure the options used by the OAuth2 bearer middleware.
});

 类似资料:
  • 我目前正在使用Vapor开发Swift后端。我的iOS客户端使用新的iOS 13功能“使用Apple登录”。当用户登录时,我会得到一个身份令牌(访问令牌),这是一个由Apple签名的有效JWT令牌。这将在所有正在进行的通信中发送到服务器,以验证服务器提供的某些路由。 在服务器上,我想通过验证令牌签名来验证发送的令牌是否确实由Apple签名,并且不是由某些恶意用户专门创建的。Apple提供了一个HT

  • 我正在制作一个javascript客户端,它使用JWT令牌连接到Api。在服务器端没有问题,我可以创建令牌对其进行签名,然后验证签名,从而确保没有人篡改令牌。 但我如何在客户端做到这一点。我可以解码JWT令牌并查看头、负载和签名。但是如何在客户端验证签名?是否有用于此的库,如何将公钥传输到客户端? 如果我不验证签名,我怎么知道令牌没有被篡改?

  • 使用库"firebase_id_token"验证ruby on rails中的Firebase id令牌。 一旦我用google_sign_in库从前端获得有效令牌并发送到后端,它总是提示“JWT::VerificationError(签名验证引发)”。尽管我已经检查了jwt.io,在那里我可以看到有效载荷和报头的信息,但无法验证签名。 firebase_id_token.rb 另外,我检查了密钥

  • 我在令牌使用者上得到以下错误。任何帮助解决这将是非常感谢的。多谢了。 “IDX10503:签名验证失败。 公共无效配置(IApplicationBuilder应用程序)

  • 我有一个使用 Msal 库获取的 Azure AD JWT 令牌,但是当我尝试验证此令牌时出现问题: 客户端:共享点 Web 部件 另一方面,我有一个服务器应用程序(Java),其中验证了访问令牌 验证人: 法典 我的问题是,当我尝试验证此令牌时,我收到了此错误:使用算法验证时,令牌的签名无效:SHA256with RSA 我被困在这个,如果令牌是正确的,为什么我有这个错误? 问候