1

我正在使用库Microsoft.Azure.Storage.Blob11.2.3.0 和Microsoft.Azure.Storage.Common11.2.3.0 从 .NET Core 3.1 应用程序连接到 Azure BlobStorage。

当我开始研究这个时,我得到了连接字符串,让我可以完全访问 BlobStorage(或者更确切地说,整个云存储帐户)。基于这些,我选择“防御性地”编写我的连接代码,利用Exists()CreateIfNotExists()CloudBlobContainer中确保应用程序在容器尚不存在时不会失败。


现在,我正在使用 SAS 连接 BlobStorage 容器。虽然我可以像这样在容器中自由地检索和上传 blob,但不幸的是,似乎不允许我在容器级别上做任何事情。不仅CreateIfNotExists如此,就连对存在的单纯质疑都会Exists()抛出一句StorageException谚语。

此请求无权执行此操作。

该文档未提及该异常。

有什么方法可以先发制人地检查我是否可以检查容器的存在吗?

我曾尝试查看从 检索到的容器权限GetPermissions,但这也会引发异常。

我能看到的唯一另一种选择是检查容器是否存在于try--block中catch,如果抛出异常则假定存在......

4

2 回答 2

2

除了执行该操作并捕获该操作可能引发的任何异常之外,没有确定的方法可以确定是否可以使用 SAS 令牌执行操作。您感兴趣的例外是Unauthorized (403).

但是,您可以尝试通过查看 SAS 令牌来预测是否可以执行操作。如果是 aService SAS Token而不是 a Account SAS Token,则表示不允许所有与帐户相关的操作。区分 Account SAS 令牌和 Service SAS 令牌的方法是前者将包含 和 之类的SignedServices (ss)属性SignedResourceTypes (srt)

接下来您要做的是SignedPermissions (sp)在您的 SAS 令牌中查找属性。此属性将告诉您使用 SAS 令牌可以进行的所有操作。例如,如果您的 SAS 令牌是服务 SAS 令牌并且它包含Delete (d)权限,则意味着您可以使用此 SAS 令牌删除 blob。

请参阅这些表以了解权限/允许的操作组合:

请注意,由于 SAS 令牌已过期、自 SAS 令牌生成后帐户密钥已更改、IP 限制等多种原因,操作仍可能失败。

于 2021-11-26T10:59:30.247 回答
0

我尝试在我的系统中检查容器是否存在,如果容器不存在,则创建容器并能够上传文件。

您需要为您的 SAS 令牌提供适当的权限

在此处输入图像描述

const string sasToken = “SAS Token”

            const string accountName = "teststorage65";
            const string blobContainerName = "example";
            const string blobName = "test.txt";
            const string myFileLocation = @"Local Path ";

            var storageAccount = new CloudStorageAccount(storageCredentials, accountName, null, true);
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = blobClient.GetContainerReference(blobContainerName);
            var result=blobContainer.Exists();
            if (result == true)
            {
                Console.WriteLine("Container exists");
            }
            else
            {
               // blobContainer.CreateIfNotExists();
                Console.WriteLine("Conatiner not exists");

               Console.WriteLine("Creating Container   "+ blobContainerName);
                blobContainer.CreateIfNotExists();
            }

               // blobContainer.CreateIfNotExists();
            //Console.WriteLine("Creating Container   ");
            CloudBlockBlob cloudBlob = blobContainer.GetBlockBlobReference(blobName);
            cloudBlob.UploadFromFile(myFileLocation);
        

输出

在此处输入图像描述

在此处输入图像描述

于 2021-11-26T10:16:20.397 回答