En el caso del balanceo de carga, la dirección IP del balanceo de carga se obtiene a través de context.Connection.RemoteIpAddress, y la IP real del cliente debe obtenerse a través del encabezado de solicitud X-Forwarded-For.
El método anterior es obtener directamente el encabezado de solicitud X-Forwarded-For usted mismo, el código es el siguiente:
public static class HttpContextExtensions { public static string GetUserIp(this HttpContext context) { var ip = context.Request.Headers["X-Forwarded-For"].FirstOrDefault(); if (string.IsNullOrEmpty(ip)) { ip = context.Connection.RemoteIpAddress?.ToString(); } devuelve GetSingleIP(ip); } cadena estática privada GetSingleIP(cadena ip) { if (!string.IsNullOrEmpty(ip)) { var commaIndex = ip.LastIndexOf(","); si (índice de coma >= 0) { ip = ip.Substring(comaIndex + 1); } } devolver ip; } }
Ahora use el Middleware de encabezados reenviados incorporado de asp.net core para lograrlo.
Primero configure ForwardedHeadersOptions en Startup.ConfigureServices, y solo necesita especificar ForwardedHeaders.XForwardedFor para el escenario de obtener la IP del cliente.
services.Configure<ForwardedHeadersOptions>(opciones => { opciones.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto; options.KnownNetworks.Clear(); options.KnownProxies.Clear(); });
Nota 1: si el equilibrio de carga no está reenviando solicitudes a través de la dirección Loopback en la máquina local, deben agregarse options.KnownNetworks.Clear y options.KnownProxies.Clear.
Nota 2: si la variable de entorno ASPNETCORE_FORWARDEDHEADERS_ENABLED se establece en verdadero, el código de configuración anterior no es necesario.
A continuación, agregue el middleware de encabezados reenviados en Startup.Configure.
app.UseForwardedHeaders()
De esta forma se puede obtener la dirección IP real del cliente a través de RemoteIpAddress.
var ip = Request.HttpContext.Connection.RemoteIpAddress?.MapToIPv4().ToString();