如何在ASP.NET Core 2.1中获取客户端IP地址
我正在使用Microsoft Visual Studio 2017提供的Angular模板开发ASP.Net Core 2.1。我的客户端应用程序工作正常。 在用户身份validation的竞争之后,我想启动用户会话管理,其中我存储客户端用户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 Get() { var ip = Request.HttpContext.Connection.RemoteIpAddress.ToString(); return new string[] { ip, "value2" }; }
其中ip变量我得到空值并得到此错误
Request.HttpContext.Connection.RemoteIpAddress.Address引发了Type’System.Net.Sockets.SocketException’的exception
你能告诉我如何在ASP.NET Core 2.1中获取客户端IP地址吗?
如果我使用绑定地址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地址。
希望有所帮助
在您的Startup.cs
,确保您有一个ConfigureServices方法,传入IServiceCollection
,然后将IHttpContextAccessor
注册为单例,如下所示:
public void ConfigureServices(IServiceCollection services) { services.AddSingleton(); }
在Startup.cs
文件中注册IHttpContextAccessor
后,可以在控制器类中注入IHttpContextAccessor
并使用它,如下所示:
private IHttpContextAccessor _accessor; public ValuesController(IHttpContextAccessor accessor) { _accessor = accessor; } public IEnumerable Get() { var ip = _accessor.HttpContext?.Connection?.RemoteIpAddress?.ToString(); return new string[] { ip, "value2" }; }
如果您的Kestrel位于IIS之类的反向代理后面,请确保转发包含客户端IP的标头。
这进入了启动:
app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});
可以使用以下代码:
services.Configure(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"];
花了一些时间搜索后,我找到了自己的问题答案。 在这里,我也分享了源链接,从中我可以得到我的答案和详细解释,了解如何查询服务器以获取系列地址及其支持的IP地址。
码:
IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName()); var ip = heserver.AddressList[2].ToString();
资源
这是我的另一个问题:如何访问ASP.Net Core 2.x中的服务器变量希望这对您有帮助。