我有一个 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/