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

fdbelqdn  于 2023-03-03  发布在  其他
关注(0)|答案(5)|浏览(322)

我有一个在Azure的网站,该网站是通过Cloudflare路由额外的保护。
Cloudflare添加了一个标头CF-Connecting-IP,它应该是客户端的IP地址,然而有时这会给出一真实的IP地址,但大多数时候我得到的是保留的IP地址,而不是客户端的IP。
我测试了它通过我的办公室互联网进入网站,CloudFlare返回了一个保留的IP地址,但是当我进入www.example.com时whatsmyip.org,我得到了我真实的的办公室IP地址。
我怎么能确保总是获得客户端的IP地址,当然除非他们背后的代理或VPN.

g9icjywg

g9icjywg1#

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

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

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

主控制器.cs

private readonly IHttpContextAccessor _accessor; 

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

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

kxeu7u2r2#

X-Forwarded-For是一个IP地址列表,其中最后一个最有可能是用户的IP地址。
https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-
示例:
X-转发-用于: www.example.com、www.example.com、www.example.com 198.51.100.101 , 198.51.100.102 , 203.0.113.1
在上面的示例中,www.example.com是原始访问者IP地址,www.example.com和www.example.com是通过X-Forwarded-For报头提供给Cloudflare的代理服务器IP地址 203.0.113.1 is the original visitor IP address and 198.51.100.101 and 198.51.100.102 are proxy server IP addresses provided to Cloudflare via the X-Forwarded-For header
我们必须抓住它,如果它存在于列表中,如果不默认为UserHostAddress。作为一个奖金,Cloudflare定义了自己的头为客户端IP地址称为CF连接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;
    }
}
6yjfywim

6yjfywim3#

他们提供CF-Connecting-IP,这应该是正确的。
我不确定CF-Connection-IP中包含哪些内容
https://support.cloudflare.com/hc/en-us/articles/200170986-How-does-Cloudflare-handle-HTTP-Request-headers-

5q4ezhmt

5q4ezhmt4#

如果您阅读了Terry Carmen在唯一的其他答案中发布的链接(在撰写本文时),那么您将看到有2个标题,您可以使用它们来获取IP:
X-转发-用于和CF-连接-IP
我相信X-Forwarded-For是一个更好的选择。如果CF-Connecting-IP不存在,Cloudflare会将其设置为与CF-Connecting-IP相同的值,否则他们会将其值一直保持到服务器。
请考虑以下场景:
用户=〉某个云提供商=〉云耀斑=〉您的服务器
在这种情况下,CF-Connecting-IP将是SomeCloudProvider,因为这是连接到Cloudflare的。但如果SomeCloudProvider在X-Forwarded-For中添加了用户的IP地址,那么Cloudflare将保留此地址并将其发送给您(在报头中),以便您可以获得用户的真实IP地址。
X-Forwarded-For是一个准标准,所有云提供商、路由器、交换机等(我见过)都会添加或维护。

ctzwtxfj

ctzwtxfj5#

使用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;

相关问题