Проблема с получением реального IP-адреса клиента, когда балансировщик нагрузки установлен - PullRequest
1 голос
/ 24 октября 2019

Я не могу получить реальный IP-адрес клиента, используя заголовок X-Forwarded-For. Мое приложение построено на 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 isпример 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) это правильный способ получить реальный IP-адрес клиента с помощью dot net core 1.1, так как я мог видеть, что статья MSDN предназначена для dot net core 3.0, а справочной статьи для core 1.0 нет.

2) Можно ли получить результат с помощью пользовательских заголовков и как это можно сделать, если это возможно?

3) Пожалуйста, дайте мне знать, если есть какой-либо другой способ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...