[英]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 中会有什么
如果您阅读了 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.