为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?

Posted

技术标签:

【中文标题】为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?【英文标题】:Why cant my Azure App Service connect to Azure Storage Account with managed identity?为什么我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户? 【发布时间】:2021-11-08 07:24:50 【问题描述】:

我有一个分配有托管标识的应用服务,以简化与 Azure 资源的连接。我想使用 DataProtection,应用程序将 xml-keys 存储在 Azure 存储帐户(blob)中以在部署之间持久保存它们。

每当我启动应用程序时,我都会收到身份验证错误:

Microsoft.Azure.Storage.StorageException: This request is not authorized to perform this operation.
   at Microsoft.Azure.Storage.Core.Executor.Executor.ExecuteAsync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token)
   at Microsoft.Azure.Storage.Core.Executor.Executor.<>c__DisplayClass0_0`1.<ExecuteSync>b__0()
   at Microsoft.Azure.Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext[T](Func`1 actionToRun)

我已为应用服务分配了多个不同的 RBAC 角色,但均未成功,包括:

存储数据所有者 存储数据贡献者 存储数据阅读器 所有者

存储帐户已连接到 VNET,并且未向 Internet 开放。应用服务未连接到同一个 VNET。

然后,我尝试在存储帐户网络部分中将应用服务的许多传出 IP 地址列入白名单,其中指出“添加 IP 范围以允许从 Internet 或您的本地网络进行访问。”

还激活了“允许受信任服务列表中的 Azure 服务访问此存储帐户”。

有什么想法缺少吗?仅当在应用程序服务中时才会发生这种情况,从我的调试本地主机我可以连接,所以似乎与天蓝色网络有关。

【问题讨论】:

如果您提供了用于获取 Azure 凭据的代码以及此问题是在本地发生、在云中发生还是在两者中发生,这将有所帮助。还有您尝试针对存储帐户分配应用服务托管标识的角色列表。 如果应用服务连接到一个 VNET,而存储帐户连接到另一个 VNET,您希望如何从应用访问存储? 对于同一区域的存储和webapps,ip白名单将不起作用,因为连接是通过azure内部网络而不是公共网络完成的 您分配了哪个角色?根据现有的错误信息,如果不是网络的原因,很可能是角色的角色有问题。请更改为所有者或贡献者,然后重试。 我已经更新了更多细节!如果我在存储帐户中将我的 IP 列入白名单,它可以在本地调试中进行连接。但在生产/登台中它不会连接。 【参考方案1】:

根据您帖子中的描述,我可以很确定您在门户中的身份配置是正确的,您的代码也是完全正确的。

唯一的问题是您的应用服务无法访问 vnet。简单的描述就是azure storage account是连接vnet的,相当于被vnet保护隔离了。应用服务需要访问存储账户,并且必须先连接到 vnet。

【讨论】:

以上是关于为啥我的 Azure 应用服务无法使用托管标识连接到 Azure 存储帐户?的主要内容,如果未能解决你的问题,请参考以下文章

具有用户分配的托管标识的 Azure SQL 数据库连接池

使用托管标识与 Azure SQL 的 EF Core 连接

Azure 应用服务能够使用托管标识(无应用角色)调用另一个受 AAD 保护的应用服务,为啥?

是否可以使用托管标识从 C# 控制台代码连接 Azure 文件共享(存储帐户)

具有托管标识(用户分配)的 Azure SQL 无法针对 AAD 使用

C# - 具有托管服务标识的 Azure 存储 [关闭]