`X-Forwareded-For` не используется ASP.Net Core за обратным прокси - PullRequest
0 голосов
/ 30 сентября 2018

Я пытаюсь получить удаленный IP-адрес запроса (т. Е. IP-адрес клиента, отправившего запрос) в моем ASP.Net Core 2.1 MVC Controller (работает в .Net Docker контейнере).Учитывая, что приложение My ASP.Net Core находится за обратным прокси-сервером NGINX (работает в контейнере NGINX Docker).

Как известно, когда обратный прокси-сервер перенаправляет запрос в мой .NetБазовое приложение, оно изменит исходный IP моего запроса (уровень TCP / IP), поэтому я настроил NGINX для добавления X-Forwareded-For с исходным IP к запросу.Запрос, который перенаправляется из контейнера NGINX в контейнер .Net, имеет X-Forwareded-For в заголовке:

enter image description here

И, конечно, я настроил .Net Coreзнать об этом:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IServiceProvider serviceProvider)
{
    // Rewrite the header when being redirected (this is required because we are behind reverse proxy)
    var forwardedHeadersOptions = new ForwardedHeadersOptions
    {
        ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto,
        KnownProxies = { IPAddress.Parse("172.20.10.2"), IPAddress.Parse("172.20.10.3"), IPAddress.Parse("172.20.10.4") },
    };

    forwardedHeadersOptions.KnownNetworks.Add(
        new IPNetwork(IPAddress.Parse("172.0.0.0"), 8));
    forwardedHeadersOptions.KnownNetworks.Add(
        new IPNetwork(IPAddress.Parse("127.0.0.1"), 8));

    app.UseForwardedHeaders(forwardedHeadersOptions);
    ...

Однако HTTPContext.Connection.RemoteIPAddress все еще возвращает 172.20.10.3 (IP-адрес контейнера NGINX, а не реальный удаленный IP-адрес):

logger.LogDebug("Remote IP Address: " + Request.HttpContext.Connection.RemoteIpAddress.ToString());

Удаленный IP-адресАдрес: 172.20.10.3

Я проверил свой заголовок в .Net Core, он имеет X-Forwareded-For с правильным исходным удаленным IP-адресом:

logger.LogDebug("X-Forwareded-For Header Feature: " + HttpContext.Request.Headers["X-Forwarded-For"]);

X-Функция заголовка Forwareded-For: 85.XX.4.121

Кто-нибудь знает, что мне не хватает?Почему RemoteIPAddress по-прежнему возвращает IP-адрес док-контейнера NGINX вместо реального удаленного IP-адреса?

Обновление

Мой Program.cs

public class Program
{
    public static void Main(string[] args)
    {
        BuildWebHost(args).Run();
    }

    public static IWebHost BuildWebHost(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseUrls("http://*:5000")
            .UseStartup<Startup>()
            .Build();
}

Я пытался также настроитьForwarededHeadersOptions, настроив свою службу следующим образом:

services.Configure<ForwardedHeadersOptions>(options =>
{
    options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
    //options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("172.0.0.0"), 8));
    options.RequireHeaderSymmetry = false;
    options.ForwardLimit = null;
    options.KnownProxies.Add(IPAddress.Parse("172.20.10.3"));
    //options.KnownNetworks.Add(new IPNetwork(IPAddress.Parse("127.0.0.1"), 8));
});

Безуспешно ...

ОБНОВЛЕНИЕ 2

ОК Я думаю, я на правильном пути, IP-адрес, возвращаемый RemoteIPAddress, был :: ffff: 172.20.10.20, а не 172.20.10.20!Я не знал, что они разные.Официальная документация помогла мне обнаружить это.

1 Ответ

0 голосов
/ 30 сентября 2018

IP, который я получил от RemoteIPAddress, был IPv4, представленный как IPv6 (был :: ffff: 172.20.10.20, а не 172.20.10.20!).Я использовал только IPv4 часть IP, поэтому KnownProxies в моем случае были неверными.Я должен был ввести полный IPv4-адрес также с частью представления v6.

Официальная документация показала, что:

https://docs.microsoft.com/en-us/aspnet/core/host-and-deploy/proxy-load-balancer?view=aspnetcore-2.1

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