2

我目前正在使用 Ocelot 作为微服务架构的 Api Gateway。我有一些经过身份验证的重新路由并且能够使用它,我声明了一个身份验证中间件,如下所示:

var authenticationProviderKey = "Authentification";
        services.AddAuthentication(x =>
        {
            x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
        })
        .AddJwtBearer(authenticationProviderKey, x =>
        {
            x.RequireHttpsMetadata = false;
            x.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuerSigningKey = true,
                IssuerSigningKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(token.Secret)),
                ValidIssuer = token.Issuer,
                ValidAudience = token.Audience,
                ValidateIssuer = true,
                ValidateAudience = true
            };
        });

我想运行一些自定义验证来实现刷新令牌工作流,为此我实现了 preAuthentication 中间件来进行测试:

 PreAuthenticationMiddleware = async (ctx, next) =>
            {
                IEnumerable<string> header;
                ctx.DownstreamRequest.Headers.TryGetValues("Authorization", out header);
                if (header.FirstOrDefault() != null)
                {
                    if (JwtUtils.ValidateExpirationToken(header.FirstOrDefault()))
                    {
                        //On validate refresh token
                        Console.WriteLine("PreAuthentification Middleware");
                        Tuple<int, string> credentials = JwtUtils.retrieveInfos(header.FirstOrDefault());
                        string token = JwtUtils.GenerateToken(credentials.Item1, credentials.Item2);
                        ctx.DownstreamRequest.Headers.Remove("Authorization");
                        ctx.DownstreamRequest.Headers.Add("Authorization", token);
                        await next.Invoke();
                    }
                }
            }

据我了解,当我进行 api 调用时,将调用 preAuthenticate 中间件,并使用 next.Invoke() 调用我的身份验证中间件。我的 PreAuthentication 中间件中新生成的令牌是有效的,但我的身份验证中间件会引发 expiredToken 异常,即使他不是。因此,当新的 JWT 尚未设置为授权标头时,我认为身份验证中间件是针对第一个 JWT 运行的。是参加的行为吗?或者我没有正确理解 Ocelot 中的中间件?

无论如何,一些帮助将不胜感激!

祝你有美好的一天,

4

0 回答 0