如何在Azure Functions C#中获取客户端IP地址?

时间:2016-06-02 04:13:26

标签: azure azure-functions

我正在使用Azure Functions在C#中编写一个函数,并且需要获取调用该函数的客户端的ip地址,这可能吗?

6 个答案:

答案 0 :(得分:16)

以下是基于here的答案。

#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}");
}

答案 1 :(得分:12)

您应该使用这些功能Get the IP address of the remote host

如果您在本地调试预编译函数,

request.Properties [“MS_HttpContext”]不可用 request.Properties [RemoteEndpointMessageProperty.Name]在azure上不可用

Content

更新21.08.2018: 现在,Azure功能位于LoadBalancer后面 - >我们必须检查Request-Headers以确定正确的客户端IP

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;
}

答案 2 :(得分:0)

现在, Azure 函数获得一个 HttpRequest 参数,并且它们位于负载均衡器的后面,该用于获取IP地址的函数对我有效:

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

答案 3 :(得分:0)

2019年10月18日更新:

我尝试过的解决方案更加简单快捷,下面逐步介绍。但在https://docs.microsoft.com/en-us/azure/azure-monitor/app/ip-collection上还有一些冗长/棘手的替代项:

  1. 登录到Azure门户。
  2. 登录后在同一浏览器中打开一个新标签,然后拨“ http://Resources.Azure.Com
  3. 这是Azure后端服务门户,因此在进行更改时要格外小心。
  4. 从左侧面板中展开“ SUBSCRIPTIONS”部分,并展开您的“ Azure订阅”,其中包含应用洞察资源。
  5. 展开“资源组”部分,并展开应用洞察资源所在的资源组。
  6. 展开“提供程序”部分,找到Microsoft.Insights提供程序并将其展开。
  7. 展开“组件”部分,然后按名称查找并选择您的App Insight实例。
  8. 在右上方,将模式从“只读”更改为“读写”。
  9. 在Rest API调用上单击“编辑”按钮。
  10. 添加了新的““ DisableIpMasking”:属性部分为真正的属性。
  11. 按PUT按钮应用更改。
  12. 现在,您的App Insight已启用,可以开始收集客户端IP地址。
  13. 对函数进行一些查询。
  14. 大约5到10分钟后刷新并测试App Insights数据。

答案 4 :(得分:0)

这是一种扩展方法,基于我在.Netcore 3.1中看到的内容。

public static IPAddress GetClientIpn(this HttpRequest request)
{
    IPAddress result = null;
    if (request.Headers.TryGetValue("X-Forwarded-For", out StringValues values))
    {
        var ipn = values.FirstOrDefault().Split(new char[] { ',' }).FirstOrDefault().Split(new char[] { ':' }).FirstOrDefault();
        IPAddress.TryParse(ipn, out result);
    }
    if (result == null)
    {
        result = request.HttpContext.Connection.RemoteIpAddress;
    }
    return result;
}

答案 5 :(得分:0)

正如其他人已经提到的那样,查看MS_HttpContext的旧方法不再起作用。此外,虽然查看X-Forwarded-For的标头的方法确实有效,但它仅在Azure中发布后才有效-在本地运行时它不会返回值。如果您希望在本地进行测试以最大程度地减少任何潜在的成本影响,但是仍然希望能够看到一切正常,则可能会很重要。

要在本地运行时也要查看IP地址,请尝试以下操作:

using Microsoft.AspNetCore.Http;

然后:

String RemoteIP = ((DefaultHttpContext)req.Properties["HttpContext"])?.Connection?.RemoteIpAddress?.ToString();

当前在Azure Functions V3.0中对我有用。