如何通过Azure Front Door、Nginx和.NET Core获取真实客户端IP?
解决Azure Front Door + Nginx + .NET Core 获取真实客户端IP的问题
一、调整Nginx配置,传递AFD的真实IP头
Azure Front Door会将客户端真实IP放在X-Azure-ClientIP请求头中,需要修改Nginx的default.conf,把这个头传递给后端.NET Core服务,同时正确处理X-Forwarded-For的拼接:
proxy_set_header X-Forwarded-For $http_x_azure_clientip,$proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; # 可选:单独传递X-Azure-ClientIP头,方便后端直接读取 proxy_set_header X-Azure-ClientIP $http_x_azure_clientip;
这样配置后,X-Forwarded-For的第一个值就是客户端真实IP,后续才是AFD和Nginx的代理IP。
二、配置.NET Core信任AFD代理并处理转发头
默认情况下,.NET Core的ForwardedHeadersMiddleware仅信任本地代理,需要添加AFD的出口IP段到信任列表,确保能正确解析转发头:
.NET 5及之前(Startup.cs)
app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto, // 配置AFD的出口IP段(可从Azure官方获取最新IP范围) KnownNetworks = { new IPNetwork(IPAddress.Parse("13.107.6.0"), 24), new IPNetwork(IPAddress.Parse("13.107.128.0"), 22) // 可添加更多AFD官方公布的IP段 }, ForwardLimit = null, RequireHeaderSymmetry = false });
.NET 6+(Program.cs)
builder.Services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("13.107.6.0"), 24)); options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("13.107.128.0"), 22)); options.ForwardLimit = null; options.RequireHeaderSymmetry = false; }); // 注意:UseForwardedHeaders要放在UseRouting之前 app.UseForwardedHeaders(); app.UseRouting();
三、在.NET Core中获取真实IP
配置完成后,可通过两种方式获取真实IP:
- 从
X-Forwarded-For头读取(取第一个值) - 直接读取
X-Azure-ClientIP头
示例代码:
[HttpGet("get-client-ip")] public IActionResult GetClientIp() { // 方式1:从X-Forwarded-For获取 var forwardedFor = Request.Headers["X-Forwarded-For"].FirstOrDefault(); var realIpFromForwarded = forwardedFor?.Split(',').FirstOrDefault()?.Trim(); // 方式2:直接读取X-Azure-ClientIP var realIpFromAzureHeader = Request.Headers["X-Azure-ClientIP"].FirstOrDefault(); return Ok(new { RealIp_ForwardedFor = realIpFromForwarded, RealIp_AzureClientIp = realIpFromAzureHeader }); }
内容的提问来源于stack exchange,提问作者Ricardo Gaefke
相关产品推荐
相关产品推荐

