通过Cloudflare和Azure获取用户的IP地址

时间:2018-09-05 17:20:22

标签: c# azure asp.net-core ip-address cloudflare

我在Azure中有一个网站,该网站通过Cloudflare进行路由以提供额外的保护。

Cloudflare添加了标头CF-Connecting-IP,该标头应该是客户端的IP地址,但是有时它提供了真实的IP地址,但是大多数时候我会获得保留的IP地址而不是客户端的IP。

我测试了它通过办公室互联网访问网站的情况,cloudflare返回了保留的IP地址,但是当我访问whatsmyip.org时,我得到了我的真实办公室IP地址。

如何确保始终获得客户端的IP地址,除非它们当然位于代理或VPN后面。

4 个答案:

答案 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

中会有什么

https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-

答案 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;
    }
}