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

如何在Blob Trigger触发Azure Function时获取用户信息或标识符

可以实现,以下是两种可行方案

方案一:用Event Grid Trigger替代原生Blob Trigger(推荐)

原生Blob Trigger的事件负载不包含用户身份信息,而Event Grid的Blob存储事件能携带AAD用户的身份上下文(仅当通过AAD认证上传时),步骤如下:

  1. 配置Event Grid事件订阅

    • 给目标Blob容器创建Event Grid事件订阅,选择Blob Created事件类型,将事件发送到你的Azure Function(需创建Event Grid Trigger类型的Function)。
    • 确保订阅的高级设置中开启了身份信息包含(默认已开启)。
  2. 在Function中解析身份信息
    AAD认证上传时,Event Grid事件的data.identity字段会包含用户信息,结构示例:

    {
      "data": {
        "identity": {
          "principalId": "<AAD用户对象ID>",
          "principalName": "<用户UPN/用户名>",
          "tenantId": "<AAD租户ID>"
        }
      }
    }
    

    用访问密钥上传时,该字段会缺失或为空。

  3. 实现日志逻辑
    在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,可通过存储诊断日志关联用户信息:

  1. 开启Blob存储诊断日志

    • 进入存储账户的「诊断设置」,新建设置:勾选StorageWrite日志类别,将日志发送到Log Analytics工作区。
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:33:08