如何在 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- .Net Core开源网关

.Net Core with 微服务

如何在 ocelot.json 路由 asp.net core 中发布 json body

Ocelot学习笔记

如何使用 Ocelot 在 .Net Core API 网关中实现 Windows 身份验证,以便所有下游服务都可以访问 IWindowsPrincipal?

基于Ocelot的gRpcHttp网关