如何在ASP.NET Core 3.1 Web API中获取用户的IP地址
ASP.NET Core 3.1 Web API 获取客户端IP地址解决方案
第一步:配置转发头中间件(必做)
默认情况下框架不会自动读取反向代理传递的客户端IP,需要先在Startup.cs中添加相关配置:
- 在
ConfigureServices方法中注册转发头配置:
public void ConfigureServices(IServiceCollection services) { // 配置转发头规则 services.Configure<ForwardedHeadersOptions>(options => { options.ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor | Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedProto; // 如有固定反向代理地址,可添加到信任列表,示例为本地Nginx场景 options.KnownProxies.Add(System.Net.IPAddress.Parse("127.0.0.1")); }); services.AddControllers(); // 其他服务注册逻辑 }
- 在
Configure方法的最开头启用转发头中间件,优先级必须高于其他中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 必须放在中间件管道的第一行 app.UseForwardedHeaders(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseHttpsRedirection(); app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); }
第二步:控制器中获取IP
完成配置后直接从HttpContext中读取即可:
[ApiController] [Route("api/[controller]")] public class IpController : ControllerBase { [HttpGet] public IActionResult GetVisitorIp() { string clientIp = HttpContext.Connection.RemoteIpAddress?.ToString(); // 本地测试返回::1或127.0.0.1属于正常情况,部署到公网后会返回真实用户IP return Ok(new { ip = clientIp }); } }
非控制器场景获取IP
如果需要在服务层、工具类等非控制器代码中获取IP,需要先注册IHttpContextAccessor:
- 在
ConfigureServices中添加注册逻辑:
services.AddHttpContextAccessor();
- 注入后即可使用:
public class CustomService { private readonly IHttpContextAccessor _contextAccessor; public CustomService(IHttpContextAccessor contextAccessor) { _contextAccessor = contextAccessor; } public string GetClientIp() { return _contextAccessor.HttpContext?.Connection.RemoteIpAddress?.ToString(); } }
常见问题说明
- 本地测试拿到的
::1是IPv6格式的回环地址,属于正常现象,部署到公网服务器后会返回真实用户IP - 如果使用了CDN、负载均衡等代理服务,必须配置转发头,否则获取到的会是代理服务器的IP
- 如果返回的IP包含多个逗号分隔的地址,第一个值就是真实客户端IP,后续为经过的各层代理IP
内容的提问来源于stack exchange,提问作者Võ Thái Phúc
相关产品推荐
相关产品推荐

