【发布时间】: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