不带帐户 key 的 Azure 存储连接字符串 - 公共(public)容器

标签 azure storage blob acl

我有一个 Blob 容器,其 ACL 设置为允许完全公共(public)读取访问权限,以便任何人都可以读取并列出该容器中的 Blob。

我存储这些文件,以便我的客户使用的 WPF 客户端应用程序可以读取它们,但我不想允许他们修改/删除/创建文件。

有谁知道在这种情况下应该使用什么连接字符串?

我希望指定没有帐户 key 和/或共享访问 key 的连接字符串,因为 blob 是公共(public)的,但这不起作用 - StorageAccount.Parse 抛出 FormatException

最佳答案

正如前面的答案所提到的,最佳实践通常是使用共享访问签名 (SAS) 或存储的访问策略来控制对 Blob 容器的访问。这些可用于创建一个访问 token (字符串),您可以将其传递给您的客户,而无需透露您的帐户 key 。

但是,还可以指定对容器中保存的 blob 和元数据的公共(public)读取访问级别。公共(public)访问是自动授予拥有容器或 blob 的公共(public)访问 URL 的匿名用户的读取权限级别。您不能使用公共(public)访问权限向匿名用户授予对容器的写入权限。如果您需要向不拥有 Azure 存储帐户的帐户 key 的用户授予写入权限,那么您需要向这些用户提供 URL 形式的 token ,该 token 引用共享访问签名或共享访问策略。 如果对 Blob 容器的公共(public)访问当前未关闭(私有(private)),则匿名用户将能够使用公共(public)访问 URL 读取容器中的所有 Blob,如下所示。

http://grassy.blob.core.windows.net/container1/image2.jpg

创建容器时,可以将 publicAccess 属性的值设置为 BlobContainerPublicAccessType 枚举的相应常量。 publicAccess 属性的值可以是以下三个常量之一,它们指定公共(public)读取访问级别。

• BLOB – 公众可以读取此容器内 Blob 的内容和元数据,但无法读取容器元数据或列出容器内的 Blob。

• 容器 – 公众可以读取 blob 内容和元数据以及容器元数据,并且可以列出容器内的 blob。

• OFF – 指定无公共(public)访问。只有帐户所有者才能读取此容器中的资源。

因此,在这种情况下,公共(public)访问级别可能会设置为 CONTAINER。例如:

public static void main(String[] args) throws InvalidKeyException, URISyntaxException, StorageException 
   {            
   Account creds = new Account();               
   final String storageConnectionString = creds.getstorageconnectionstring();
   CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
   CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
   CloudBlobContainer container = blobClient.getContainerReference("container1");
   container.createIfNotExist();
   BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
   containerPermissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);
   container.uploadPermissions(containerPermissions);
   BlobContainerPublicAccessType access1 = containerPermissions.getPublicAccess();
   System.out.println("Public access to " + container.getName() + " is set to: 
      " + access1);
  }

如果container1上的公共(public)访问级别已设置为CONTAINER,则匿名用户应该能够列出container1中的blob,只需要知道存储帐户AccountName(“grassy”)和容器名称,但不需要知道帐户 key 。例如,匿名应用程序可能使用类似于以下内容的 java 代码:

public static void main(String[] args) throws InvalidKeyException, URISyntaxException, StorageException, FileNotFoundException, IOException 
   {            
   URI baseuri = new URI("http://grassy.blob.core.windows.net");
   CloudBlobClient blobclient = new CloudBlobClient(baseuri);
   CloudBlobContainer container = blobclient.getContainerReference("container1");   
      for (ListBlobItem blobItem : container.listBlobs()){System.out.println(blobItem.getUri());}   
   }

但是,正如所讨论的,最好避免向匿名用户授予访问权限。相反,使用 SAS 或策略控制对容器的访问,并将 token 仅传递给已知用户。

关于不带帐户 key 的 Azure 存储连接字符串 - 公共(public)容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16408068/

相关文章:

php - cakephp 什么时候太多了?

python - 在 Azure Devops 中创建 pull 请求(使用 REST API)不会链接工作项

azure - 将 Web 应用程序发布到 Azure

python - 将 Excel 工作表读入 Spark 数据框 - 包问题

go - Go中的超时结构

linux - 在 Linux 中使用仅限 CLI 的工具生成磁盘使用情况图/图表

能否用C知道运行时是否对磁盘进行了文件操作?

javascript - Cypress ,响应主体为 BLOB 而不是 JSON,但 chrome devtools 中的 JSON

csv - Azure 机器学习 Web 服务无法从 blob 读取 CSV

javascript - 获取传递给 Apps 脚本中 e.parameter 的 Blob 的字符串值