如何在点网隔离的Azure函数中获取客户端IP地址?

Sum*_*tel 3 isolation .net-core azure-functions

我正在使用 Azure Functions Isolation在 .NetCore 6.0 (C#) 中编写一个函数,并且需要获取客户端的 IP 地址。有没有办法从 HttpRequestData 或 FunctionContext 对象获取客户端 IP 地址?

   [Function("GetClientIP")]
public async Task<HttpResponseData> GetClientIP([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req, FunctionContext functionContext)
{  ....  }
Run Code Online (Sandbox Code Playgroud)

我参考了以下链接:但它不适用于隔离模式。

备注:我使用的是隔离模式。

Kob*_*ser 5

我终于能够使用下面的代码检索它。

请注意,标头值“x-forwarded-for”仅在托管在 azure 中时可用。

public async Task<HttpResponseData> SendMessage(
    [HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req,
    FunctionContext executionContext, 
    string requestName)
{
    var headerDictionary = req.Headers.ToDictionary(x => x.Key, x => x.Value, StringComparer.Ordinal);
    var key = "x-forwarded-for";
    if (headerDictionary.ContainsKey(key))
    {
        IPAddress? ipAddress = null;
        var headerValues = headerDictionary[key];
        var ipn = headerValues?.FirstOrDefault()?.Split(new char[] { ',' }).FirstOrDefault()?.Split(new char[] { ':' }).FirstOrDefault();
        if (IPAddress.TryParse(ipn, out ipAddress))
        {
            var ipAddressString = ipAddress.ToString();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的例子中,检索到的值包含以下值“105.224.244.204,147.243.88.136:58088”列表中的第一个IP地址包含客户端IP地址。

我还发现我可以使用键值“x-azure-clientip”检索它。原因是该函数托管在 Azure Front Door 后面。

该链接更详细地介绍了托管在 Azure Front Door 后面时请求中可以预期的标头 https://learn.microsoft.com/en-us/azure/frontdoor/front-door-http-headers-protocol