【问题标题】:asp.net core Parameter count mismatch between X-Forwarded-For and X-Forwarded-Protoasp.net core X-Forwarded-For 和 X-Forwarded-Proto 之间的参数计数不匹配
【发布时间】:2017-04-19 10:21:55
【问题描述】:
CloudFlare

IIS ARR 

Asp.net core 1.1.1

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

cloudflare 处于仅 http 模式

我不断地得到

X-Forwarded-For 和参数计数不匹配 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,但没有帮助

【问题讨论】:

  • 您在这方面得到任何帮助吗?

标签: asp.net iis url-rewriting arr kestrel-http-server


【解决方案1】:

我找到了一个解决方案,只需在您的 configureservices 上添加此代码

        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 之后使用,则在您的基本控制器或其他地方使用此代码获取真实 IP 地址

  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";
            }
        }
    }

【讨论】:

    猜你喜欢
    • 2014-06-14
    • 2013-10-22
    • 2022-06-12
    • 2015-04-09
    • 2017-09-27
    • 2015-11-18
    相关资源
    最近更新 更多