Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取用户';s通过Cloudflare和Azure的IP地址_C#_Azure_Asp.net Core_Ip Address_Cloudflare - Fatal编程技术网

C# 获取用户';s通过Cloudflare和Azure的IP地址

C# 获取用户';s通过Cloudflare和Azure的IP地址,c#,azure,asp.net-core,ip-address,cloudflare,C#,Azure,Asp.net Core,Ip Address,Cloudflare,我在Azure中有一个网站,该网站通过Cloudflare路由以提供额外的保护 Cloudflare添加了一个头CF Connecting IP,该头应该是客户端的IP地址,但有时这会给出一个真实的IP地址,但大多数时候我会得到保留的IP地址,而不是客户端的IP地址 我通过我的office internet在网站上测试了它,cloudflare返回了一个保留的IP地址,但是当我转到whatsmyip.org时,我得到了我真正的office IP地址 public static class Req

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

Cloudflare添加了一个头
CF Connecting IP
,该头应该是客户端的IP地址,但有时这会给出一个真实的IP地址,但大多数时候我会得到保留的IP地址,而不是客户端的IP地址

我通过我的office internet在网站上测试了它,cloudflare返回了一个保留的IP地址,但是当我转到whatsmyip.org时,我得到了我真正的office 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;
    }
}

我如何确保始终获得客户的IP地址,当然,除非他们在代理或VPN后面。

他们提供CF Connecting-IP,这应该是正确的

我不确定CF Connection-IP中会有什么


如果您阅读Terry Carmen在唯一其他答案中发布的链接(在撰写本文时),您将看到有两个标题可用于获取IP:

X-Forwarded-For和CF连接IP

我相信X-Forwarded-For是更好的选择。Cloudflare会将其设置为与CF连接IP相同的值(如果尚未设置),否则他们会将其值保留到您的服务器

考虑以下情况:

用户=>SomeCloudProvider=>Cloudflare=>YourServer

在这个场景中,CF连接IP将是某种CloudProvider,因为这就是连接到Cloudflare的内容。但是,如果SomeCloudProvider在X-Forwarded-For中添加了用户IP地址,那么Cloudflare将保留该地址并将其发送给您(在标题中),以便您可以获得用户的真实IP地址


X-Forwarded-For是一个准标准,所有云提供商、路由器、交换机等(我见过)都将添加或维护。

X-Forwarded-For是一个IP地址列表,其中第一个很可能是用户的IP地址。我们必须抓取它,如果它在列表中,如果不是默认的UserHostAddress。另外,Cloudflare为名为CF Connecting IP的客户端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;
    }
}
根据上面masoud ch的回答,.NET核心版本可以使用
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();
 }

客户端访问您的网站时,请求头中的IP地址部分不是在关闭吗。。?你能提供你用来获取IP地址的代码吗..现在我只得到cf connecting IP index的头,它给了我IP地址,如果没有设置,那么我返回null,问题是它总是返回一些东西,即使它是那些保留的ip地址,但你觉得它不会过滤掉一半的访问者吗?他们似乎有很好的社区和论坛,试着在那里提问..这里有几个保留的ip地址Cloudflare正在返回241.7.216.18、248.245.44.54、240.31.14.8 241.43.18.136。这些显然是错误的。我在cloudflare上读到,我们可以在服务器设置中添加一些条目,但我无法在Azure应用程序服务工厂上托管我的应用程序。241网络是保留的,但不像本地网络地址(10192、172等)那样无效。它用于多播。是的,我知道这些ip是有效的,问题是cloudflare没有给我真正的ip,即使我可以通过MyIP.comCF说他们在该报头中传递ip进行验证。如果不正确,除了联系Cloudflare之外,您别无选择。他们可能在你和他们之间看到其他下游路由器或设备。仅仅因为whatsmyip得到了你真正的IP并不意味着CF总是得到它。