You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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:

  1. 从X-Forwarded-For头读取(取第一个值)
  2. 直接读取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 15:12:44