Как получить IP-адрес клиента в ASP.NET Core 2.1 - PullRequest
0 голосов
/ 30 июня 2018

Я работаю над 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.

Ответы [ 7 ]

0 голосов
/ 24 февраля 2019

Это работает для меня на .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();
0 голосов
/ 02 апреля 2019

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

var ipAddress = HttpContext.Connection.RemoteIpAddress;

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

0 голосов
/ 31 октября 2018

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

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"];
0 голосов
/ 19 октября 2018

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

app.UseForwardedHeaders(new ForwardedHeadersOptions{ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto});
0 голосов
/ 09 июля 2018

В вашем 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" };
}
0 голосов
/ 02 июля 2018

Если я использую Binding Address Localhost: 5000, тогда IP возвращается как «:: 1» (IPv6-адрес Localhost). Если я привязываю свой 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, который содержит реальный IP-адрес клиента, если вы не настроили или не настроили обработав заголовок X-Forwarded-For, вы всегда получите IP-адрес Null или Reverse-Proxy Server.

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

Надеюсь, что поможет

0 голосов
/ 01 июля 2018

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

Код:

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

enter image description here

Источник

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...