如何在 Ocelot 和 .Net WebApi 中覆盖 AuthorizationMiddleware 时返回未经授权的响应
Posted
技术标签:
【中文标题】如何在 Ocelot 和 .Net WebApi 中覆盖 AuthorizationMiddleware 时返回未经授权的响应【英文标题】:How to return Unauthorized response while overriding AuthorizationMiddleware in Ocelot & .Net WebApi 【发布时间】:2021-10-12 07:32:23 【问题描述】:我正在尝试使用 .NET 5 WebApi 中的 OcelotPipelineConfiguration 覆盖 Ocelot AuthorizationMiddleware。这是我的代码:
更新
配置
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IAuthorizationService authorizationService)
if (env.EnvironmentName == Environments.Development)
app.UseDeveloperExceptionPage();
app.UseAuthentication();
var configuration = new OcelotPipelineConfiguration
AuthorizationMiddleware = async (ctx, next) =>
if (! await authorizationService.IsValid(ctx))
ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
await ctx.Response.WriteAsync("Some Error !");
else
await next.Invoke();
,
;
app.UseOcelot(configuration).Wait();
更新
配置服务
public void ConfigureServices(IServiceCollection services)
string AuthenticationKey = "AuthenticationKey";
services.AddLogging();
services.AddAuthentication(option =>
option.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
option.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
).AddJwtBearer(AuthenticationKey, option =>
option.RequireHttpsMetadata = true;
option.SaveToken = true;
option.TokenValidationParameters = new TokenValidationParameters
IssuerSigningKey =
new SymmetricSecurityKey(
Encoding.ASCII.GetBytes(Configuration.GetSection("SecretKey").Value)),
ValidateIssuerSigningKey = true,
ValidateIssuer = false,
ValidateAudience = false
;
//option.ForwardSignIn
);
services.AddHttpClient<IAuthorizationService, AuthorizationService>();
services.AddScoped<IJWTHelpers, JWTHelpers>();
services
.AddOcelot()
.AddDelegatingHandler<HeaderDelegatingHandler>();
services.AddMvc();
如您所见,在某些情况下,我需要立即返回类似 Unauthorized 的响应,但我的代码总是向 Postman 返回 500 Internal Server Error。 我搜索了很多,发现this问题。但我在 HTTPContext 中找不到 Errors.Add 方法。 是否有任何想法可以立即返回未经授权的响应?
【问题讨论】:
您能否分享一下您是如何在您的 startup.cs 上实施身份验证步骤的完整步骤,以便我们深入探讨。 我更新了问题。您还可以在 THIS 存储库中找到我的代码。 @Md Farid Uddin Kiron 请问您通常在哪种情况下遇到未授权错误? 如您所见await authorizationService.IsValid(ctx)
尝试验证我的上下文。在此方法中,我提取 Authorization 标头以访问用户声明和 HTTPContext.Request.Path 作为用户想要访问的资源。我们将这两个参数发送到我的授权服务。如果用户无权访问该资源,我应该返回 unauthorize error 。
***.com/a/69084487/2557855
【参考方案1】:
我通过@Artur 评论找到了正确答案。 我换了
ctx.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
await ctx.Response.WriteAsync("Some Error !");
在配置这个方法:
ctx.Items.SetError(new UnauthorizedError("your custom message"));
return;
【讨论】:
以上是关于如何在 Ocelot 和 .Net WebApi 中覆盖 AuthorizationMiddleware 时返回未经授权的响应的主要内容,如果未能解决你的问题,请参考以下文章
如何在 ocelot.json 路由 asp.net core 中发布 json body
如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?