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

Gen*_*ric 5 c# ip-address azure cloudflare asp.net-core

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

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

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

我怎样才能确保始终获得客户端的 IP 地址,除非它们位于代理或 VPN 之后。

Sha*_*Sha 5

根据Masoud ch 的回答,.NET Core 版本可能看起来像这样,IHttpContextAccessor而不是使用HttpRequestBase

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

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

HomeController.cs

 private readonly IHttpContextAccessor _accessor; 

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

 public IActionResult Index()
 {
     var IP = _accessor.GetIpAddress());
     return View();
 }
Run Code Online (Sandbox Code Playgroud)


Ter*_*men 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-