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