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

问题描述:

CloudFlare 

IIS ARR 

Asp.net core 1.1.1 

我背后是cloudflare,然后是iis arr。asp.net内核X-Forwarded-For和X-Forwarded-Proto之间的参数计数不匹配

CloudFlare的是HTTP only模式

我经常收到X - 转发,对于和 X转发 - 协议之间

参数数量不匹配。

我的启动文件

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 

enter image description here

什么问题?

这里是一个link,但没有任何帮助

+0

你有任何帮助吗? – Raskolnikoov

我发现你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")); 

     }); 

和您basecontroller或其他地方使用该代码得到真正的IP地址,如果一个解决方案只需添加以下代码你落后于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"; 
      } 
     } 
    }