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?的主要内容,如果未能解决你的问题,请参考以下文章

如何用javascript获取客户端的IP地址?

ASP.NET Core 中使用负责均衡时获取客户端 IP

如何在 ASP.NET CORE 中获取客户端 IP ?

asp.net core获取客户端ip

如何在 ASP.NET CORE 3.1 中获取客户端 IP 地址?

ASP.NET Core获取客户端IP地址