ASP.NET Core 3.1 - 如何获取客户端的 IP 地址?

Posted

技术标签:

【中文标题】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 Core 3.1 - 如何获取客户端的 IP 地址?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ASP.NET Core 3.1 中启用多重身份验证?

登录 ASP.NET Core 3.1 后如何获取用户信息

在 cookie 中存储 JWT 令牌后,如何在 ASP.NET Core 3.1 中破坏该 cookie 并获取信息

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

如何使用 C# 在 ASP.NET Core 3.1 MVC 中使用会话变量

ASP.NET Core 3.1 中的证书身份验证实现