Return 在 Ocelot 中未经授权 API 网关中间件

Return unauthorized in Ocelot API Gateway Middleware

此刻,我的微服务中有一个 Ocelot API 网关,但我最近在研究如何使 JWT 无效,而在我的项目中执行此操作的最佳方法是使用黑名单,所以我决定使用中间件预授权来检查我的 Redis 缓存中的无效 JWT 列表。如果令牌在缓存中,我一直在寻找强制 return 带有自定义消息的 401 的解决方案,但我找不到实用的解决方案。以下是我的尝试:

public async void Configure(IApplicationBuilder app, IWebHostEnvironment env, IDistributedCache cache) {
    if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseCors();

    app.UseAuthentication();

    app.UseAuthorization();

    app.UseEndpoints(endpoints => {
        endpoints.MapGet("/", async context => {
            await context.Response.WriteAsync("Hello World!");
        });
    });

    var configuration = new OcelotPipelineConfiguration {
        PreAuthorizationMiddleware = async (ctx, next) => {
            string token = ctx.Request.Headers["Authorization"].ToString().Replace("Bearer ", "");

            if (!string.IsNullOrEmpty(token)) {
                string blacklist = await cache.GetStringAsync(token);

                if (!string.IsNullOrEmpty(blacklist)) {
                    ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
                    await ctx.Response.WriteAsync("Custom Message");

                    return;
                }
            }

            await next.Invoke();
        }
    };

    await app.UseOcelot(configuration);
}

有人可以帮助我吗?我仅尝试过的解决方案 returns HTTP 状态代码 500 或始终为 401。

进入 Ocelot 的管道后,您必须玩 Ocelot 的游戏。它使用 HttpContext.Items 字典上的特殊对象和扩展方法在中间件之间传递数据。专门针对错误,它有 2 个扩展方法 SetErrorUpsertErrors。所以需要在查看黑名单后加上这个:

if (!string.IsNullOrEmpty(blacklist))
{
    ctx.Items.SetError(new UnauthorizedError("your custom message"));
    return;
}