EKsumic's Blog

let today = new Beginning();

Click the left button to use the catalog.

OR

ASP .NET Core 搭配IIS+Cloudflare的真实IP问题

基本环境:

  • .NET Core 2.1 Runtime
  • Windows Server 2016

 

步骤1:

在Startup.cs文件里面添加:

app.UseForwardedHeaders(new ForwardedHeadersOptions { 
  ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

步骤2:

在你的控制器里面添加:

string RealIP = _httpContextAccessor.HttpContext.Request.Headers["x-forwarded-for"];

 

关于

Request.Headers["HTTP_X_FORWARDED_FOR"]

的这一种写法是错误的。(至少在.NET Core 2.1里面这么写没有用)

 

TIPS:

X-Forwarded-For请求头格式非常简单,就这样:

X-Forwarded-For:client, proxy1, proxy2

可以看到,XFF 的内容由「英文逗号 + 空格」隔开的多个部分组成,最开始的是离服务端最远的设备 IP,然后是每一级代理设备的 IP。

如果一个 HTTP 请求到达服务器之前,经过了三个代理 Proxy1、Proxy2、Proxy3,IP 分别为 IP1、IP2、IP3,用户真实 IP 为 IP0,那么按照 XFF 标准,服务端最终会收到以下信息:

X-Forwarded-For: IP0, IP1, IP2

Proxy3 直连服务器,它会给 XFF 追加 IP2,表示它是在帮 Proxy2 转发请求。列表中并没有 IP3,IP3 可以在服务端通过

来自简书:https://www.jianshu.com/p/15f3498a7fad

关于

string RealIP = _httpContextAccessor.HttpContext.Request.Headers["x-forwarded-for"];

等价于:

string RealIP = _httpContextAccessor.HttpContext.Request.Headers["x-forwarded-for"][0];

返回值,一般情况下,是直接得到一个IP地址,这个IP地址应该是IP0。(即客户机实际IP)

 

 

参考文档:

[1]「Asp.Net Core获取HttpContext相关操作」

[2]「IIS利用X-Forwarded-For获得来访者的真实IP」

[3]「C#编程获取IP地址的方法示例」

This article was last edited at 2020-06-15 01:37:18

* *