仅允许选定网络访问存储账户时使用Azure Files遇UnauthorizedAccessException
我的网站基于ASP.NET Core(Windows系统,部署在使用IIS的Azure App Service中),通过Azure存储账户的Azure Files功能读写文件和目录,使用常规System.IO方法(如File.Open等)操作。
当存储账户网络页面的“Public network access”设置为“Enabled from all networks”时,一切正常。但我现在通过虚拟网络限制了访问,仅允许我的App Service访问该存储账户,同时为App Service创建了托管标识,并为其分配了以下RBAC角色:
- Storage Account Contributor
- Storage File Data Privileged Contributor
- Storage Blob Data Contributor
- Storage File Data SMB Share Contributor
- Reader and Data Access
一旦将存储账户网络页面的“Public network access”设置为“Enabled from selected virtual networks and IP addresses”,写入文件时就会抛出异常:
UnauthorizedAccessException: Access to the path '\mystorage.file.core.windows.net\mydirectory\mfile.txt' is denied.
不过写入Blob的操作正常,说明App Service能够连接到存储账户。我需要如何配置才能在存储账户仅允许App Service访问的情况下正常访问文件?我希望继续使用System.IO方法,避免修改应用程序。
核心问题是System.IO依赖SMB协议访问Azure Files,而托管标识无法直接用于SMB身份验证——即使App Service在允许的虚拟网络内,SMB访问仍需传统凭据(存储账户密钥或SAS令牌)。以下是无需修改代码的配置步骤:
1. 确认虚拟网络集成配置
- 确保App Service已开启虚拟网络集成,且该虚拟网络已被添加到存储账户的“允许的虚拟网络”列表中。
- 检查存储账户的“防火墙和虚拟网络”设置,勾选“允许受信任的Microsoft服务访问此存储账户”,避免边缘场景的访问问题。
2. 将Azure Files共享挂载到App Service
通过App Service的路径映射功能,把Azure Files共享挂载为本地可访问的路径,用存储账户密钥完成身份验证:
- 进入Azure门户的App Service页面,找到「配置」>「路径映射」。
- 添加新的路径映射,类型选择“Azure Files”,填写信息:
- 虚拟路径:与代码中访问的路径对应,比如
\mydirectory - 存储账户:选择目标存储账户
- 存储共享:选择对应的Azure Files共享
- 存储账户密钥:从存储账户的「访问密钥」页面获取并填入
- 虚拟路径:与代码中访问的路径对应,比如
- 保存配置后重启App Service。
3. 调整代码中的访问路径
将代码中原有的\mystorage.file.core.windows.net\mydirectory\mfile.txt替换为配置的虚拟路径,比如\mydirectory\mfile.txt。这样System.IO会直接访问挂载到App Service的共享路径,无需直接访问公网SMB地址。
4. 精简冗余RBAC角色
你分配的角色存在冗余,针对Azure Files访问,保留以下两个角色即可:
- Storage File Data SMB Share Contributor:提供SMB共享的读写权限
- Reader:提供存储账户的基础读取权限
完成以上配置后,即使存储账户限制为仅允许指定虚拟网络访问,App Service也能通过挂载路径用System.IO正常读写文件,无需修改应用程序代码。
内容的提问来源于stack exchange,提问作者user1147862

