直接通過HttpContext.Connection.RemoteIpAddress獲取使用者端Ip
[HttpGet]
[Route("GetClientIP")]
public async Task<IActionResult> GetClientIP()
{
var ip4 = HttpContext.Connection.RemoteIpAddress.MapToIPv4();
return Ok(ip4.ToString());
}
直接通過HttpContext.Connection.RemoteIpAddress獲取使用者端Ip,就會是nginx的ip,需要通過Headers["X-Forwarded-For"]判斷
[HttpGet]
[Route("GetClientIP")]
public async Task<IActionResult> GetClientIP()
{
var ip4 = this.Request.Headers["X-Forwarded-For"].FirstOrDefault();
if(string.IsNullOrEmpty(ip4))
{
this.Request.Headers["X-Forwarded-Proto"].FirstOrDefault();
}
if(string.IsNullOrEmpty(ip4))
{
ip4 = HttpContext.Connection.RemoteIpAddress.MapToIPv4();
}
return Ok(ip4.ToString());
}
nginx的設定
/etc/nginx/conf.d/xx.conf
server {
listen 80;
server_name example.com *.example.com;
location / {
proxy_pass http://localhost:5000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection keep-alive;
proxy_set_header Host $http_host; #此處官方檔案使用的$host缺少埠號
proxy_cache_bypass $http_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
Microsoft.AspNetCore.HttpOverrides 中介軟體主要用於處理反向代理伺服器和負載均衡器等情況下的 HTTP 請求。以下是一些使用場景:
反向代理伺服器:當你的應用程式位於反向代理伺服器(如 Nginx、Apache 或 IIS)之後時,反向代理伺服器會接收使用者端請求,並將請求轉發給應用程式。在這種情況下,反向代理伺服器可能會修改請求頭部,包括使用者端 IP 地址和協定資訊。通過啟用 HttpOverrides 中介軟體並設定適當的選項,你可以獲得使用者端的真實 IP 地址和協定資訊。
負載均衡器:如果你的應用程式在負載均衡器的後面執行,負載均衡器可能會傳遞使用者端請求給多個範例。為了獲取準確的使用者端 IP 地址,你可以使用 HttpOverrides 中介軟體來識別 X-Forwarded-For 頭部欄位,並更新 HttpContext.Connection.RemoteIpAddress 屬性。
SSL/TLS 終止器:當 SSL/TLS 終止器(如負載均衡器或反向代理伺服器)接收到加密的 HTTPS 請求並解密後,它會將請求轉發給應用程式時,應用程式可能無法正確獲取請求的協定資訊。通過設定 HttpOverrides 中介軟體,你可以更新 HttpContext.Request.Protocol 屬性,以便應用程式知道請求是通過 HTTPS 還是 HTTP 傳送的。
以下是使用 Microsoft.AspNetCore.HttpOverrides 中介軟體的範例程式碼:
首先,確保在啟動類的 ConfigureServices 方法中新增以下程式碼以啟用 HttpOverrides 服務:
using Microsoft.AspNetCore.HttpOverrides;
public void ConfigureServices(IServiceCollection services)
{
// 其他設定項...
services.Configure<ForwardedHeadersOptions>(options =>
{
// 設定要處理的轉發頭部
options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
// 設定受信任的代理伺服器 IP 地址或 IP 範圍
options.KnownProxies.Add(IPAddress.Parse("127.0.0.1"));
// 設定是否要使用逗號分隔的多個 IP 地址作為使用者端 IP 地址
options.ForwardedForHeaderName = "X-Forwarded-For";
// 設定代理伺服器傳送的原始協定頭部欄位
options.ForwardedProtoHeaderName = "X-Forwarded-Proto";
});
// 其他服務設定...
}
接下來,在 Configure 方法中將 HttpOverrides 中介軟體新增到請求處理管道中:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// 其他中介軟體設定...
app.UseForwardedHeaders();
// 其他中介軟體設定...
}
設定完成後,HttpOverrides 中介軟體將根據設定處理傳入的轉發頭部,並更新 HttpContext.Connection.RemoteIpAddress 和 HttpContext.Request.Protocol 屬性。這樣,你就可以通過 HttpContext 獲取使用者端的真實 IP 地址和使用的協定資訊。
ip2region v2.0 - 是一個離線IP地址定位庫和IP定位資料管理框架,10微秒級別的查詢效率,提供了眾多主流程式語言的 xdb 資料生成和查詢使用者端實現。
Install-Package IP2Region.Net
每個 ip 資料段的 region 資訊都固定了格式:國家|區域|省份|城市|ISP,只有中國的資料絕大部分精確到了城市,其他國家部分資料只能定位到國家,後前的選項全部是0。
https://github.com/lionsoul2014/ip2region