asp.net X-Forwarded-For 和 X-Forwarded-Proto 之间的核心参数计数不匹配

asp.net core Parameter count mismatch between X-Forwarded-For and X-Forwarded-Proto

CloudFlare

IIS ARR 

Asp.net core 1.1.1

我在cloudflare后面,然后在iis arr后面。

cloudflare 处于仅 http 模式

我不断收到

Parameter count mismatch between X-Forwarded-For and X-Forwarded-Proto.

我的启动文件

 ForwardedHeadersOptions forwardOption = new ForwardedHeadersOptions
        {
            ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto,
            ForwardLimit = 2
        };
        forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxx"));
        forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxx"));
        forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxxx"));
        forwardOption.KnownProxies.Add(IPAddress.Parse("xxxxxx"));
        app.UseForwardedHeaders(forwardOption);

并且我已经在 iis arr 级别设置了这个重写规则我也测试了 https

HTTP_X_FORWARDED_PROTO
http
replace the existing value

有什么问题?

这里有一个 link 但没有帮助

我找到了一个解决方案,只需将这段代码添加到您的配置服务中

        services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            options.RequireHeaderSymmetry = false;
            options.ForwardLimit = 2;
            options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
            options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));
            options.KnownProxies.Add(IPAddress.Parse("xxx.xxx.xxx.xxx"));

        });

如果你在 cloudflare 和 arr

  public string GetRealIpAddress()
    {
        StringValues connectionIp;
        var conncetionIpAvailable = Request.Headers.TryGetValue("Cf-Connecting-Ip", out connectionIp);
        if (conncetionIpAvailable)
        {
            return connectionIp.ToString().Trim();
        }
        else
        {
            var xForwardFor = Request.Headers.GetCommaSeparatedValues("X-Forwarded-For");
            string ipList = "";
            foreach (var x in xForwardFor)
            {
                ipList = ipList.Trim() + " , " + x.Trim();
            }

            if (!string.IsNullOrEmpty(ipList.Trim()))
            {
                return ipList.Trim();
            }
            else
            {
                return "xxx.xxx.xxx.xxx";
            }
        }
    }