Cloudflare添加了一个头文件CF-Connecting-IP,该文件应该是客户端的IP地址,但是大多数情况下,我得到的是保留的IP地址,而不是客户端的IP地址。
我通过我的办公室互联网测试访问该网站时,Cloudflare返回了一个保留的IP地址,但是当我去了whatsmyip.org后,我得到了真正的办公室IP地址。
除非他们在代理或VPN后面,否则如何确保始终获取客户端的IP地址?
基于上面 masoud ch 的回答,.NET Core 版本可以使用 IHttpContextAccessor
替代 HttpRequestBase
实现如下:
using Microsoft.AspNetCore.Http;
using System.Linq;
namespace myproject.Extensions
{
public static class HttpContextAccessorExtensions
{
public static string GetIpAddress(this IHttpContextAccessor accessor)
{
if (!string.IsNullOrEmpty(accessor.HttpContext.Request.Headers["CF-CONNECTING-IP"]))
return accessor.HttpContext.Request.Headers["CF-CONNECTING-IP"];
var ipAddress = accessor.HttpContext.GetServerVariable("HTTP_X_FORWARDED_FOR");
if (!string.IsNullOrEmpty(ipAddress))
{
var addresses = ipAddress.Split(',');
if (addresses.Length != 0)
return addresses.Last();
}
return accessor.HttpContext.Connection.RemoteIpAddress.ToString();
}
}
}
要在控制器中使用扩展功能,请按照以下步骤操作:
HomeController.cs
private readonly IHttpContextAccessor _accessor;
public HomeController(IHttpContextAccessor httpContextAccessor)
{
_accessor = httpContextAccessor; // Dependency Injection:
}
public IActionResult Index()
{
var IP = _accessor.GetIpAddress());
return View();
}
REMOTE_PORT
可以在你的服务器上获取。 - undefinedX-Forwarded-For是一串IP地址列表,其中最后一个通常是用户的IP地址。
例如:
X-Forwarded-For: 198.51.100.101,198.51.100.102,203.0.113.1
在上面的示例中,203.0.113.1是原始访问者IP地址,198.51.100.101和198.51.100.102是通过X-Forwarded-For标题提供给Cloudflare的代理服务器IP地址。
如果X-Forwarded-For在列表中存在,我们需要获取它;否则,默认使用UserHostAddress。作为额外奖励,Cloudflare为客户端IP地址定义了自己的头部CF-Connecting-IP。如果你使用Cloudflare,请查找它。如果使用其他云服务提供商,则需检查他们可能定义的特定标题。下面的示例应该能够给您一个很好的概念如何获取用户的IP地址。
public static class RequestExtensions
{
public static string GetIpAddress(this HttpRequestBase request)
{
if (request.Headers["CF-CONNECTING-IP"] != null)
return request.Headers["CF-CONNECTING-IP"];
var ipAddress = request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (!string.IsNullOrEmpty(ipAddress))
{
var addresses = ipAddress.Split(',');
if (addresses.Length != 0)
return addresses.Last();
}
return request.UserHostAddress;
}
}
使用ForwardedHeadersExtensions,Cloudflare和Azure也会发送X-Forwarded-For
头。顺便说一下,几乎所有的代理都会发送这个头。
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
如果没有 X-Forwarded-For
头部,你可以指定任何你想要的头部。
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedForHeaderName = "custom-x-forwarded-for",
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});
之后您可以按照常规方式解析IP地址。
var ip = context.Connection.RemoteIpAddress;