当前位置:   article > 正文

在 .NET Core 中获取客户端 IP 地址和位置信息_netcore 获取请求ip

netcore 获取请求ip

概述:本文将教我们如何在 ASP .NET Core Web 开发中检索客户端的 IP 地址和位置信息。从 HttpContext 检索客户端 IP在 ASP.NET Core 中,您可以轻松地从 Controller 中的 HttpContext 对象获取客户端 IP 地址,从而在 Web 请求期间轻松访问以下重要信息:public class MyIpController : ControllerBase {     [HttpGet]     public ActionResult Get()     {         var ipAddress = HttpContext.Con

本文将教我们如何在 ASP .NET Core Web 开发中检索客户端的 IP 地址和位置信息。

从 HttpContext 检索客户端 IP

在 ASP.NET Core 中,您可以轻松地从 Controller 中的 HttpContext 对象获取客户端 IP 地址,从而在 Web 请求期间轻松访问以下重要信息:

  1. public class MyIpController : ControllerBase
  2. {
  3. [HttpGet]
  4. public ActionResult Get()
  5. {
  6. var ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();
  7. // ...
  8. }
  9. }

当我们的应用程序直接暴露在互联网上时,这种方法非常有效,无需反向代理的中间层即可运行。

检索反向代理背后的真实客户端 IP

但是,大多数 Web 应用程序在其体系结构中使用中间层(如反向代理或负载均衡器)是很常见的。

直接检索方法可能会生成代理 IP,而不是客户端的 IP。

要获取实际客户端的 IP 地址,我们可以从_“X-Forwarded-For”_标头值中提取它。

为此,我们必须首先在_Program.cs_中配置 ForwardHeaderOptions

  1. // forward headers configuration for reverse proxy
  2. builder.Services.Configure\<ForwardedHeadersOptions>(options => {
  3. options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
  4. options.KnownNetworks.Clear();
  5. options.KnownProxies.Clear();
  6. });

然后,在控制器中,我们可以检索实际的客户端 IP 地址:

  1. public class MyIpController : ControllerBase
  2. {
  3. [HttpGet]
  4. public ActionResult Get()
  5. {
  6. var ipAddress = HttpContext.GetServerVariable("HTTP_X_FORWARDED_FOR");
  7. // ...
  8. }
  9. }

检索 Cloudflare 背后的真实客户端 IP

如果我们使用 Cloudflare,我们可以从_“CF-CONNECTING-IP”_标头访问真正的客户端 IP:

  1. public class MyIpController : ControllerBase
  2. {
  3. [HttpGet]
  4. public ActionResult Get()
  5. {
  6. var ipAddress = Request.Headers["CF-CONNECTING-IP"];
  7. // ...
  8. }
  9. }

获取客户端的 IP 位置信息

为了根据客户的IP地址获取位置信息,我们将利用 ip-api.com 提供的服务。

首先,我们创建 IpApiClient 类:

  1. public class IpApiClient(HttpClient httpClient)
  2. {
  3. private const string BASE_URL = "http://ip-api.com";
  4. private readonly HttpClient _httpClient = httpClient;
  5. public async Task<IpApiResponse?> Get(string? ipAddress, CancellationToken ct)
  6. {
  7. var route = $"{BASE_URL}/json/{ipAddress}";
  8. var response = await _httpClient.GetFromJsonAsync<IpApiResponse>(route, ct);
  9. return response;
  10. }
  11. }

IpApiResponse 类:

  1. public sealed class IpApiResponse
  2. {
  3. public string? status { get; set; }
  4. public string? continent { get; set; }
  5. public string? country { get; set; }
  6. public string? regionName { get; set; }
  7. public string? city { get; set; }
  8. public string? district { get; set; }
  9. public string? zip { get; set; }
  10. public double? lat { get; set; }
  11. public double? lon { get; set; }
  12. public string? isp { get; set; }
  13. public string? query { get; set; }
  14. }

我们需要在服务容器中添加并注册 IpApiClient 的 HttpClient,这可以在 Program.cs 文件中完成:

builder.Services.AddHttpClient<IpApiClient>();

现在我们可以检索客户端的 IP 位置信息:

  1. [HttpGet]
  2. public async Task<ActionResult> Get(CancellationToken ct)
  3. {
  4. try
  5. {
  6. var ipAddress = HttpContext.GetServerVariable("HTTP_X_FORWARDED_FOR") ?? HttpContext.Connection.RemoteIpAddress?.ToString();
  7. var ipAddressWithoutPort = ipAddress?.Split(':')[0];
  8. var ipApiResponse = await _ipApiClient.Get(ipAddressWithoutPort, ct);
  9. var response = new
  10. {
  11. IpAddress = ipAddressWithoutPort,
  12. Country = ipApiResponse?.country,
  13. Region = ipApiResponse?.regionName,
  14. City = ipApiResponse?.city,
  15. District = ipApiResponse?.district,
  16. PostCode = ipApiResponse?.zip,
  17. Longitude = ipApiResponse?.lon.GetValueOrDefault(),
  18. Latitude = ipApiResponse?.lat.GetValueOrDefault(),
  19. };
  20. return Ok(response);
  21. }
  22. catch (Exception ex)
  23. {
  24. return StatusCode(StatusCodes.Status500InternalServerError, ex.Message);
  25. }
  26. }

有时,客户端 IP 包含端口号。
我们可以使用以下代码删除端口号:
var ipAddressWithoutPort = ipAddress?.Split(':')[0];

我创建了一个简单的应用程序来展示本文中讨论的概念:

图片

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/985436
推荐阅读
相关标签
  

闽ICP备14008679号