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

我如何授权多个客户端应用程序访问我的Azure存储资源?,azure,azure-active-directory,identity,rbac,Azure,Azure Active Directory,Identity,Rbac,我正在构建一个NodeJS应用程序,它运行在不同客户端的本地硬件上。 我希望该应用程序将数据记录到我的Azure存储表中。 (将来,应用程序可能需要使用其他Azure服务。) 我应该如何授权应用程序的各个实例访问我的表 我希望将每个不同的客户机限制在不同的表中,并且只具有添加和读取访问权限—不进行更新或删除 如果需要的话,我希望能够在不影响其他客户的情况下,立即撤销单个客户的访问权限 我考虑了3种选择: 我考虑为每个客户端创建一个单独的存储帐户,并为客户端提供该帐户的访问密钥。但这将提供完全访

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

我希望将每个不同的客户机限制在不同的表中,并且只具有添加和读取访问权限—不进行更新或删除

如果需要的话,我希望能够在不影响其他客户的情况下,立即撤销单个客户的访问权限

我考虑了3种选择:

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

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

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

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

但在Azure中,我的组织有一个Active Directory,我不是该目录的管理员。我不知道如何在没有管理员身份的情况下创建Azure用户来访问我的表


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

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

当前不支持对Azure表的身份验证访问。Azure广告集成仅可用于预览中的Blob队列服务


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

我在中查找有关如何从节点使用SAS的确切信息时遇到一些困难,因此我认为在此处发布我的代码示例以供参考可能很有用

我采取的步骤是:

  • 创建了一个新的存储帐户(使用Azure portal)。按照@TomSun的建议,我将为每个客户端使用一个单独的存储帐户
  • 在帐户内创建了一个新表。我下载并使用Microsoft Azure Storage Explorer执行此操作和其余步骤。门户中可用的存储资源管理器还不能处理表,只能处理blob、文件和队列
  • 已在表上创建访问策略。(右键单击表格,选择管理访问策略…)
  • 创建共享访问签名。(右键单击表,选择获取共享访问签名…,选择上面创建的策略
  • 复制生成的URL和查询字符串,以便在下面的代码中引用。请注意,URL包含查询字符串
  • 在我电脑上的新文件夹中,运行
    npm init
    设置节点项目
  • npm安装azure存储
    以下载库
  • 创建一个名为
    index.js
    的文件,其内容如下所示
  • node index.js
    来运行代码
  • 请注意,在下面的代码中,我已经修改了我的帐户、表、sasToken等的名称。不要期望它仅用于复制和粘贴

    const azure=require('azure-storage');
    康斯特萨苏里酒店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);
    常数项={
    PartitionKey:{''''.'keyvalue'},
    RowKey:{“uuuz”:“2018-10-10T03:17:21Z”},
    Col1:{'':23},
    Col2:{''''':423}
    };
    tableService.insertEntity('mytable',项,函数(错误,结果,响应){
    如果(错误){
    控制台错误(err);
    }否则{
    console.log('success');
    log('result='+JSON.stringify(result,null');
    log('response='+JSON.stringify(response,null');
    }
    });
    

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

    不要忘记,如果SAS(如我的示例中所示),那么它在存储在Windows环境变量中时需要转义(加倍)。
    sv=2018-03-28&si=saspolicy&tn=mytable&sig=1%%2FgfWd…
    I收回上面的注释。在使用chocolate
    refreshenv
    命令之前,环境变量中的字符是可以的。