asp.net 怎么获取客户端真实 IP?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了asp.net 怎么获取客户端真实 IP?相关的知识,希望对你有一定的参考价值。
如题,c# ,求代码。要求:获取的不是局域网ip,而是本机在internet上的真实ip
asp.net中获取客户端ip地址的两种方法方法一:
/// <summary>
/// 获取用户登录IP
/// </summary>
/// <returns></returns>
string GetIp()
//可以透过代理服务器
string userIP = Request.ServerVariables["HTTP_X_FORWARDED_FOR"];
if (userIP == null || userIP == "")
//没有代理服务器,如果有代理服务器获取的是代理服务器的IP
userIP = Request.ServerVariables["REMOTE_ADDR"];
return userIP;
方法二:(很抱歉,这种方法获取的是服务器端的IP)
//需要using System.Net;
string hostname = Dns.GetHostName();//服务器的用户名
Response.Write("HostName:"+hostname);
IPAddress[] address = Dns.GetHostAddresses(hostname);//获取服务器端IP列表,第一IP是address[0]
IPEndPoint ipendpoint = new IPEndPoint(address[0], 1234);
Response.Write("address:"+ipendpoint.Address.ToString());//输出IP:192.168.0.210,不是127.0.0.1
Response.Write("port:" + ipendpoint.Port.ToString());//输出1234
Response.Write("endpoint:" + ipendpoint.ToString());//输出的是192.168.0.210:1234 参考技术A 方法:Request.UserHostAddress.ToString();
你可以使用192.168.1.xxx这样的IP地址来访问你的网站,这样就可以得到192.168.1.xxx这样的IP地址,公网也是如此
但是当你用localhost来访问你本地的网站,那么无论你用什么方法都会得到127.0.0.1这个结果,这是正常的。切记! 参考技术B 测试: protected void Page_Load(object sender, EventArgs e)
Response.Write(Request.ServerVariables["REMOTE_ADDR"]);
远程服务端部署以后,你用一个客户端访问这个服务器,然后查看结果
ASP.NET Core 3.1 - 如何获取客户端的 IP 地址?
【中文标题】ASP.NET Core 3.1 - 如何获取客户端的 IP 地址?【英文标题】:ASP.NET Core 3.1 - How do I get a client's IP Address? 【发布时间】:2020-05-16 09:44:32 【问题描述】:我有一个 Razor 页面 Web 应用程序并正在记录用户的 IP 地址。出于某种原因,它返回的是 IP 地址,而不是客户端的用户 IP 地址。我相信它可能会从服务器返回IP?
注意: 我已在所有其他 ASP.NET Web 窗体应用程序中添加了用户登录,并且它正在记录正确的 IP。这是我们唯一的 ASP.NET Core 应用程序,它返回一个不同的 IP。
我是否在 ConfigureServices 方法中遗漏了阻止它获取用户 IP 地址的内容?
我在启动类中的 ConfigureServices 方法中的代码:
public void ConfigureServices(IServiceCollection services)
services.Configure<ForwardedHeadersOptions>(options =>
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
);
services.AddRazorPages().AddRazorRuntimeCompilation();
services.AddAntiforgery(option =>
option.HeaderName = "XSRF-TOKEN";
option.SuppressXFrameOptionsHeader = false;
);
services.AddSession();
services.AddMemoryCache();
我也在 Configure 方法中调用 UserForwardedHeaders 方法:
app.UseForwardedHeaders();
我在检索 IP 地址时使用 RemoteIPAddress:
HttpContext.Connection.RemoteIpAddress.ToString()
【问题讨论】:
是什么让您相信它返回的服务器 IP 地址与您的预期相反? 因为当我们浏览网站时,它为我和我的其他队友记录的 IP 与我们本地机器的 IP 完全不同。例如,它为我们双方记录 10.01.01.12(不是真实 IP)。但是,它为不同的用户记录不同的 IP,但它们不是他们的本地计算机。我在所有 ASP.NET 网站上添加了日志记录,它记录了正确的 IP 地址。然而,这是我们在生产中唯一的 ASP.Core 应用程序,它是唯一一个记录不同 IP 的应用程序。 你在哪里使用代码获取IP地址?? @Hadi 我在 cshtml.cs 页面的 IActionResult OnGet() 方法中使用它 您之间没有其他代理设置,例如扫描/防病毒代理?如果您为每个用户获得不同的 ip,但它们不正确,那么我猜要么是浏览器和服务器之间存在某些问题,要么是某些东西正在插入/覆盖 X-Forwarded-For 标头。也许创建一个将标题转储到页面并查看到达的操作? 【参考方案1】:var ipAddr = HttpContext.Connection.RemoteIpAddress.ToString();
当您在本地执行代码时,这将返回 ::1
。部署到测试或生产服务器后,它将获取您客户端的 IP
var deviceName = Dns.GetHostEntry(HttpContext.Connection.RemoteIpAddress).HostName;
它用于查找 Intranet 应用程序的计算机名称。
【讨论】:
【参考方案2】:这就是我在 .NET Core 2.1 ASP.NET MVC 应用程序中所做的
public static string GetIpAddressFromHttpRequest(HttpRequest httpRequest)
string ipAddressString = string.Empty;
if (httpRequest == null)
return ipAddressString;
if (httpRequest.Headers != null && httpRequest.Headers.Count > 0)
if (httpRequest.Headers.ContainsKey("X-Forwarded-For") == true)
string headerXForwardedFor = httpRequest.Headers["X-Forwarded-For"];
if (string.IsNullOrEmpty(headerXForwardedFor) == false)
string xForwardedForIpAddress = headerXForwardedFor.Split(':')[0];
if (string.IsNullOrEmpty(xForwardedForIpAddress) == false)
ipAddressString = xForwardedForIpAddress;
else if (httpRequest.HttpContext == null ||
httpRequest.HttpContext.Connection == null ||
httpRequest.HttpContext.Connection.RemoteIpAddress == null)
ipAddressString = httpRequest.HttpContext.Connection.RemoteIpAddress.ToString();
return ipAddressString;
我的应用程序在 Google Chrome 中运行良好。我没有在其他浏览器中测试。
【讨论】:
以上是关于asp.net 怎么获取客户端真实 IP?的主要内容,如果未能解决你的问题,请参考以下文章