如何在ASP.NET Core 2.1中获取客户端IP地址

问题描述 投票:15回答:7

我正在使用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引发了Type'System.Net.Sockets.SocketException'的异常

enter image description here

enter image description here

你能告诉我如何在ASP.NET Core 2.1中获取客户端IP地址吗?

c# asp.net-core
7个回答
7
投票

在你的Startup.cs中,确保你有一个方法来配置服务,传入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" };
}

4
投票

可以使用以下代码:

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"];

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代理服务器以发送包含客户端真实IP地址的X-Forwarded-For Header地址,如果您未设置或处理X- Forwarded-For Header,那么你总是得到Nulls或Reverse-Proxy Server的IP地址。

上面的GetHostEntry与HTTP请求没有直接关系。 GetHostEntry只是一个用于API编程的NSLookup工具,它只是告诉您特定名称可以访问的IP地址,但不会告诉您请求来自WebApi的IP地址。

希望有所帮助


0
投票

花了一些时间在搜索后我找到了自己的问题答案。在这里,我也分享源链接,从中我可以得到我的答案和详细解释,了解如何查询服务器以获取家庭地址及其支持的IP地址。

码:

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

enter image description here

Source

这是我的另一个Question: How to access server variables in ASP.Net Core 2.x希望这对你们所有人都有帮助。


0
投票

如果您的Kestrel位于IIS之类的反向代理后面,请确保转发包含客户端IP的标头。 这进入了启动:

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

0
投票

试试这段代码,

var ipAddress = HttpContext.Connection.RemoteIpAddress;

如果你在同一局域网中有另一台计算机,尝试连接这台电脑,但使用用户IP而不是localhost。否则你将获得:: 1结果。


-3
投票

这适用于.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();
© www.soinside.com 2019 - 2024. All rights reserved.