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

时间:2018-10-09 01:37:49

标签: azure azure-active-directory identity access rbac

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

我希望每个不同的客户端只能使用不同的表,并且只能进行添加和读取访问-不能进行更新或删除。

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

我考虑了3个选择:

  • 我考虑为每个客户端创建一个单独的存储帐户,并为客户端提供该帐户的访问密钥。但这将提供完全访问权限(包括更新和删除)。

  • 我考虑过为每个客户端创建一个存储访问策略(SAP),然后在该策略上创建一个共享访问签名(SAS)。客户端可以与共享访问签名(as described here)连接。我看到的主要缺点是,如果我希望客户端的应用程序可以访问多个表,则每个表都需要一个单独的SAP和SAS。这会增加管理开销。

  • 由于应用是身份的另一种形式,因此我考虑使用registering an app为软件的每个实例创建一个身份。但是我不确定如何(a)使应用程序将凭据传递到Azure存储,或(b)授予该应用程序读取/添加到表的权限。

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

但是在Azure中,我的组织有一个Active Directory,但我不是该目录的管理员。我没有看到如何创建Azure用户而不以管理员身份访问表的目的。

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

2 个答案:

答案 0 :(得分:2)

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

当前不支持对Azure表的身份验证访问。 预览中 Blob Queue 服务可以使用Azure AD集成。

有关使用Azure Active Directory(预览版)对Azure Blob和队列的访问进行身份验证的详细信息,请参考Azure official document

答案 1 :(得分:0)

documentation的Node中找到有关确切地如何使用SAS的信息时,我遇到了一些麻烦,因此我认为在此处发布代码示例以供参考可能很有用。

我遵循的步骤是:

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

请注意,在下面的代码中,我已经修改了我的帐户,表,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生成这些对象。