JWT 令牌未在远程服务器上验证,无法匹配“孩子”错误

Posted

技术标签:

【中文标题】JWT 令牌未在远程服务器上验证,无法匹配“孩子”错误【英文标题】:JWT token not validating on remote server , Unable to match 'kid' Errror 【发布时间】:2016-10-29 00:21:37 【问题描述】:

我正在使用带有 openiddict 的 asp.net 核心,我正在使用 jwtmiddleware 进行授权

 app.UseJwtBearerAuthentication(new JwtBearerOptions
            
                AutomaticAuthenticate = true,
                AutomaticChallenge = true,
               RequireHttpsMetadata = false,
               Authority= "http://localhost"
            );

但由于某种原因引发此错误,我们将不胜感激。

信息: Microsoft.AspNetCore.Authentication.JwtBearer.JwtBearerMiddleware[7] 承载未通过身份验证。失败消息:IDX10501:签名验证失败。无法匹配“孩子”: '7FG4SQ4TIATESTLI-ZDHTLRYPWIEDU_RA1FVG91D',令牌: '"alg":"RS256","typ":"JWT","kid":"7FG4SQ4TIATESTLI-ZDHTLRYPWIEDU_RA1FVG9 1D"."unique_name":"asd","email":"asd","AspNet.Identity.SecurityStamp":"eb93ee4 4-6dbf-41b8-b1d6-157e4aa23ea7","jti":"4f0f5395-e565-4489-8baf-6361d5c4cb94","美国 ge":"access_token","机密":true,"scope":["offline_access","profile","emai l","roles"],"sub":"9125d8c5-5739-4f46-8747-e3423a464969","azp":"firebaseApp","nb f":1466997962,"exp":1466999762,"iat":1466997962,"iss":"http://localhost:5000/"' .警告:Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 过滤器“Microsoft.AspNetCore.Mvc.A uthorization.AuthorizeFilter”处的请求授权失败。警告: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 过滤器“Microsoft.AspNetCore.Mvc.A uthorization.AuthorizeFilter”处的请求授权失败。

【问题讨论】:

【参考方案1】:

    Authority 应该包含您的 OIDC 服务器的基地址。您应该使用端口指定授权 URL(在您的情况下为 5000,对应于令牌信息中的“iss”声明):

    Authority="http://localhost:5000"
    

    您可以通过设置ValidateIssuerSigningKey = false 来禁用授权验证。 JwtBearerOptions 包含属性 TokenValidationParameters,聚合有关验证的设置:

    app.UseJwtBearerAuthentication(new JwtBearerOptions
        
            ...
            TokenValidationParameters = new TokenValidationParameters  ValidateIssuerSigningKey = false
        
    

【讨论】:

感谢回答在哪里设置 ValidateIssuerSigningKey = false 并且我们不能在不同的服务器上拥有权限吗?? 感谢我的情况,我刚刚发现我正在使用 aws 进行托管,所以我拥有 https:// 域。 com 在与 http:// 域通信的负载均衡器上。 com 所以发行者是 http:// 但是调用 https:// 所以它说 CORS 没有启用,我们可以添加 cors 还是有任何解决方法?负载均衡器基本上是面向互联网的网关,将其重定向到没有 ssl 的实际服务器 有什么资源可以让我了解更多关于 TokenValidationParameters 的信息吗? 刚刚测试了ValidateIssuerSigningKey = false。它不起作用,没有权限它根本不起作用,我将更新异常 同样的异常没有变化【参考方案2】:

如果您使用的是第三方 STS(例如不是 identityserver 或 Auth0),那么您可以使用 BackChannelHandler 来更轻松地从中间件调试 http 结果:

app.UseJwtBearerAuthentication(new JwtBearerOptions() 
    ...
    BackchannelHttpHandler = new BackChannelHandler()
    ...

然后

using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace Application.API.Utilities

    public class BackChannelHandler : HttpMessageHandler
    
        protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        
            HttpClient client = new HttpClient(new HttpClientHandler(), disposeHandler: false);
            client.DefaultRequestHeaders.Add("Accept", "application/json");
            var res = await client.GetAsync(request.RequestUri);
            return res;
        
       

在我的例子中,jwks 和 openid-configuration 端点的默认返回类型是 text/html 而不是 application/json。通过在从自定义处理程序发出请求时添加 Accept 标头,一切正常。

【讨论】:

以上是关于JWT 令牌未在远程服务器上验证,无法匹配“孩子”错误的主要内容,如果未能解决你的问题,请参考以下文章

签名验证失败。无法匹配“孩子”

Spring/Boot - JWT 未在 GET 请求中获取

未在 cookie 中设置令牌

api 端点未在 Sanctum 上进行 CSRF 令牌验证 - CSRF 令牌不匹配

使用 SymmetricSecurityKey 签署 jwt 时如何指定孩子?

JWT 签名未在 PHP 中验证