本篇记录如何使用asp.net core获取真实的IP地址。
实际在使用的过程中,如果需要获取客户端地址,
是没有办法直接通过传统ASP.Net使用Request.xxx的方式获取的。
那么就需要进行如下操作:
1、新增一个依赖注入
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
2、控制器
private readonly IHttpContextAccessor _httpContextAccessor;
public TestController( IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
}
3、使用
string ipaddress = _httpContextAccessor.HttpContext.Connection.RemoteIpAddress.ToString();
通过上面的方法可以正常获取到IP地址。
但是如果有使用Nginx做反向代理的话,使用上面的方式获取到的IP会是127.0.0.1,无法获取到真实的IP地址,
所以如果使用Nginx做反向代理,则应该使用下面的方式:
if (Request.Headers.ContainsKey("X-Real-IP"))
{
sb.AppendLine($"X-Real-IP:{Request.Headers["X-Real-IP"].ToString()}");
}
if (Request.Headers.ContainsKey("X-Forwarded-For"))
{
sb.AppendLine($"X-Forwarded-For:{Request.Headers["X-Forwarded-For"].ToString()}");
}
因为实际使用,我们是无法通过RemoteIpAddress直接获取到真实的客户端地址的。
如果一定要使用,那么可以通过添加中间件的方式
public class RealIpMiddleware
{
private readonly RequestDelegate _next;
public RealIpMiddleware(RequestDelegate next)
{
_next = next;
}
public Task Invoke(HttpContext context)
{
var headers = context.Request.Headers;
if (headers.ContainsKey("X-Forwarded-For"))
{
context.Connection.RemoteIpAddress=IPAddress.Parse(headers["X-Forwarded-For"].ToString().Split(',', StringSplitOptions.RemoveEmptyEntries)[0]);
}
return _next(context);
}
}
在Startup中的Configura添加下面一句
app.UseMiddleware<RealIpMiddleware>();
这样既可正常使用RemoteIpAddress获取Nginx反向代理后的IP地址了。
Over!
