为什么NGINX对分段文件上传请求的身份验证会收到立即关闭的连接?



NGINX在8080上为我们的网关提供服务,通过8100的AAA服务器进行身份验证,然后将经过身份验证的请求传递给8081上的NGINX进行路由。 一切开箱即用,除了针对我们的文件服务器的文件上传请求(任何大小(除外。 发送到 8080 的网关,当与 8100 的 AAA 的连接被强制关闭时,会发生 500 内部服务器错误。 发送到8081,NGINX路由多部分文件上传内容就可以了。

改变client_max_body_size无济于事;改变保活值也无济于事。 在NGINX中为多部分执行身份验证验证步骤的技巧是什么?


server {
    listen 8080;
    listen [::]:8080;
    server_name _;
    access_log /var/log/nginx/api.auth.log;
    location = /authverify {
        internal;
        proxy_pass http://127.0.0.1:8081/api/v1/aaa/authentication/validate;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Original-URI $request_uri;
    }
    location /api/v1/aaa/authentication {
    proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
    location /api {
        auth_request /authverify;
        auth_request_set $auth_header $upstream_http_authorization;
        more_set_headers "Authorization: $auth_header";
        proxy_pass http://127.0.0.1:8081;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

任何帮助非常感谢! (我们运行的是nginx 1.6.2,没有安装额外的模块。

更新:似乎WEB API对请求标头在内容被禁止时仍然指示"多部分"感到不满。 我已经调查过在身份验证请求中抑制内容类型,但没有找到实现它的令人满意的方法......

2019-11-22 05:20:41.896 +00:00 [错误] 服务器遇到 内部错误,无法处理您的请求。再试一次。 System.IO.IOException:流的意外结束,内容可能有 已被另一个组件读取。 在 Microsoft.AspNetCore.WebUtilities.MultipartReaderStream.ReadAsync(Byte[] 缓冲区, Int32 偏移量, Int32 计数, 取消令牌 取消令牌( 在 Microsoft.AspNetCore.WebUtilities.StreamHelperExtensions.DrainAsync(Stream 流, 阵列池 1 bytePool, Nullable 1 限制, 取消令牌 取消令牌( 在 Microsoft.AspNetCore.WebUtilities.MultipartReader.ReadNextSectionAsync(CancelToken 取消令牌( 在 Microsoft.AspNetCore.Http.Features.FormFeature.InnerReadFormAsync(CancelToken 取消令牌( 在 Microsoft.AspNetCore.Mvc.ModelBinding.FormValueProviderFactory.AddValueProviderAsync(ValueProviderFactoryContext 上下文(在 Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.CreateAsync(ActionContext actionContext, IList'1 factory( at Microsoft.AspNetCore.Mvc.ModelBinding.CompositeValueProvider.CreateAsync(ControllerContext controllerContext( at Microsoft.AspNetCore.Mvc.Internal.ControllerBinderDelegateProvider.<>c__DisplayClass0_0.<g__Bind|0>d.MoveNext((

就我而言,重新设置Content-Type解决了这个问题:

    location = /authverify {
        internal;
        proxy_pass http://127.0.0.1:8081/api/v1/aaa/authentication/validate;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header Content-Type "";
        proxy_set_header X-Original-URI $request_uri;
    }

但这可能取决于您的 API 如何处理请求。

相关内容

  • 没有找到相关文章

最新更新