You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在.NET隔离模式Azure Functions中获取客户端IP地址

.NET 6.0 Isolation模式Azure Functions获取客户端IP方案

隔离模式下无法直接复用进程内(非隔离)模式通过HttpRequest.HttpContext取IP的方法,以下是两种可直接落地的实现方式:

方案1:单函数内直接通过FunctionContext提取

无需额外配置,直接在目标函数内通过功能特性获取连接信息,步骤如下:

  • 引入必需的命名空间
using Microsoft.AspNetCore.Http.Features;
using System.Net;
  • 在函数逻辑中添加IP解析代码
[Function("GetClientIP")]
public async Task<HttpResponseData> GetClientIP([HttpTrigger(AuthorizationLevel.Anonymous, "post")] HttpRequestData req, FunctionContext functionContext)
{
    // 从上下文特性集合中获取HTTP连接信息
    var connectionFeature = functionContext.Features.Get<IHttpConnectionFeature>();
    IPAddress? clientIP = connectionFeature?.RemoteIpAddress;

    // 部署在Azure CDN、应用网关、反向代理后时,需从转发头取真实客户端IP
    if (req.Headers.TryGetValues("X-Forwarded-For", out var forwardedIPs))
    {
        // X-Forwarded-For头格式为:<真实客户端IP>, <代理1IP>, <代理2IP>... 取第一个非空值即可
        string? firstForwardedIP = forwardedIPs.FirstOrDefault()?.Split(',').FirstOrDefault()?.Trim();
        if (IPAddress.TryParse(firstForwardedIP, out var realClientIP))
        {
            clientIP = realClientIP;
        }
    }

    // 自定义业务逻辑,此处示例直接返回IP
    var response = req.CreateResponse(HttpStatusCode.OK);
    await response.WriteAsJsonAsync(new { ClientIP = clientIP?.ToString() });
    return response;
}

方案2:全局中间件统一解析(多函数场景推荐)

如果应用中有多个接口需要获取客户端IP,可通过自定义Worker中间件统一解析,避免重复代码:

  • 编写自定义中间件
using Microsoft.Azure.Functions.Worker;
using Microsoft.Azure.Functions.Worker.Http;
using Microsoft.AspNetCore.Http.Features;
using System.Net;

public class ClientIPResolveMiddleware : IFunctionsWorkerMiddleware
{
    public async Task Invoke(FunctionContext context, FunctionExecutionDelegate next)
    {
        HttpRequestData? req = await context.GetHttpRequestDataAsync();
        if (req != null)
        {
            var connectionFeature = context.Features.Get<IHttpConnectionFeature>();
            IPAddress? clientIP = connectionFeature?.RemoteIpAddress;

            if (req.Headers.TryGetValues("X-Forwarded-For", out var forwardedIPs))
            {
                string? ipStr = forwardedIPs.FirstOrDefault()?.Split(',').FirstOrDefault()?.Trim();
                IPAddress.TryParse(ipStr, out clientIP);
            }

            // 将解析结果存入上下文项,所有函数可直接读取
            context.Items["ClientIP"] = clientIP?.ToString();
        }
        await next(context);
    }
}
  • 在Program.cs中注册中间件
var host = new HostBuilder()
    .ConfigureFunctionsWorkerDefaults(builder =>
    {
        // 注册IP解析中间件
        builder.UseMiddleware<ClientIPResolveMiddleware>();
    })
    .Build();

host.Run();
  • 任意函数中读取解析好的IP即可
string? clientIP = functionContext.Items["ClientIP"]?.ToString();

注意事项:本地调试时RemoteIpAddress默认返回IPv6回环地址::1属于正常现象;公网部署时如果存在前置代理,请务必配置代理IP白名单后再信任X-Forwarded-For头,避免恶意用户伪造请求头伪造IP。

内容的提问来源于stack exchange,提问作者Sumit patel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 02:57:21