Blame view

Yi.Abp.Net8/framework/Yi.Framework.AspNetCore/RealIpHttpContextWebClientInfoProvider.cs 1.79 KB
515fceeb   “wangming”   框架初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
  using System.Net;
  using Microsoft.AspNetCore.Http;
  using Microsoft.Extensions.Logging;
  using Volo.Abp.AspNetCore.WebClientInfo;
  
  namespace Yi.Framework.AspNetCore;
  
  /// <summary>
  /// 真实IP地址提供程序,支持代理服务器场景
  /// </summary>
  public class RealIpHttpContextWebClientInfoProvider : HttpContextWebClientInfoProvider
  {
      private const string XForwardedForHeader = "X-Forwarded-For";
  
      /// <summary>
      /// 初始化真实IP地址提供程序的新实例
      /// </summary>
      public RealIpHttpContextWebClientInfoProvider(
          ILogger<HttpContextWebClientInfoProvider> logger,
          IHttpContextAccessor httpContextAccessor) 
          : base(logger, httpContextAccessor)
      {
      }
  
      /// <summary>
      /// 获取客户端IP地址,优先从X-Forwarded-For头部获取
      /// </summary>
      /// <returns>客户端IP地址</returns>
      protected override string? GetClientIpAddress()
      {
          try
          {
              var httpContext = HttpContextAccessor.HttpContext;
              if (httpContext == null)
              {
                  return null;
              }
  
              var headers = httpContext.Request?.Headers;
              if (headers != null && headers.ContainsKey(XForwardedForHeader))
              {
                  // X-Forwarded-For获取真实客户端IP
                  var forwardedIp = headers[XForwardedForHeader].FirstOrDefault();
                  if (!string.IsNullOrEmpty(forwardedIp))
                  {
                      httpContext.Connection.RemoteIpAddress = IPAddress.Parse(forwardedIp);
                  }
              }
  
              return httpContext.Connection?.RemoteIpAddress?.ToString();
          }
          catch (Exception ex)
          {
              Logger.LogWarning(ex, "获取客户端IP地址时发生异常");
              return null;
          }
      }
  }