您可以为同一容器中的 Azure Blob 设置 public / 私有读取访问权限吗?

Can you set public / private read access for azure blobs in the same container?

Azure 文档说可以使用 public 或私有读取权限 (see here) 创建存储 blob 容器。这表示 public 访问权限可以设置为 'Container' 或 'Blob',并解释了 table.

中的差异

但是,尚不清楚是否已将容器设置为 Blob 级别 public 访问权限:

container.CreateIfNotExists(Azure.Storage.Blobs.Models.PublicAccessType.Blob);

这意味着 public 读取访问是逐个 blob 设置的,如果是这样,如何设置它。

但是,我不确定这是真的吗?我看过其他各种关于在不同 public/private 容器之间复制 blob 的帖子,这在某种程度上支持了我的想法。客户端创建似乎没有 public/private 设置:

BlobClient blobClient = container.GetBlobClient(filename);

...并使用上述编码,然后创建的所有 blob 都具有 public 访问权限。

我的问题是我需要允许用户将上传的状态 images/videos 更改为 public 或私有。我想知道是否有比在私有容器和 public 容器之间移动 blob 更简单的方法..?

Public访问是容器级别的设置。 public 访问有两个选项:https://docs.microsoft.com/en-us/azure/storage/blobs/anonymous-read-access-configure?tabs=portal#set-the-public-access-level-for-a-container.

  • Public 仅对 blob (Blob) 进行读取访问:匿名请求可以通过完整 URL 获取 blob(调用者必须知道容器和 blob 名称)
  • Public 容器及其 ​​blob (Container) 的读取权限:匿名请求可以获得容器的 blob 列表(调用者必须只知道容器名称)

所以我会说是的,你要么必须在容器之间移动它们,要么在你这边处理授权。

您的假设是正确的,访问级别是在容器上定义的。

要解决您的问题,我建议使用共享访问签名授予对所有 blob 的访问权限。这样您的应用程序逻辑就可以控制访问,但所有下载仍然直接从 blob 存储中进行。

执行此操作的正确方法是在将用户重定向到包含共享访问签名的 blob url 之前,通过您的应用程序逻辑代理所有请求。这样您以后就可以撤销 link。

示例流程如下所示:

  1. 用户权限https://example.com/images/myimage.png
  2. 应用程序逻辑确定“images/myimage.png”是否应允许匿名访问或用户是否应重定向到登录
  3. 如果允许访问,应用程序会在 blob 存储中找到正确的 blob,并生成 SAS 签名
  4. 然后用户被重定向到“https://example.blob.core.windows.net/images/myimage.png?sastokenstuffhere