Ocelot Asp. net Промежуточное программное обеспечение для предварительной аутентификации ядра - PullRequest
0 голосов
/ 21 февраля 2020

В настоящее время я использую 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
            };
        });

Я хотел запустить некоторую пользовательскую проверку для реализации рабочего процесса refre sh token, для чего я реализовал Промежуточное программное обеспечение 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, даже если это не так. Поэтому я думаю, что Middleware аутентификации запускается с первым JWT, когда для нового еще не установлен заголовок авторизации. Это посещаемое поведение? А может я не правильно понял промежуточное ПО в Ocelot?

В любом случае, некоторая помощь будет принята с благодарностью!

Хорошего дня,

Lio

...