使用用户分配托管身份通过ADF上传Blob存储失败(403禁止)
问题场景
使用Azure Data Factory复制活动上传文件至Blob存储容器,链接服务通过用户分配托管身份(User Assigned Managed Identity)连接存储账户,测试连接成功,但复制活动执行失败,报错403禁止。托管身份已被分配存储账户所在资源组的参与者角色。
具体错误信息
Failure happened on 'Sink' side. ErrorCode=FileForbidden,'Type=Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message=Error occurred when trying to upload a blob, detailed message: 20240320_130837_File1.csv,Source=Microsoft.DataTransfer.ClientLibrary,''Type=Microsoft.WindowsAzure.Storage.StorageException,Message=The remote server returned an error: (403) Forbidden.,Source=Microsoft.WindowsAzure.Storage,StorageExtendedMessage=This request is not authorized to perform this operation using this permission.
RequestId:b1c85e0a-b01e-001c-6a79-7be8ba000000
Time:2024-03-21T10:18:31.4813244Z,,''Type=System.Net.WebException,Message=The remote server returned an error: (403) Forbidden.,Source=Microsoft.WindowsAzure.Storage,'
排查与解决步骤
- 替换资源组参与者角色为存储Blob数据专用角色:资源组参与者角色不具备直接操作Blob数据的权限,需为托管身份分配**存储Blob数据贡献者(Storage Blob Data Contributor)**角色,分配范围直接选择目标存储账户或具体Blob容器,而非仅资源组。
- 确认角色分配范围与生效时间:检查角色是否正确分配到存储账户/容器级别,RBAC角色通常需要5-10分钟生效,若刚完成分配,等待片刻后重试。
- 检查存储账户防火墙设置:若存储账户启用了防火墙,需确保开启“允许受信任的Microsoft服务访问此存储账户”选项,同时确认ADF实例的IP地址已被添加到允许列表(若使用特定IP访问)。
- 验证链接服务与数据集配置:确认链接服务中选择的是正确的用户分配托管身份,数据集内的存储账户名称、目标容器名称配置无误,无拼写错误。
- 排查容器访问策略冲突:若目标容器设置了SAS令牌或匿名访问,确保未与托管身份的权限规则冲突,优先使用RBAC权限而非混合访问方式。
内容的提问来源于stack exchange,提问作者Sivaani

