我的机器人无法使用系统分配的托管标识访问 Blob 存储帐户

Posted

技术标签:

【中文标题】我的机器人无法使用系统分配的托管标识访问 Blob 存储帐户【英文标题】:My bot cannot access to blob storage account with a system assigned managed identity 【发布时间】:2020-12-27 10:28:45 【问题描述】:

我正在探索将 Azure blob 存储与我的机器人一起使用。我想将它用作状态的持久存储,以及存储成绩单。

我这样配置BlobStorage 对象:

storageProvider = new BlobStorage( 
  containerName: process.env.BlobContainerName,
  storageAccountOrConnectionString: process.env.BlobConnectionString
 );

由于敏感信息存储在这些文件中,尤其是转录本,我正在与我的团队合作保护存​​储帐户和其中的容器。

我们为托管机器人的应用程序服务创建了一个系统分配的托管标识,并且我们为该帐户赋予了“存储 Blob 数据参与者”角色。据我了解,它提供对存储内容的读取、写入和删除访问权限。

不幸的是,当机器人尝试访问存储时,访问尝试失败。我在“OnTurnError 跟踪”中看到以下错误:

StorageError: Forbidden

有趣的是,使用相同的 blob 存储连接字符串在本地运行机器人是可行的。表明此问题与服务标识和/或其拥有的权限有关。

有谁知道导致错误的原因是什么?存储帐户是否需要更多权限?任何关于增加错误记录以可能看到更详细的错误消息的想法也非常受欢迎。

【问题讨论】:

您的问题解决了吗? 嗨@ranusharao,正如我在回答我的帖子中提到的那样,我不相信机器人框架目前支持使用身份来访问 blob 存储。我已经在答案中详细说明了我的推理。如果我在分析中遗漏了什么,请告诉我。 【参考方案1】:

目前,我认为框架不支持使用系统分配的托管标识来访问 blob 存储。

在对此进行调查时,我发现了一些 Node.js 示例,它们使用两个特定的包来使用系统分配的身份访问 blob 存储。具体来说:

@azure/storage-blob - https://www.npmjs.com/package/@azure/storage-blob @azure/identity - https://www.npmjs.com/package/@azure/identity

身份包提供了获取与凭据关联的令牌的功能,然后 storage-blob 包中的代码使用该令牌与存储帐户进行交互。

如果我查看 bot 框架的依赖关系树,我看不到这些包中的任何一个。相反,我看到:

天蓝色存储-https://www.npmjs.com/package/azure-storage botbuilder-azure - https://www.npmjs.com/package/botbuilder-azure

深入研究这两个包,我看不到任何用于连接到使用凭据的 Azure 存储帐户的代码。我能找到的唯一代码使用访问密钥。因此,我目前的结论是机器人框架不支持使用凭据访问存储帐户。

虽然我们可以探索添加使用这些包的代码,但目前如此重要的开发工作超出了我们项目的范围。

如果有比我了解更多的人认为这是不正确的,请通过评论告诉我,我会进一步探索。

目前我们已决定继续使用访问密钥。因为它的安全性不亚于机器人访问其他服务的方式。比如像 QnA Maker 这样的认知服务。

【讨论】:

以上是关于我的机器人无法使用系统分配的托管标识访问 Blob 存储帐户的主要内容,如果未能解决你的问题,请参考以下文章

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

无法将事件网格系统分配的托管标识添加到存储帐户角色

如何使用用户分配的托管标识访问 Azure 中 Function App Config 的 Key Vault

可以将系统分配的托管服务标识添加到 AAD 组吗?

系统分配的托管标识的 Azure ARM 角色分配第一次运行失败

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