无法从.Net Core App

时间:2017-12-13 02:41:19

标签: c# azure-storage .net-core-2.0

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

对于每个文件,我都有一个提交日期,我也想用它来创建一个Container。所以我可以按提交日期组织文件。

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

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

我错过了什么?

我遇到的每一个内部异常都是:

  

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

     

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

     

---抛出异常的前一个位置的堆栈跟踪结束---

     

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

     

at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task   任务)

     

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

     

请求信息

     

请求ID:XXXXXX

     

RequestDate:XXXXXX

     

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

     

错误码:AuthorizationFailure

     

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

     

的requestId:XXXXXX

     

时间:XXXXXX

     

}

显然是AuthorizationFailure,因为它说。但我可以访问Blob存储并创建一个Container。那是什么给出了什么?

这里是完整的.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);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

好的,这就是“答案”。

如果您使用的是使用SharedAccessAccountPolicy(而非实际凭据)设置的CloudStorageAccount,则该CloudStorageAccount只能用于存储帐户管理。

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

到目前为止,我的答案是抛弃我设置的所有东西以使用SharedAccessAccountPolicy,最后在开始时使用以下代码:

        var storageAccount = GetStorageAccount();

        var blobClient = storageAccount.CreateCloudBlobClient();

答案 1 :(得分:0)

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

对BLOB连接字符串使用CloudStorageAccount.Parse

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