Azure App Service上.NET Core 2应用在Application Insights中IP显示0.0.0.0原因
嘿,这个问题我之前帮不少开发者排查过,核心原因大多和Azure App Service的架构以及你配置的遥测采集方式有关,给你拆解几个常见的情况和解决办法:
1. App Service的反向代理特性导致
Azure App Service本质是运行在反向代理之后的,所有外部请求都会先经过Azure的前端负载均衡器/代理服务器,再转发到你的.NET Core应用。默认情况下,你的应用直接读取的是代理服务器的内部IP(也就是0.0.0.0这类内部地址),而不是真实的客户端IP。
2. 未正确配置Forwarded Headers中间件
.NET Core 2.x需要显式配置ForwardedHeaders中间件,才能让应用识别代理传递过来的真实客户端IP。如果没加这个配置,Application Insights自然只能拿到代理的内部IP。
修复步骤:
在Startup.cs的Configure方法里,把这段代码放在其他中间件(比如UseMvc)之前:
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto });
同时,在ConfigureServices里配置Azure的可信代理IP段,确保应用信任这些来源的转发头:
services.Configure<ForwardedHeadersOptions>(options => { // Azure内部代理的IP段 options.KnownProxies.Add(IPAddress.Parse("10.0.0.0/8")); options.KnownProxies.Add(IPAddress.Parse("172.16.0.0/12")); options.KnownProxies.Add(IPAddress.Parse("192.168.0.0/16")); });
3. Application Insights遥采集未提取真实IP
如果你的AI遥测是默认自动采集的,可能没有正确解析X-Forwarded-For头里的真实IP。这时可以自定义遥测初始化器来手动提取:
先创建一个自定义初始化器类:
public class ClientIpTelemetryInitializer : ITelemetryInitializer { private readonly IHttpContextAccessor _httpContextAccessor; public ClientIpTelemetryInitializer(IHttpContextAccessor httpContextAccessor) { _httpContextAccessor = httpContextAccessor; } public void Initialize(ITelemetry telemetry) { var requestTelemetry = telemetry as RequestTelemetry; if (requestTelemetry == null || string.IsNullOrEmpty(requestTelemetry.Context.Location.Ip)) { var httpContext = _httpContextAccessor.HttpContext; if (httpContext?.Request?.Headers != null) { if (httpContext.Request.Headers.TryGetValue("X-Forwarded-For", out var forwardedFor)) { // 取第一个IP(因为X-Forwarded-For可能包含多个代理IP) requestTelemetry.Context.Location.Ip = forwardedFor.ToString().Split(',')[0].Trim(); } } } } }
然后在ConfigureServices里注册这个初始化器和HttpContext访问器:
services.AddSingleton<ITelemetryInitializer, ClientIpTelemetryInitializer>(); services.AddHttpContextAccessor();
4. 特殊场景:部署在App Service Environment(ASE)
如果你的应用部署在隔离的ASE环境里,代理层级更多,需要调整ForwardedHeadersOptions的ForwardLimit参数,比如设置options.ForwardLimit = 2;,同时确认代理IP段是否匹配。
内容的提问来源于stack exchange,提问作者Leonardo

