Azure环境下上传blob时如何获取发送方IP地址
解决方案:获取Blob上传方IP地址的实现方法
首先说明你在$logs目录找不到IP的原因
默认存储账户的经典日志不会自动启用,新版的存储诊断日志也不会默认写入$logs容器,需要你手动配置日志导出规则后才能拿到完整的请求数据。同时Blob触发器的默认输入绑定不会直接传递客户端IP信息,需要搭配额外配置获取。
可行实现方案
方案1:启用存储账户诊断设置,从操作日志中查询IP
这是最常用的无需修改业务逻辑的方案:
- 进入对应存储账户的管理页,在左侧「监控」分类下选择诊断设置
- 选择
Blob服务,点击「添加诊断设置」 - 日志类别勾选
StorageRead、StorageWrite,导出目标可以选择Log Analytics工作区(方便查询)或者指定单独的存储容器存放日志 - 保存配置后,所有Blob操作都会记录完整请求信息,包含
ClientIp、操作类型、Blob路径、请求时间、SAS标识等字段 - 如果选择导出到Log Analytics,可直接用以下查询语句筛选指定Blob的上传IP:
StorageBlobLogs | where OperationName == "PutBlob" | where Uri has "你要查询的Blob的完整路径/名称" | project TimeGenerated, ClientIp, UserAgent, Uri, SasKeyType
注意:诊断日志会有5~15分钟的延迟,不支持实时获取。
方案2:在Blob触发器触发时直接获取IP(实时场景)
如果需要触发Blob处理逻辑时直接拿到上传方IP,可以调整业务流程实现:
- 方案A:不直接给用户开放存储容器的上传权限,改为提供HTTP触发的函数作为统一上传入口,HTTP请求中可以直接通过
req.HttpContext.Connection.RemoteIpAddress拿到客户端IP,你在HTTP函数内完成Blob写入,同时将IP写入Blob的自定义元数据,后续Blob触发器触发时直接读取元数据即可拿到IP - 方案B:如果必须给用户发放SAS令牌直接上传存储,生成SAS时给每个用户分配唯一的自定义SAS标识,将标识和用户的IP/身份信息存在你的业务数据库,后续从诊断日志中匹配对应SAS标识即可关联到上传方的身份和IP信息
常见问题排查
- 如果拿到的
ClientIp是代理/CDN的出口IP而非用户真实IP,需要在你使用的CDN/代理服务中配置传递X-Forwarded-For请求头,该字段内容会被记录到存储日志的扩展字段中 - 经典存储日志启用后才会写入
$logs容器,该功能已经逐步被新版诊断设置替代,建议优先使用诊断设置获取日志
内容的提问来源于stack exchange,提问作者node1
相关产品推荐
相关产品推荐

