繁体   English   中英

不能与.Net Core App中的Azure Blob存储一起使用

[英]Can't work with Azure Blob Storage from .Net Core App

我想使用Azure Blob存储来保存一些文件。

对于每个文件,我都有一个提交日期,我也想用它来创建一个容器。 所以我可以按提交日期整理文件。

我可以访问Blob存储并创建容器。

但是我无法在容器上设置权限,测试其中是否存在特定的Blob或将Blob添加到容器中。

我想念什么?

我在每种情况下得到的innerException是:

{Microsoft.WindowsAzure.Storage.StorageException:该请求无权执行此操作。

在Microsoft.WindowsAzure.Storage.Core.Executor.Executor。<ExecuteAsyncInternal> d__4`1.MoveNext()

---从之前引发异常的位置开始的堆栈结束跟踪---

在System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()

在System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)

在Microsoft.WindowsAzure.Storage.Blob.CloudBlobContainer。<> c__DisplayClass64_0。<< SetPermissionsAsync> b__0> d.MoveNext()

索取资料

请求ID:XXXXXX

RequestDate:XXXXXX

StatusMessage:此请求无权执行此操作。

错误代码:AuthorizationFailure

错误消息:该请求无权执行此操作。

请求ID:XXXXXX

时间:XXXXXX

}

显然是AuthorizationFailure,如它所说。 但是我可以访问Blob存储并创建一个容器。 那有什么呢?

这是完整的.Net Core 2测试程序(减去一些修改)

using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using System;

namespace AzureStorageTestApp
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var storageAccount = GetStorageAccount();

            var policy = new SharedAccessAccountPolicy()
            {
                Permissions = SharedAccessAccountPermissions.Read | SharedAccessAccountPermissions.Write | SharedAccessAccountPermissions.List,
                Services = SharedAccessAccountServices.Blob | SharedAccessAccountServices.File,
                ResourceTypes = SharedAccessAccountResourceTypes.Service | SharedAccessAccountResourceTypes.Container,
                SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15),
                SharedAccessExpiryTime = DateTime.UtcNow.AddHours(24),
                Protocols = SharedAccessProtocol.HttpsOnly
            };

            var sasToken = storageAccount.GetSharedAccessSignature(policy);

            var creds = new StorageCredentials(sasToken);

            var accountWithSAS = new CloudStorageAccount(creds, storageAccount.Credentials.AccountName, null, true);
            var blobClient = accountWithSAS.CreateCloudBlobClient();

            var containerName = DateTime.UtcNow.ToString("yyyy-MM-dd");
            var container = blobClient.GetContainerReference(containerName);
            if (container.CreateIfNotExistsAsync().Result)
            {
                var perms = new BlobContainerPermissions
                {
                    PublicAccess = BlobContainerPublicAccessType.Blob
                };

                // Blows up here
                container.SetPermissionsAsync(perms).Wait();
            }

            var fileName = "testfile.txt";
            var fileData = "some file data";
            var blob = container.GetBlockBlobReference(fileName);

            bool shouldUpload = true;
            // Blows up here
            var blobExists = blob.ExistsAsync().Result;
            if (blobExists)
            {
                blob.FetchAttributesAsync().Wait();
                if (blob.Properties.Length == fileData.Length)
                {
                    shouldUpload = false;
                }
            }

            if (shouldUpload)
            {
                // Blows up here
                blob.UploadTextAsync(fileData).Wait();
            }
        }

        private static CloudStorageAccount GetStorageAccount()
        {
            var connectionString = "DefaultEndpointsProtocol=https;AccountName=<Redacted>;AccountKey=<Redacted>;EndpointSuffix=core.windows.net";

            return CloudStorageAccount.Parse(connectionString);
        }
    }
}

好的,这就是“答案”。

如果您使用通过SharedAccessAccountPolicy(而不是实际凭据)设置的CloudStorageAccount,则该CloudStorageAccount仅可用于存储帐户管理本身。

因此,例如,您可以创建一个Blob容器,但不能在该容器上设置权限,因为这将需要适当创建的SharedAccessBlobPolicy或实际凭据。

到目前为止,我的答案是扔掉我为使用SharedAccessAccountPolicy而设置的所有内容,最后以以下代码结束:

        var storageAccount = GetStorageAccount();

        var blobClient = storageAccount.CreateCloudBlobClient();

同一个故事-它只是不起作用(由于auth错误而失败)。

CloudStorageAccount.Parse与BLOB连接字符串一起使用:

CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=***;AccountKey=***;EndpointSuffix=core.windows.net");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM