IIS部署Razor Web应用后获取登录用户真实IP而非服务器IP问题咨询
问题原因
你当前使用的GetLocalIPAddress方法本质是读取程序运行所在服务器的网卡IPv4地址,完全没有关联客户端的HTTP请求信息,因此无论哪个用户访问,都会返回服务器自身IP,无法获取客户端真实IP。
修复方案
Web应用获取客户端IP必须从当前HTTP请求的上下文属性中读取,根据你使用的.NET版本选择对应实现:
ASP.NET Core Razor 应用(主流.NET 5/6/7/8版本)
- 首先在
Program.cs中注册HTTP上下文访问服务:
// 添加到服务注册段,放在var app = builder.Build();之前 builder.Services.AddHttpContextAccessor();
- 封装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"; } }
- 在
Program.cs中注册该服务:
builder.Services.AddScoped<ClientIpService>();
- 业务代码中直接注入
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
相关产品推荐
相关产品推荐

