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

如何识别调用HTTP触发Azure Function的Azure Function或应用?

更可靠识别Azure Function调用方的方法

你当前通过Referer、User-Agent和ClientIP识别调用方的方式存在局限性:这些字段可能被篡改、重复(比如同一环境的Function可能用相同的User-Agent),内部IP也无法直接对应到具体资源。针对同一订阅内共享Application Insights的Azure Function调用场景,以下是几种更优更可靠的方案:

1. 利用Application Insights分布式追踪关联

当调用方和被调用方共享App Insights时,Azure会自动传递分布式追踪上下文,被调用方可以通过OperationParentId回溯到调用方的请求:

代码实现(.NET 8 Isolated)

// 从TelemetryClient上下文获取父操作ID
var parentOperationId = telemetryClient.Context.Operation.ParentId;
if (!string.IsNullOrEmpty(parentOperationId))
{
    var telemetry = new TraceTelemetry("Caller info", SeverityLevel.Information);
    telemetry.Properties["CallerOperationId"] = parentOperationId;
    telemetryClient.TrackTrace(telemetry);
}

关联调用方资源

在App Insights的日志查询中,通过operation_ParentId关联调用方的请求记录,获取调用方的Function名称和资源ID:

requests
| where name == "你的目标Function端点名称"
| project RequestId = id, ParentOperationId = operation_ParentId
| join kind=inner (
    requests
    | project ParentId = id, CallerFunctionName = cloud_RoleName, CallerResourceId = azure_resourceId
) on $left.ParentOperationId == $right.ParentId

2. 自定义请求头传递调用方标识

这是最直接可控的方案,让调用方在请求时主动传递唯一标识,被调用方读取并记录:

调用方(另一Azure Function)代码

var httpClient = new HttpClient();
// 传递当前Function的名称(从环境变量获取)
httpClient.DefaultRequestHeaders.Add("X-Caller-Function-Name", Environment.GetEnvironmentVariable("WEBSITE_SITE_NAME"));
// 可选:传递资源ID,确保唯一
httpClient.DefaultRequestHeaders.Add("X-Caller-Resource-ID", Environment.GetEnvironmentVariable("WEBSITE_RESOURCE_ID"));
var response = await httpClient.GetAsync("https://你的目标Function地址/api/端点");

被调用方(.NET 8 Isolated)代码

// 从请求头读取调用方标识
var callerFunctionName = req.Headers.TryGetValue("X-Caller-Function-Name", out var names) ? names.FirstOrDefault() : "unknown";
var callerResourceId = req.Headers.TryGetValue("X-Caller-Resource-ID", out var ids) ? ids.FirstOrDefault() : "unknown";

var telemetry = new TraceTelemetry("Caller info", SeverityLevel.Information);
telemetry.Properties["CallerFunctionName"] = callerFunctionName;
telemetry.Properties["CallerResourceId"] = callerResourceId;
telemetryClient.TrackTrace(telemetry);

3. 通过Azure AD身份验证识别调用方

如果需要强身份验证+调用方识别,可以配置Azure AD保护你的Function端点,让调用方使用托管身份发起请求:

  • 被调用方Function启用Azure AD身份验证,只允许指定的托管身份访问
  • 被调用方从请求的Bearer令牌中解析出调用方的服务主体ID(appid)或对象ID(oid),再通过Azure资源管理API关联到具体的Function资源
  • 将这些标识记录到App Insights的自定义属性中

4. 利用App Insights内置资源属性

每个Azure Function的请求在App Insights中会自动带上cloud_RoleName(Function名称)和azure_resourceId(资源唯一ID),如果调用方和被调用方共享App Insights,直接通过追踪链就能关联两者的请求,无需额外代码开发。


内容的提问来源于stack exchange,提问作者that one guy on the internet

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 23:03:22