【问题标题】:Issue with getting Real Client IP Address when load balancer is in place负载均衡器就位时获取真实客户端 IP 地址的问题
【发布时间】:2021-03-24 00:55:01
【问题描述】:

我无法使用 X-Forwarded-For 标头获取真实的客户端 IP 地址。我的应用程序基于 Dot net core 1.1 而不是最新的 3.0。我们设置了负载均衡器来分配负载。

我已经实现了下面 MSDN 文章中提到的代码。

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-3.0&viewFallbackFrom=aspnetcore-1.1#forwarded-headers-middleware-options 

这是用于实现的文章

示例代码

1) 使用转发选项配置服务

  public void ConfigureServices(IServiceCollection services)
        {
            // Add framework services.
            services.AddApplicationInsightsTelemetry(Configuration);
            services.Configure<AppSettings>(Configuration);
            services.AddMvc();
            services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders =
                    ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
                options.ForwardLimit = 2;
                options.KnownProxies.Add(System.Net.IPAddress.Parse("123.111.11.88"));
                //options.KnownProxies.Clear();
                //options.KnownNetworks.Clear();
            });
        }

这里的 123.111.11.88 是示例负载均衡器 IP 地址。

2) 配置方法更改如下:

  public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
           --------
            app.UseForwardedHeaders();
           -------
      }

3) 读取标题的代码如下:

 string realClientIP = GetHeaderValueAs<string>("X-Cluster-Client-Ip");

 public T GetHeaderValueAs<T>(string headerName)
        {
            StringValues values;

            Request.Headers.TryGetValue(headerName, out values);
            if (!StringValues.IsNullOrEmpty(values))
            {
                var rawValues = values.ToString();

                if (!string.IsNullOrEmpty(rawValues))
                    return (T)Convert.ChangeType(values.ToString(), typeof(T));
            }

            return default(T);
        }

查询:

1) 是使用 dot net core 1.1 获取真实客户端 IP 的正确方法,因为我可以看到 MSDN 文章是针对 dot net core 3.0 的,并且没有针对 core 1.0 的参考文章。

2) 是否有可能使用自定义标头获得结果以及如果可能的话如何完成?

3) 如果有其他方法,请告诉我?

【问题讨论】:

    标签: asp.net-mvc .net-core


    【解决方案1】:

    第 1 步。将您的代码更改为

     services.Configure<ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders =
                    ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
      
                  options.KnownProxies.Clear();
                 options.KnownNetworks.Clear();
            });
    

    第 2 步。添加 ContextAccessor

     services.AddHttpContextAccessor();
            services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();
    

    第 3 步。使用 IActionContextAccessor 获取 IP 如下方法

    public static string GetClientIp(this IActionContextAccessor contextAccessor)
        {
            var remoteIp = contextAccessor.ActionContext.HttpContext.Connection.RemoteIpAddress;
    
            if (remoteIp.IsIPv4MappedToIPv6)
            {
                remoteIp = remoteIp.MapToIPv4();
            }
    
            return remoteIp.ToString();
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-24
      • 1970-01-01
      • 2019-06-21
      • 1970-01-01
      • 2022-10-14
      • 2022-01-18
      • 2021-01-23
      • 1970-01-01
      相关资源
      最近更新 更多