Разбира се, нека започнем, като говорим за .NET Core и проблема с получаването на отдалечен IP адрес.
.NET Core е безплатна, междуплатформена платформа за разработчици с отворен код за изграждане на много видове приложения, включително уеб приложения и услуги. Получаването на отдалечен IP адрес в приложение .NET Core обаче понякога може да представлява предизвикателство. Това е важно, защото достъпът до IP адреса на клиента позволява подобрено регистриране, персонализирани изживявания и др.
За да разрешим това, можем да използваме HttpContext, предоставен от вградените библиотеки на .NET Core.
Внедряване на Решението
Започваме с достъп до HttpContext в метода на контролера, където се нуждаем от IP адреса на клиента. Обектът HttpContext съдържа специфична за HTTP информация за отделна HTTP заявка.
публичен IActionResult Index()
{
var remoteIpAddress = HttpContext.Connection.RemoteIpAddress;
// допълнителна логика…
}
Това ви дава IP адреса на клиента . Методът HttpContext.Connection.RemoteIpAddress връща IP адреса на отдалечения клиент. Имайте предвид обаче, че това може да не винаги връща очаквания резултат, особено когато вашият сървър е зад балансьор на натоварването или използва мидълуер за пренасочващи заглавки.
По-задълбочено разбиране на кода
Предоставеният C# код използва обекта HttpContext , който е свойство на ControllerBase и съдържа информация за HTTP заявката. Това включва елементи като информация за хоста, подробности за пътя и най-важното свойство Connection.
Свойството Connection е от тип ConnectionInfo, от пространството от имена Microsoft.AspNetCore.Http.Features . Наред с други свойства, то съдържа `RemoteIpAddress`, свойство, което извлича IP адреса от HTTP заявката.
Въпреки това, сървърът може да е зад балансьор на натоварването или прокси. Тези посредници могат да променят информацията в оригиналната HTTP заявка, включително IP адреса на източника . Когато това се случи, свойството `RemoteIpAddress` предоставя IP адреса на посредническото устройство, а не на оригиналния клиент.
Решението „Мидълуер за препратени заглавки“.
За приложения, работещи зад такива посредници, .NET Core предоставя `ForwardedHeadersMiddleware`, междинен софтуер, който работи със заглавки 'X-Forwarded-*', за да съхранява оригиналните детайли на HTTP заявката.
За да активирате `ForwardedHeadersMiddleware`, добавете следната конфигурация към вашия клас Startup.cs.
public void Configure (приложение IApplicationBuilder, IWebHostEnvironment env)
{
app.UseForwardedHeaders(нови ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor |
ForwardedHeaders.XForwardedProto
});
// ...
}
Използване на HttpContext и препратени заглавки
След това можете да продължите да използвате HttpContext.Connection.RemoteIpAddress както преди, но сега, когато е наличен, той ще върне IP адреса на клиента правилно, дори ако сървърът е зад прокси или балансиращо натоварване.
Не забравяйте, че в сложната област на уеб програмирането, middleware и правилното използване на контекстни обекти като HttpContext могат да направят една привидно трудна задача, като например получаването на отдалечен IP адрес, доста лесна. За да извлечем IP адреса на клиента, трябва да разберем тънкостите на HTTP протокола, ролята на middleware като „ForwardedHeadersMiddleware“ и полезността на обекта HttpContext.