Как получить IP-адрес клиента в ASP.NET Core 2.1

Я работаю над ASP.Net Core 2.1 с угловым шаблоном, предоставленным Microsoft Visual Studio 2017. Мое клиентское приложение работает нормально. После конкурса аутентификации пользователей я хочу запустить Управление сеансами пользователей, в котором я храню IP-адрес пользователя клиента. Я уже искал это в Интернете, но пока не нашел никакого решения.

Ниже приведены ссылки на ссылки, которые я уже посетил:

Как получить IP-адрес клиента в ASP.NET CORE?

Получить IP-адрес клиента в ASP.NET Core 2.0

Получить удаленный IP-адрес пользователя в ASP.Net Core

В моем ValuesController.cs я также попробовал следующий код:

private IHttpContextAccessor _accessor;

public ValuesController(IHttpContextAccessor accessor)
{
    _accessor = accessor;
}

public IEnumerable<string> Get()
{
    var ip = Request.HttpContext.Connection.RemoteIpAddress.ToString();
    return new string[] { ip, "value2" };
}

где переменная IP я получаю нулевое значение и получаю эту ошибку

Request.HttpContext.Connection.RemoteIpAddress.Address вызвал исключение типа 'System.Net.Sockets.SocketException'

enter image description here

enter image description here

Подскажите, пожалуйста, как узнать IP-адрес клиента в ASP.NET Core 2.1.

Ответ 1

В вашем Startup.cs, убедитесь, что у вас есть метод для ConfigureServices, проходя в IServiceCollection, затем зарегистрировать IHttpContextAccessor как одноточечного следующим образом:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
}

После регистрации IHttpContextAccessor в вашем Startup.cs файл, вы можете вводить IHttpContextAccessor в классе контроллера и использовать его следующим образом:

private IHttpContextAccessor _accessor;

public ValuesController(IHttpContextAccessor accessor)
{
    _accessor = accessor;
}

public IEnumerable<string> Get()
{
    var ip = _accessor.HttpContext?.Connection?.RemoteIpAddress?.ToString();
    return new string[] { ip, "value2" };
}

Ответ 2

Можно использовать следующий код:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});

string remoteIpAddress = HttpContext.Connection.RemoteIpAddress.MapToIPv4().ToString();
if (Request.Headers.ContainsKey("X-Forwarded-For"))
    remoteIpAddress = Request.Headers["X-Forwarded-For"];

Ответ 3

Если я использую Binding Address Localhost: 5000, тогда IP возвращается как ":: 1" (адрес Localhost IPv6). Если я привяжу свой Webapi к IP-адресу и попытаюсь связаться с ним с другого клиентского компьютера, я получаю IP-адрес клиента в ответе API. Мне не нужно HTTPAccessor. Согласно документации https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1, HttpContext.Connection.RemoteIpAddress устанавливается XForwardedFor заголовок.

Если ваше приложение (WEBAPI) находится за обратным прокси-сервером NGINX/Apache, вы должны включить эти REV-прокси для отправки адреса X-Forwarded-For Header, который содержит реальный IP-адрес Клиента, если вы не настроите или не обработаете X- Forwarded-For Header, тогда вы всегда будете получать либо Nulls, либо IP-адрес Reverse-Proxy Server.

GetHostEntry выше не имеет никакого отношения к HTTP-запросу напрямую. GetHostEntry - это просто инструмент NSLookup для программирования API, и он просто сообщает вам, что IP-адреса достижимы для определенного имени, но не сообщают вам, с какого IP-адреса Запрос пришел в WebApi.

надеюсь, это поможет

Ответ 4

Проведя некоторое время на поиске, я нашел свой собственный вопрос. Здесь я также использую ссылку источника, откуда я могу получить ответ и подробное объяснение того, как запрашивать сервер для получения семейных адресов и поддерживаемых им IP-адресов.

Код:

IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName());
var ip = heserver.AddressList[2].ToString();

enter image description here

Источник

Вот мой другой вопрос: как получить доступ к переменным сервера в ASP.Net Core 2.x Надеюсь, это поможет вам всем.

Ответ 5

Если ваш Kestrel находится за обратным прокси-сервером, таким как IIS, обязательно перенаправьте заголовки, содержащие IP-адрес клиента.
Это входит в запуск:

app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});

Ответ 6

Попробуйте этот код,

var ipAddress = HttpContext.Connection.RemoteIpAddress;

И если у вас есть другой компьютер в той же локальной сети, попробуйте подключиться к этому компьютеру, но используйте user ip вместо localhost. В противном случае вы всегда получите результат :: 1.

Ответ 7

Это работает для меня на .Net Core 2.2:

IPHostEntry heserver = Dns.GetHostEntry(Dns.GetHostName());

var ipAddress = heserver.AddressList.ToList().Where(p => p.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork).FirstOrDefault().ToString();