如何在Blob Trigger触发Azure Function时获取用户信息或标识符
可以实现,以下是两种可行方案
方案一:用Event Grid Trigger替代原生Blob Trigger(推荐)
原生Blob Trigger的事件负载不包含用户身份信息,而Event Grid的Blob存储事件能携带AAD用户的身份上下文(仅当通过AAD认证上传时),步骤如下:
配置Event Grid事件订阅
- 给目标Blob容器创建Event Grid事件订阅,选择
Blob Created事件类型,将事件发送到你的Azure Function(需创建Event Grid Trigger类型的Function)。 - 确保订阅的高级设置中开启了身份信息包含(默认已开启)。
- 给目标Blob容器创建Event Grid事件订阅,选择
在Function中解析身份信息
AAD认证上传时,Event Grid事件的data.identity字段会包含用户信息,结构示例:{ "data": { "identity": { "principalId": "<AAD用户对象ID>", "principalName": "<用户UPN/用户名>", "tenantId": "<AAD租户ID>" } } }用访问密钥上传时,该字段会缺失或为空。
实现日志逻辑
在Function代码里判断身份字段是否存在,按需记录日志:public static async Task Run([EventGridTrigger] EventGridEvent eventGridEvent, ILogger log) { if (eventGridEvent.Data is JObject data) { var identity = data["identity"]?.ToObject<IdentityInfo>(); var blobUrl = data["url"]?.ToString(); if (identity != null && !string.IsNullOrWhiteSpace(identity.PrincipalName)) { log.LogInformation("AAD用户 {User} 上传Blob: {Blob}", identity.PrincipalName, blobUrl); // 这里可添加自定义跟踪逻辑,比如写入用户行为数据库 } else { log.LogInformation("通过访问密钥上传Blob: {Blob}", blobUrl); } } } public class IdentityInfo { public string PrincipalId { get; set; } public string PrincipalName { get; set; } }
方案二:原生Blob Trigger + 存储诊断日志
如果不想替换现有Blob Trigger,可通过存储诊断日志关联用户信息:
开启Blob存储诊断日志
- 进入存储账户的「诊断设置」,新建设置:勾选
StorageWrite日志类别,将日志发送到Log Analytics工作区。
- 进入存储账户的「诊断设置」,新建设置:勾选
在Blob Trigger中关联日志
Trigger触发时,记录Blob名称、容器名和触发时间,然后通过Log Analytics查询最近的StorageWrite日志,匹配该Blob的写入请求,提取identity_principalname等字段。示例Kusto查询:StorageBlobLogs | where OperationName == "PutBlob" | where AccountName == "<你的存储账户名>" | where ContainerName == "{容器名}" | where ObjectName == "{Blob名}" | where TimeGenerated > ago(5m) | project identity_principalname, OperationName, ObjectName注意:这种方式存在日志延迟,需处理查询权限问题。
关键注意事项
- AAD权限:确保AAD用户拥有
Storage Blob Data Contributor或对应细粒度权限,否则身份信息不会被记录。 - 访问密钥识别:用访问密钥上传时,存储日志中
identity字段会显示为accountkey,可据此判断跳过用户跟踪。 - 权限配置:Function需拥有访问Event Grid或Log Analytics的RBAC权限,避免权限不足问题。
内容的提问来源于stack exchange,提问作者youkarthik
相关产品推荐
相关产品推荐

