我在Azure中有一个网站,该网站通过Cloudflare进行路由以提供额外的保护。
Cloudflare添加了标头CF-Connecting-IP
,该标头应该是客户端的IP地址,但是有时它提供了真实的IP地址,但是大多数时候我会获得保留的IP地址而不是客户端的IP。
我测试了它通过办公室互联网访问网站的情况,cloudflare返回了保留的IP地址,但是当我访问whatsmyip.org时,我得到了我的真实办公室IP地址。
如何确保始终获得客户端的IP地址,除非它们当然位于代理或VPN后面。
答案 0 :(得分:3)
基于 masoud ch's 上面的回答,.NET Core 版本可能看起来像这样,使用 IHttpContextAccessor
而不是 HttpRequestBase
:
using Microsoft.AspNetCore.Http;
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[0];
}
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();
}
答案 1 :(得分:1)
他们提供了CF-Connect ing -IP,应该是正确的。
我不确定CF-Connect ion -IP
中会有什么答案 2 :(得分:0)
如果您阅读了特里·卡门(Terry Carmen)在唯一的其他答案中发布的链接(在撰写本文时),那么您会发现有2个标头可用于获取IP:
X-Forwarded-For和CF-Connecting-IP
我相信X-Forwarded-For是更好的选择。如果尚不存在,Cloudflare会将其设置为与CF-Connecting-IP相同的值,否则它们将一直保持其值直到您的服务器。
考虑这种情况:
User => SomeCloudProvider => Cloudflare => YourServer
在这种情况下,CF-Connecting-IP将为SomeCloudProvider,因为这就是与Cloudflare的连接。但是,如果SomeCloudProvider在X-Forwarded-For中添加了用户IP地址,那么Cloudflare将保留此地址并将其发送给您(在标题中),以便您可以获取用户的真实IP地址。
X-Forwarded-For是所有云提供商,路由器,交换机等(我已经看到)都将添加或维护的准标准。
答案 3 :(得分:0)
X-Forwarded-For是IP地址的列表,其中第一个是用户的IP地址。如果列表中存在它,我们必须抓住它,如果不是默认值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[0];
}
return request.UserHostAddress;
}
}