如何授权多个客户端应用程序访问我的 Azure 存储资源?

How do I authorise multiple client applications to access my Azure storage resources?

我正在构建一个在不同客户端的本地硬件上运行的 Node JS 应用程序。 我希望该应用程序将数据记录到我的 Azure 存储 tables。 (将来,应用程序可能需要使用其他 Azure 服务。) 我应该如何授权我的应用程序的各个实例访问我的 tables?

我希望将每个不同的客户端限制为不同的 tables,并且只有添加和读取权限 - 没有更新或删除。

如果需要,我希望能够立即撤销单个客户端的访问权限,而不影响其他客户端。

我考虑了 3 个选项:

在 AWS 中,我通过创建 IAM 用户解决了这个问题。 Node JS 代码可以通过环境变量访问这些键。

但在 Azure 中,我的组织有一个 Active Directory,而我不是该目录的管理员。我不知道如何创建 Azure 用户来访问我的 tables 而不是管理员。

有没有人有什么想法或建议?

正如您提到的,每个 table 都没有 SAS 令牌。对于您的情况,我建议您可以为每个没有完全访问 SAS 令牌的客户端提供单独的存储帐户。

目前不支持验证对 Azure table 的访问权限。 Azure AD 集成可用于 BlobQueue 服务 only preview .

有关使用 Azure Active Directory(预览版)验证对 Azure blob 和队列的访问的更多信息,请参阅 Azure official document

我在查找有关确切如何在 documentation 中使用 Node 中的 SAS 的信息时遇到了一些困难,所以我认为它可能对 [=48] 有用=] 我的代码示例在这里供参考。

我遵循的步骤是:

  1. 创建了一个新的存储帐户(使用 Azure 门户)。我将按照@TomSun 的建议为每个客户使用一个单独的存储帐户。
  2. 在帐户中创建了一个新的 table。我下载并使用了 Microsoft Azure Storage Explorer 来执行此操作和其余步骤。门户中可用的存储资源管理器尚不能用于 tables - 仅适用于 blob、文件和队列。
  3. 在 table 上创建了访问策略。 (右键单击 table,选择管理访问策略...)
  4. 创建共享访问签名。 (右键单击 table,选择获取共享访问签名...,select 上面创建的策略。
  5. 复制结果 URL 和查询字符串以供在下面的代码中参考。请注意,URL 包含查询字符串。
  6. 在我电脑上的一个新文件夹中,运行 npm init 设置节点项目。
  7. npm install azure-storage 下载库。
  8. 创建一个名为 index.js 的文件,内容如下所示。
  9. node index.js 到 运行 代码。

请注意,在下面的代码中,我已经修改了我的帐户名称,table、sasToken 等。不要指望它只用复制和粘贴就可以工作!

const azure = require('azure-storage');
const sasUri = 'https://myaccount.table.core.windows.net/mytable';
const sasQuery = 'sv=2018-03-28&si=saspolicy&tn=mytable&sig=1%2FgfWdreRKfWpRjhRy3E8MiHDIxH35SPZY5ssU8lKw%3D';
const tableService = new azure.TableService(null,null,sasUri,sasQuery);
const item = {
  PartitionKey: {'_':'keyvalue'},
  RowKey: {'_':'2018-10-10T03:17:21Z'},
  Col1: {'_':23},
  Col2: {'_':423}
};
tableService.insertEntity('mytable',item,function(err,result,response){
  if (err) {
    console.error(err);
  } else {
    console.log('success');
    console.log('result = '+JSON.stringify(result,null,'  '));
    console.log('response = '+JSON.stringify(response,null,'  '));
  }
});

我的下一个挑战是找到描述实体中用于插入的 '_' 键的文档。看起来下划线用于值,$ 可以用于类型,尽管如果未指定类型则可以猜测。如果需要,有一个 entityGenerator function 来生成这些对象。