[英]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.