CloudFlare
IIS ARR
Asp.net core 1.1.1
I'm behind cloudflare and then behind iis arr.
cloudflare is in http only mode
I'm constantly getting
Parameter count mismatch between X-Forwarded-For and X-Forwarded-Proto.
my startup file
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);
and i have set this rewrite rule at iis arr level i also have tested https
HTTP_X_FORWARDED_PROTO
http
replace the existing value
what's the problem?
here is a link but no help
I found a solution just add this code on you 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"));
});
and the on your basecontroller or somewhere else use this code for getting real ip address if you are behind cloudflare and 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";
}
}
}