繁体   English   中英

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

[英]Getting user's IP address through Cloudflare and Azure

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

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

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

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

根据上面masoud ch 的回答,使用IHttpContextAccessor而不是HttpRequestBase的 .NET Core 版本可能如下所示:

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();
        }
    }
}

要在控制器中使用扩展,请执行以下操作:

家庭控制器.cs

 private readonly IHttpContextAccessor _accessor; 

 public HomeController(IHttpContextAccessor httpContextAccessor)
 {
     _accessor = httpContextAccessor; // Dependency Injection:
 }

 public IActionResult Index()
 {
     var IP = _accessor.GetIpAddress());
     return View();
 }

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

他们提供 CF-Connect ing -IP,这应该是正确的。

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

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

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

X-Forwarded-For 和 CF-Connecting-IP

我相信 X-Forwarded-For 是更好用的。 如果 CF-Connecting-IP 尚不存在,Cloudflare 会将其设置为与 CF-Connecting-IP 相同的值,否则它们会将其值保留到您的服务器。

考虑这个场景:

用户 => SomeCloudProvider => Cloudflare => YourServer

在这种情况下,CF-Connecting-IP 将是 SomeCloudProvider,因为这是连接到 Cloudflare 的内容。 但是,如果 SomeCloudProvider 在 X-Forwarded-For 中添加了用户 IP 地址,那么 Cloudflare 将保留它并将其发送给您(在标头中),以便您可以获得用户的真实 IP 地址。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM