如何在.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
相关产品推荐
相关产品推荐

