我目前正在使用 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 中的中间件?
无论如何,一些帮助将不胜感激!
祝你有美好的一天,
廖