如何以编程方式找出我可以在 blob 存储中执行哪些操作?

How to programmatically find out what operations I can do in a blob storage?

我正在使用库 Microsoft.Azure.Storage.Blob 11.2.3.0 and Microsoft.Azure.Storage.Common 11.2.3.0 从 .NET Core 3.1 应用程序连接到 Azure BlobStorage。

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


现在,我正在使用 SAS 连接 BlobStorage 容器。 虽然我可以像这样在容器内自由检索和上传 blob,但不幸的是,我似乎不是允许在容器级别上做 任何事情。不仅 CreateIfNotExists,甚至 Exists() 对存在的简单查询也会引发 StorageException 说法

This request is not authorized to perform this operation.

文档没有提到异常。

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

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

我能看到的唯一其他选择是检查 try-catch- 块中的容器是否存在,并在抛出异常时假定存在...

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

您需要为您的 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);
        

输出

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

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

等属性

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

请参阅这些表格以了解 permissions/allowed 操作组合:

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