我正在使用Microsoft Visual Studio 2017提供的Angular模板开发ASP.Net Core 2.1。我的客户端应用程序运行正常。经过用户身份验证的竞争之后,我想启动用户会话管理,在其中存储客户端用户IP地址。我已经在互联网上搜索了此文件,但到目前为止找不到任何解决方案。
下面是我已经访问过的一些参考链接:
How do I get client IP address in ASP.NET CORE?
Get Client IP Address in ASP.NET Core 2.0
Get a user remote IP Address in ASP.Net Core
在我的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引发了类型为'System.Net.Sockets.SocketException'的异常
能否让我知道如何在ASP.NET Core 2.1中获取客户端IP地址。
答案 0 :(得分:7)
在您的Startup.cs
中,确保您有一种方法ConfigureServices,传入IServiceCollection
,然后将IHttpContextAccessor
注册为单例,如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}
在IHttpContextAccessor
文件中注册Startup.cs
后,可以将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" };
}
答案 1 :(得分:2)
可以使用以下代码:
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"];
答案 2 :(得分:1)
如果我使用绑定地址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代理以发送X-Forwarded-For标头地址,其中包含客户端的真实IP地址(如果未设置或处理X-Forwarded-For标头,那么您将始终获得Null或反向代理服务器的IP地址。
上面的GetHostEntry与HTTP请求没有直接关系。 GetHostEntry只是一个用于API编程的NSLookup工具,它仅告诉您特定名称可访问的IP地址,而没有告诉您请求来自哪个IP地址。
希望有帮助
答案 3 :(得分:0)
花了一些时间进行搜索之后,我找到了自己的问题答案。在这里,我还共享了源链接,从那里我可以得到有关如何查询服务器以获取其支持的家庭地址和IP地址的答案和详细说明。
代码:
IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName());
var ip = heserver.AddressList[2].ToString();
这是我的另一个Question: How to access server variables in ASP.Net Core 2.x,希望这对大家有帮助。
答案 4 :(得分:0)
如果您的Kestrel位于IIS之类的反向代理之后,请确保转发包含客户端IP的标头。
这将启动:
app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});
答案 5 :(得分:0)
尝试此代码,
var ipAddress = HttpContext.Connection.RemoteIpAddress;
并且如果您在同一局域网中有另一台计算机,请尝试与此计算机连接,但使用用户ip而不是本地主机。否则,您将始终得到 :: 1 结果。
答案 6 :(得分:-2)
这在.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();