Я получаю IP-адрес сервера вместо IP-адреса клиента, используя приведенный ниже метод в веб-API ASP.NET CORE.
Пожалуйста, скажите мне, где я ошибаюсь. Раньше я использовал ServerVariables["HTTP_X_FORWARDED_FOR"] в asp mvc, и это работало правильно.
private string DetectIPAddress(HttpRequest request)
{
var _IP = "RemoteIp:" + request.HttpContext.Connection.RemoteIpAddress.ToString() + " - LocalIpAddress:" +
request.HttpContext.Connection.LocalIpAddress;
try
{
_IP += " IP.AddressFamily:" + Dns.GetHostEntry(Dns.GetHostName()).AddressList[1].ToString();
_IP += " HostName:" + Dns.GetHostEntry(Dns.GetHostName()).HostName;
}
catch (Exception e)
{
}
return _IP;
}





В Asp.Net Core Web API для получения удаленного клиента IP-адрес изменяется на предыдущую версию Asp.Net.
Asp.Net Core представила новую библиотеку для HTTP-запросов и ответов.
Для добавления требуется следующее пространство имен.
using Microsoft.AspNetCore.Http.Features;
После того, как вы добавили namespace, вам просто нужно добавить следующую строку кода для захвата IP-адреса удаленного клиента.
HttpContext.Features.Get()?.RemoteIpAddress?.ToString();
Примечание: когда вы пытаетесь запустить приложение из локальной системы, поэтому приведенная выше строка кода возвращает результат «:: 1», но он будет работать после того, как вы развернете свое приложение где-нибудь.
Это не работает. Он возвращает IP-адрес моего сервера. IP-адрес журнала 192.168.160.1
Обратитесь к этому gist.github.com/jjxtra/3b240b31a1ed3ad783a7dcdb6df12c36
Я также добавляю ForwardedHeadersOptions в statup.cs, и все работает правильно. Большое спасибо.
HttpContext.Connection.RemoteIpAddress и HttpContext.Features.Get<IHttpConnectionFeature>()?.RemoteIpAddress дают одинаковый результат. Правильный ответ здесь — ForwardedHeaders.
Получение IP-адреса клиента звучит просто, но на самом деле я пытался получить IP-адрес клиента в течение многих часов, пока не нашел этот метод расширения сути в комментарии @Voodoo, который мне помог. Я хочу сделать его более заметным и поэтому создаю отдельный ответ. Он работает с .NET 5 на AWS fargate, вероятно, с каким-то сквозным балансировщиком нагрузки, где один только RemoteIpAddress не работает.
public static class HttpContextExtensions
{
//https://gist.github.com/jjxtra/3b240b31a1ed3ad783a7dcdb6df12c36
public static IPAddress GetRemoteIPAddress(this HttpContext context, bool allowForwarded = true)
{
if (allowForwarded)
{
string header = (context.Request.Headers["CF-Connecting-IP"].FirstOrDefault() ?? context.Request.Headers["X-Forwarded-For"].FirstOrDefault());
if (IPAddress.TryParse(header, out IPAddress ip))
{
return ip;
}
}
return context.Connection.RemoteIpAddress;
}
}
Используйте это так:
var ip = HttpContext.GetRemoteIPAddress().ToString();
как обычно для SO - правильный ответ последний в списке..
Используйте эту строку в своем метод действия :
string ipAddress = HttpContext.Connection.RemoteIpAddress?.ToString();
Я использую этот метод для получения IP в .net core 3.1.
public static string GetIPAddress(HttpContext context)
{
if (!string.IsNullOrEmpty(context.Request.Headers["X-Forwarded-For"]))
{
return context.Request.Headers["X-Forwarded-For"];
}
return context.Connection?.RemoteIpAddress?.ToString();
}
В Startup.cs добавьте этот код
app.UseForwardedHeaders(new ForwardedHeadersOptions() { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto | ForwardedHeaders.All });
См. этот документ о пересылаемых заголовках: docs.microsoft.com/en-us/aspnet/core/host-and-deploy/…