BLOB-объект Azure возвращает значение 403, запрещенное функцией Azure, запущенной на портале - PullRequest
0 голосов
/ 01 сентября 2018

Я прочитал несколько сообщений о похожих запросах, например , этот , но я продолжаю получать 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, обращаясь к хранилищу (не к эмулятору) в облаке, но когда он либо развернут, либо явно запущен на портале, он не запускается.

Что мне здесь не хватает?

1 Ответ

0 голосов
/ 03 сентября 2018

Поскольку вы исключили множество возможных причин, единственный способ воспроизвести вашу проблему - это настроить брандмауэр для учетной записи хранения.

Локально код работает так, как если бы вы добавили свой локальный IP-адрес в белый список, хотя этот шаг был пропущен для функции. На портале перейдите в Resource Explorer под функциями платформы. Найдите outboundIpAddresses и добавьте эти (обычно четыре) IP-адреса в белый список учетных записей хранения.

Если вы добавили IP-адреса функций, но все еще получаете ошибку 403, проверьте расположение приложения «Хранилище и функции». Если они живут в одном и том же регионе (например, в обоих центральных штатах США), двое общаются внутри страны, не проходя outboundIpAddresses. Обходной путь, который я могу предложить, - создать хранилище в другом регионе, если в вашем плане необходим брандмауэр. В противном случае просто разрешите все сети для хранения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...