使用 JWT Bearer 进行身份验证不起作用,调试表明问题出在 GetToken() 函数内部

Posted

技术标签:

【中文标题】使用 JWT Bearer 进行身份验证不起作用,调试表明问题出在 GetToken() 函数内部【英文标题】:Authentication with JWT Bearer doesn't work the debug says the problem is inside the GetToken() function 【发布时间】:2021-06-05 07:29:59 【问题描述】:

我有一个代码使用 JWT Bearer 来验证一些令牌,如下所示。

private string GetToken()
    
        var issuer = _factory.Configuration.GetValue<string>("JwtSettings:Issuer");

        DateTime expiryDate = DateTime.UtcNow.Add(TimeSpan.FromMinutes(1));

        var jwtSecurityToken = new JwtSecurityToken(
            issuer: issuer,
            claims: new List<Claim>()
            
                new Claim("a claim", "a claim value")
            ,
            expires: expiryDate,
            signingCredentials: new SigningCredentials(
                new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_factory.Configuration.GetValue<string> 
("JwtSettings:Secret"))),
                SecurityAlgorithms.RsaSha256Signature
            )
        );

        return new JwtSecurityTokenHandler().WriteToken(jwtSecurityToken);

    

private HttpClient GetClient()
    
        var client = _factory.CreateClient(new WebApplicationFactoryClientOptions
        
            AllowAutoRedirect = false,
        );

        var token = GetToken();
        client.DefaultRequestHeaders.Add(HttpRequestHeader.Authorization.ToString(), $"Bearer token");
        return client;
    

但它不起作用,我不知道因为我是 C-sharp 和 .Net 的新手

它给了我无法创建签名的错误

请帮忙。

【问题讨论】:

请发布确切的错误。但如果我猜测问题可能是您说您的令牌应该使用 RSA-SHA256 对称签名,但 RSA 是一种非对称密钥算法(即它需要 2 个密钥:一个用于签名,一个用于验证签名)。如果这是错误,请使用像 SecurityAlgoritms.HmacSha256 这样的对称算法。 @ckuri 错误与对称安全算法有关。我认为您的解决方案是正确的。我对后端开发很陌生。前面的代码是使用 rsa 生成一个令牌,而在 ge 令牌函数中我正在使用 rsa 对其进行解码,应该将其更改为 hmac。是否可以保留生成 rsa 并在 get token 函数中做一些事情? 【参考方案1】:

在您的代码中,您指定了 SecurityAlgorithms.RsaSha256Signature,这是一种非对称密钥算法,需要两个密钥(私钥和公钥)

要使代码正常工作,请将 SecurityAlgorithms.RsaSha256Signature 更改为 SecurityAlgorithms.HmacSha256Signature

【讨论】:

以上是关于使用 JWT Bearer 进行身份验证不起作用,调试表明问题出在 GetToken() 函数内部的主要内容,如果未能解决你的问题,请参考以下文章

Sails.js 与护照-http-bearer 身份验证不起作用

如何使用 OWIN Jwt Bearer Authentication 记录身份验证结果

ASP.Net Core - 使用 WebAPI 和 MVC 前端的 JWT 身份验证不起作用

Spring security + JWT + 经过身份验证并且 hasRole 不起作用?

使用 ADFS 的 JWT Bearer 身份验证将 ASP.NET Framework 迁移到 ASP.NET Core 3.1

在 Spring Boot 中成功 Oauth2 登录后 Cookie 身份验证而不是 JWT Bearer Token