erikswdevlab

Día a día de mis proyectos de software. Me apasiona desarrollar software y disfruto documentarlo.

1-min read

Cómo obtener la dirección IP del usuario que visita nuestra aplicación web hospedada en Heroku

Durante el desarrollo de Isolaatti https://isolaatti.com/ me vi en la necesidad de registrar la Ip del usuario, para poder guardarla y mantener registro para que el mismo usuario pueda ver de donde accedió y enviarsela por correo cuando dicho inicio de sesión ocurra.

Como implementarlo en ASP.NET 6

ASP.NET Core cuenta con ConnectionInfo.RemoteIpAddress que permite ver la dirección IP del usuario. Sin embargo, este metodo no siempre es efectivo si nuestra aplicación está detrás de un proxy, como es mi caso, que está hospedada en Heroku. En estos casos, la IP mostrada no será la IP real del usuario, sino alguna de los servidores proxy por donde pasó la petición.

La solución es utilizar el contenido del header X-Forwarded-For cuando esté disponible, que tiene una lista de IPs. Una implementación básica podría ser así:

var xForwardedForHeaderValue = _httpContext.Request.Headers["X-Forwarded-For"];
        return xForwardedForHeaderValue.Count == 0 
                ? _httpContext.Request.HttpContext.Connection.RemoteIpAddress?.ToString() 
                // Primero accedo al valor del header, que es una lista. Los headers aqui se toman como más de un valor
                // cuando están separados por un ";", por lo que debemos usar el primer valor de la lista.
                // Ya teniendo ese valor, debemos usar Split() para separar los valores por ",", que es
                // como vienen delimitadas cada una de la direcciones.
                // Split() nos regresa un array de strings, y en este caso la IP correcta es la primera, 
                //por lo que se usa el índice 0.
                : _httpContext.Request.Headers["X-Forwarded-For"][0].Split(",")[0].Trim();

Mira este archivo para que veas como lo implementé en el código completo.

Te recomiendo experimentar con ese header, y ver cual es el que contiene la IP real, porque en mi caso fue la primera, que es como dice el estandar, pero es posible que el proveedor de servicios donde hospedes tu app modifique este valor.

Next →