Obtenga la IP del cliente al usar el equilibrio de carga en ASP.NET Core

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();

Supongo que te gusta

Origin blog.csdn.net/qianjiu/article/details/121996186
Recomendado
Clasificación