asp.net core如何獲取使用者端IP地址

2023-07-04 18:00:33

使用者端直接存取伺服器

直接通過HttpContext.Connection.RemoteIpAddress獲取使用者端Ip

[HttpGet]
[Route("GetClientIP")]
public async Task<IActionResult> GetClientIP()
{
	var ip4 = HttpContext.Connection.RemoteIpAddress.MapToIPv4();
	return Ok(ip4.ToString());
}

使用者端通過nginx存取伺服器

直接通過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 中介軟體

Microsoft.AspNetCore.HttpOverrides 中介軟體主要用於處理反向代理伺服器和負載均衡器等情況下的 HTTP 請求。以下是一些使用場景:

  1. 反向代理伺服器:當你的應用程式位於反向代理伺服器(如 Nginx、Apache 或 IIS)之後時,反向代理伺服器會接收使用者端請求,並將請求轉發給應用程式。在這種情況下,反向代理伺服器可能會修改請求頭部,包括使用者端 IP 地址和協定資訊。通過啟用 HttpOverrides 中介軟體並設定適當的選項,你可以獲得使用者端的真實 IP 地址和協定資訊。

  2. 負載均衡器:如果你的應用程式在負載均衡器的後面執行,負載均衡器可能會傳遞使用者端請求給多個範例。為了獲取準確的使用者端 IP 地址,你可以使用 HttpOverrides 中介軟體來識別 X-Forwarded-For 頭部欄位,並更新 HttpContext.Connection.RemoteIpAddress 屬性。

  3. 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 地址和使用的協定資訊。

查詢IP地址定位庫(ip2region)

ip2region v2.0 - 是一個離線IP地址定位庫和IP定位資料管理框架,10微秒級別的查詢效率,提供了眾多主流程式語言的 xdb 資料生成和查詢使用者端實現。

推薦使用IP2Region.Net

  1. 安裝 Nuget 包 IP2Region.Net。
Install-Package IP2Region.Net
  1. 使用demo

查詢IP返回的資料格式

每個 ip 資料段的 region 資訊都固定了格式:國家|區域|省份|城市|ISP,只有中國的資料絕大部分精確到了城市,其他國家部分資料只能定位到國家,後前的選項全部是0。

參考

https://github.com/lionsoul2014/ip2region