我想使用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);
}
}
}
答案 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");