Я прочитал несколько сообщений о похожих запросах, например , этот , но я продолжаю получать 403.
Сначала я написал код в Visual Studio - функцию Azure, обращающуюся к хранилищу больших двоичных объектов - и все работает нормально. Но когда я использую ту же самую функцию, она выдает 403! Я попытался предложить, перейти на x64 и т. Д. И удалить дополнительные файлы, но ничего не работает.
Обратите внимание - я проверял несколько раз - ключ доступа правильный и действительный .
Итак, я сделал все следующее
(1) - я написал простую функцию Azure на самом Portal (чтобы исключить причуды развертывания) и вуаля, те же 403!
var storageConnection = "DefaultEndpointsProtocol=https;AccountName=[name];AccountKey=[key1];EndpointSuffix=core.windows.net";
var cloudStorageAccount = CloudStorageAccount.Parse(storageConnection);
var blobClient = cloudStorageAccount.CreateCloudBlobClient();
var sourceContainer = blobClient.GetContainerReference("landing");
CloudBlockBlob blob = container.GetBlockBlobReference("a.xlsx");
using (var inputStream = new MemoryStream())
{
log.Info($"Current DateTime: {DateTime.Now}");
log.Info("Starting download of blob...");
blob.DownloadToStream(inputStream); // <--- 403 thrown here!!
log.Info("Download Complete!");
}
(2) - я проверил дату и время, зарегистрировав его и его UTC на сервере функций
(3) - я использовал ключ учетной записи SAS, сгенерированный на портале, но все равно выдающий 403. Я ждал более 30 секунд после генерации ключа SAS, чтобы обеспечить распространение ключа SAS.
var sasUri = "https://[storageAccount].blob.core.windows.net/?sv=2017-11-09&ss=b&srt=sco&sp=rwdlac&se=2019-07-31T13:08:46Z&st=2018-09-01T03:08:46Z&spr=https&sig=Hm6pA7bNEe8zjqVelis2y842rY%2BGZg5CV4KLn288rCg%3D";
StorageCredentials accountSAS = new StorageCredentials(sasUri);
var cloudStorageAccount = new CloudStorageAccount(accountSAS, "[storageAccount]", endpointSuffix: null, useHttps: true);
// rest of the code same as (1)
(4) - я сгенерировал ключ SAS на лету в коде, но снова 403.
static string GetContainerSasUri(CloudBlobContainer container)
{
//Set the expiry time and permissions for the container.
//In this case no start time is specified, so the shared access signature becomes valid immediately.
SharedAccessBlobPolicy sasConstraints = new SharedAccessBlobPolicy();
sasConstraints.SharedAccessStartTime = DateTimeOffset.UtcNow.AddMinutes(-5);
sasConstraints.SharedAccessExpiryTime = DateTimeOffset.UtcNow.AddMinutes(25);
sasConstraints.Permissions = SharedAccessBlobPermissions.Write | SharedAccessBlobPermissions.Add | SharedAccessBlobPermissions.Create;
//Generate the shared access signature on the container, setting the constraints directly on the signature.
string sasContainerToken = container.GetSharedAccessSignature(sasConstraints);
//Return the URI string for the container, including the SAS token.
return container.Uri + sasContainerToken + "&comp=list&restype=container";
}
и использовал вышеуказанное как
var sourceContainer = blobClient.GetContainerReference("landing");
var sasKey = GetContainerSasUri(sourceContainer);
var container = new CloudBlobContainer(new Uri(sasKey));
CloudBlockBlob blob = container.GetBlockBlobReference("a.xlsx");
Я совершенно не понимаю, почему код работает безупречно при запуске из Visual Studio, обращаясь к хранилищу (не к эмулятору) в облаке, но когда он либо развернут, либо явно запущен на портале, он не запускается.
Что мне здесь не хватает?