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 个扩展方法 SetError
和 UpsertErrors
。所以需要在查看黑名单后加上这个:
if (!string.IsNullOrEmpty(blacklist))
{
ctx.Items.SetError(new UnauthorizedError("your custom message"));
return;
}
此刻,我的微服务中有一个 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 个扩展方法 SetError
和 UpsertErrors
。所以需要在查看黑名单后加上这个:
if (!string.IsNullOrEmpty(blacklist))
{
ctx.Items.SetError(new UnauthorizedError("your custom message"));
return;
}