首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >负载均衡器就位时获取真实客户端IP地址问题

负载均衡器就位时获取真实客户端IP地址问题
EN

Stack Overflow用户
提问于 2019-10-24 20:50:10
回答 1查看 312关注 0票数 1
代码语言:javascript
复制
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)使用转发选项配置服务

代码语言:javascript
复制
  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();
            });
        }

2)配置方法变更如下:

代码语言:javascript
复制
  public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        {
           --------
            app.UseForwardedHeaders();
           -------
      }

3)读取headers的代码如下:

代码语言:javascript
复制
 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)这是获得. net core 1.1真实客户端IP的正确方法吗?因为我可以看到MSDN文章是针对. net core 3.0的,而没有关于core 1.0的参考文章。

2)是否可以使用自定义头部获取结果?如果可能,如何获取结果?

3)有没有其他办法请告诉我?

EN

回答 1

Stack Overflow用户

发布于 2021-03-24 00:55:02

步骤1。将代码更改为

代码语言:javascript
复制
 services.Configure<ForwardedHeadersOptions>(options =>
        {
            options.ForwardedHeaders =
                ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
  
              options.KnownProxies.Clear();
             options.KnownNetworks.Clear();
        });

步骤2。添加ContextAccessor

代码语言:javascript
复制
 services.AddHttpContextAccessor();
        services.TryAddSingleton<IActionContextAccessor, ActionContextAccessor>();

步骤3。使用IActionContextAccessor获取IP,如下所示

代码语言:javascript
复制
public static string GetClientIp(this IActionContextAccessor contextAccessor)
    {
        var remoteIp = contextAccessor.ActionContext.HttpContext.Connection.RemoteIpAddress;

        if (remoteIp.IsIPv4MappedToIPv6)
        {
            remoteIp = remoteIp.MapToIPv4();
        }

        return remoteIp.ToString();
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58541799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档