Как получить IP-адрес клиента в Azure Функции С#?

Я пишу функцию в С#, используя Azure Functions, и вам нужно получить ip-адрес клиента, который вызвал функцию, возможно ли это?

Ответ 1

Вот ответ, основанный на здесь.

#r "System.Web"

using System.Net;
using System.Web;

public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
    string clientIP = ((HttpContextWrapper)req.Properties["MS_HttpContext"]).Request.UserHostAddress;
    return req.CreateResponse(HttpStatusCode.OK, $"The client IP is {clientIP}");
}

Ответ 2

Вы должны использовать эти функции Получить IP-адрес удаленного хоста

request.Properties ["MS_HttpContext"] недоступен, если вы отлаживаете предварительно скомпилированные функции локально request.Properties [RemoteEndpointMessageProperty.Name] недоступно в Azure

private string GetClientIp(HttpRequestMessage request)
{
    if (request.Properties.ContainsKey("MS_HttpContext"))
    {
        return ((HttpContextWrapper)request.Properties["MS_HttpContext"]).Request.UserHostAddress;
    }

    if (request.Properties.ContainsKey(RemoteEndpointMessageProperty.Name))
    {
        RemoteEndpointMessageProperty prop;
        prop = (RemoteEndpointMessageProperty)request.Properties[RemoteEndpointMessageProperty.Name];
        return prop.Address;
    }

    return null;
}

Обновление 21.08.2018: Теперь функции Azure находятся за LoadBalancer → мы должны проверить заголовки запроса, чтобы определить правильный IP-адрес клиента

private static string GetIpFromRequestHeaders(HttpRequestMessage request)
    {
        IEnumerable<string> values;
        if (request.Headers.TryGetValues("X-Forwarded-For", out values))
        {
            return values.FirstOrDefault().Split(new char[] { ',' }).FirstOrDefault().Split(new char[] { ':' }).FirstOrDefault();
        }

        return "";
    }

Ответ 3

Теперь, когда функции Azure получают параметр HttpRequest и находятся за балансировщиком нагрузки, эта функция для получения IP-адреса работает для меня:

private static string GetIpFromRequestHeaders(HttpRequest request)
{
      return (request.Headers["X-Forwarded-For"].FirstOrDefault() ?? "").Split(new char[] { ':' }).FirstOrDefault();
}

Ответ 4

Обновление 18 октября 2019 года:

Решение, которое я попробовал, намного проще и быстрее и поэтапно упоминается ниже. Но есть несколько более длинных/хитрых альтернатив @https://docs.microsoft.com/en-us/azure/azure-monitor/app/ip-collection:

  1. Войдите в портал Azure.
  2. Откройте новую вкладку в том же браузере, когда вы вошли в систему, и наберите 'http://Resources.Azure.Com'
  3. Это портал служб Azure, поэтому было бы немного осторожно вносить изменения.
  4. Разверните раздел ПОДПИСКИ на левой панели и разверните свою подписку Azure, в которой расположен ресурс приложения.
  5. Expand Resource Groups section и expand the Resource Group where app insights resource is.
  6. Разверните раздел "Группы ресурсов" и раскройте группу "Ресурсы", в которой находится ресурс приложения. Разверните раздел "Поставщики", найдите поставщика Microsoft.Insights и разверните его.
  7. Разверните раздел "Компоненты", найдите и выберите свой экземпляр App Insight по имени.
  8. В правом верхнем углу измените свой режим на "Чтение и запись только для чтения".
  9. Нажмите кнопку EDIT при вызове Rest API.
  10. ДОБАВИТЬ NEW '"DisableIpMasking": истинное свойство в раздел свойств.
  11. Нажмите кнопку PUT, чтобы применить изменения.
  12. Теперь ваш App Insight включен, чтобы начать сбор IP-адресов клиентов.
  13. Выполните несколько запросов по функции.
  14. Обновите и протестируйте данные App Insights примерно через 5-10 минут.