簡體   English   中英

如何在ASP.NET Core 2.1中獲取客戶端IP地址

[英]How to get Client IP address in ASP.NET Core 2.1

我正在使用Microsoft Visual Studio 2017提供的Angular模板開發ASP.Net Core 2.1。我的客戶端應用程序工作正常。 在用戶認證競爭之后,我想啟動用戶會話管理,其中我存儲客戶端用戶IP地址。 我已經在互聯網上搜索過這個,但到目前為止還沒有找到任何解決方案。

以下是我訪問過的一些參考鏈接:

如何在ASP.NET CORE中獲取客戶端IP地址?

在ASP.NET Core 2.0中獲取客戶端IP地址

在ASP.Net Core中獲取用戶遠程IP地址

在我的ValuesController.cs中,我也試過下面的代碼:

private IHttpContextAccessor _accessor;

public ValuesController(IHttpContextAccessor accessor)
{
    _accessor = accessor;
}

public IEnumerable<string> Get()
{
    var ip = Request.HttpContext.Connection.RemoteIpAddress.ToString();
    return new string[] { ip, "value2" };
}

其中ip變量我得到空值並得到此錯誤

Request.HttpContext.Connection.RemoteIpAddress.Address引發了Type'System.Net.Sockets.SocketException'的異常

在此輸入圖像描述

在此輸入圖像描述

你能告訴我如何在ASP.NET Core 2.1中獲取客戶端IP地址嗎?

Startup.cs ,確保您有一個ConfigureServices方法,傳入IServiceCollection ,然后將IHttpContextAccessor注冊為單例,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

Startup.cs文件中注冊IHttpContextAccessor后,可以在控制器類中注入IHttpContextAccessor並使用它,如下所示:

private IHttpContextAccessor _accessor;

public ValuesController(IHttpContextAccessor accessor)
{
    _accessor = accessor;
}

public IEnumerable<string> Get()
{
    var ip = _accessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
    return new string[] { ip, "value2" };
}

可以使用以下代碼:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});

string remoteIpAddress = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
if (Request.Headers.ContainsKey("X-Forwarded-For"))
    remoteIpAddress = Request.Headers["X-Forwarded-For"];

如果我使用綁定地址Localhost:5000,則IP將返回為“:: 1”(Localhost IPv6地址)。 如果我將我的Webapi綁定在IP地址上並嘗試從另一台客戶端計算機訪問它,我會在API響應中獲取客戶端的IP地址。 我相信不需要HTTPAccessor。 根據文檔https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1,HttpContext.Connection.RemoteIpAddress由XForwardedFor設置頭。

如果您的應用程序(WEBAPI)位於NGINX / Apache反向代理服務器后面,則應啟用這些REV代理服務器以發送包含客戶端真實IP地址的X-Forwarded-For Header地址,如果您未設置或處理X- Forwarded-For Header,那么你總是得到Nulls或Reverse-Proxy Server的IP地址。

上面的GetHostEntry與HTTP請求沒有直接關系。 GetHostEntry只是一個用於API編程的NSLookup工具,它只是告訴您特定名稱可以訪問的IP地址,但不會告訴您請求來自WebApi的IP地址。

希望有所幫助

如果您的Kestrel位於IIS之類的反向代理后面,請確保轉發包含客戶端IP的標頭。
這進入了啟動:

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

花了一些時間在搜索后我找到了自己的問題答案。 在這里,我也分享源鏈接,從中我可以得到我的答案和詳細說明,了解如何查詢服務器以獲取家庭地址及其支持的IP地址。

碼:

IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName());
var ip = heserver.AddressList[2].ToString();

在此輸入圖像描述

資源

這是我的另一個問題:如何在ASP.Net Core 2.x中訪問服務器變量希望這對您有幫助。

試試這段代碼,

var ipAddress = HttpContext.Connection.RemoteIpAddress;

如果你在同一局域網中有另一台計算機,嘗試連接這台電腦,但使用用戶IP而不是localhost。 否則你將獲得:: 1結果。

這適用於.Net Core 2.2

IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName());

var ipAddress = heserver.AddressList.ToList().Where(p => p.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).FirstOrDefault().ToString();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM