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

IIS部署Razor Web应用后获取登录用户真实IP而非服务器IP问题咨询

问题原因

你当前使用的GetLocalIPAddress方法本质是读取程序运行所在服务器的网卡IPv4地址,完全没有关联客户端的HTTP请求信息,因此无论哪个用户访问,都会返回服务器自身IP,无法获取客户端真实IP。

修复方案

Web应用获取客户端IP必须从当前HTTP请求的上下文属性中读取,根据你使用的.NET版本选择对应实现:

ASP.NET Core Razor 应用(主流.NET 5/6/7/8版本)

  1. 首先在Program.cs中注册HTTP上下文访问服务:
// 添加到服务注册段,放在var app = builder.Build();之前
builder.Services.AddHttpContextAccessor();
  1. 封装IP获取逻辑,示例代码如下:
public class ClientIpService
{
    private readonly IHttpContextAccessor _httpContextAccessor;

    public ClientIpService(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public string GetClientIp()
    {
        var context = _httpContextAccessor.HttpContext;
        if (context == null)
        {
            return "未知IP";
        }

        // 优先读取X-Forwarded-For头,兼容反向代理、负载均衡、CDN等部署场景
        var forwardedIp = context.Request.Headers["X-Forwarded-For"].FirstOrDefault();
        if (!string.IsNullOrWhiteSpace(forwardedIp))
        {
            // 多层代理场景下第一个IP为真实客户端IP
            return forwardedIp.Split(',', StringSplitOptions.RemoveEmptyEntries).First().Trim();
        }

        // 无代理场景直接读取连接IP
        var remoteIp = context.Connection.RemoteIpAddress;
        // 如需保留IPv6可删除MapToIPv4()调用
        return remoteIp?.MapToIPv4().ToString() ?? "未知IP";
    }
}
  1. 在Program.cs中注册该服务:
builder.Services.AddScoped<ClientIpService>();
  1. 业务代码中直接注入ClientIpService,调用GetClientIp()方法即可获取用户真实IP。

ASP.NET Framework Razor 应用(.NET Framework 4.x版本)

直接基于当前请求上下文读取即可,示例代码:

public static string GetClientIp()
{
    var request = HttpContext.Current.Request;
    // 优先读取代理透传的真实IP
    string forwardedIp = request.Headers["X-Forwarded-For"];
    if (!string.IsNullOrWhiteSpace(forwardedIp))
    {
        return forwardedIp.Split(',')[0].Trim();
    }
    // 无代理直接读取请求IP
    return request.UserHostAddress;
}
注意事项
  • 若站点部署了CDN、WAF、反向代理等中间服务,需要确认对应服务已开启X-Forwarded-For头透传,否则可能拿到的是代理节点的IP
  • 不要在非请求线程(如后台定时任务)中调用IP获取方法,此时HttpContext为空会导致获取失败
  • 如需兼容IPv6地址,删除代码中MapToIPv4()的相关调用即可

内容的提问来源于stack exchange,提问作者Andres Espinel

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 13:15:04