Невозможно загрузить / загрузить хранилище BLOB-объектов в контейнер из локальной среды. - PullRequest
1 голос
/ 17 января 2020

У меня есть приложение для выхода из функций, которое позволяет загружать файл из sftp, обрабатывать его и загружать в хранилище BLOB-объектов. Это приложение функций уже развернуто в azure и работает правильно. Однако, когда я запускаю то же самое из Visual Studio (локально), я получаю ошибку при загрузке файла в хранилище BLOB-объектов.

Microsoft. Azure .Storage.StorageException: этот запрос не авторизован для выполнения этой операции с использованием это разрешение.

Я убедился, что этому приложению назначена необходимая роль участника в учетной записи хранения (поэтому он работает с azure). Есть ли другие параметры, которые мне нужно настроить в локальных настройках или настройках проекта, чтобы эти функции работали так же, как при развертывании в azure? Или могут быть какие-либо настройки в учетной записи хранения, которые переопределяют операции загрузки при запуске из dev, но запускаются только с azure?

Я убедился, что использую локальные настройки, все они скопированы из конфигурации приложения, которая имеет имена учетных записей хранения, строка подключения хранилища больших двоичных объектов, URL-адрес sftp и имя хранилища ключей с учетными данными sft site et c.,

Обновление: Забыл упомянуть, что этот контейнер хранения az Команда загрузки из командной строки с моей машины успешно загрузила файл.

update2: Согласно предложенному мной, я следовал учебнику , и мне удалось создать контейнер, загрузить BLOB-объект и выполнить очистку без ошибок. Затем я объединил код для имитации простого большого двоичного объекта загрузки в поток памяти, который также выдает ошибку

Этот запрос не авторизован для выполнения этой операции с использованием этого разрешения (см. Полный журнал внизу)

Код для загрузки BLOB-объекта:

static async Task TokenCredentialsSample()
{
    var tenantId = "xxxxx-xxxx-xxxx-xxxx-xxxxxxxx";
    var tokenProvider = new AzureServiceTokenProvider().GetAccessTokenAsync("https://storage.azure.com/",tenantId);
    var tokenCredential = new TokenCredential(tokenProvider.Result);
    var storageCredentials = new StorageCredentials(tokenCredential);
    var uri = new Uri("https://mystorageaccount.blob.core.windows.net/mycontainer/inbound/myfile.csv");

    var cloudBlockBlob = new CloudBlockBlob(uri, storageCredentials);

    var memoryStream = new MemoryStream();

    cloudBlockBlob.DownloadToStream(memoryStream); // Error here
    memoryStream.Position = 0;
    memoryStream.Close();

}

Я также убедился, что набрал az логин из командной строки, чтобы переключиться, чтобы выбрать правильную подписку, а также выбран аккаунт в параметрах Visual Studio.

Журнал ошибок:

Microsoft. Azure .Storage.StorageException HResult = 0x80131500 Сообщение = Этот запрос не авторизован для выполнения этой операции с использованием это разрешение. Источник = Microsoft. Azure .Storage.Common StackTrace: в Microsoft. Azure .Storage.Core.Executor.Executor.d__1 1.MoveNext() at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at System.Runtime.CompilerServices.TaskAwaiter 1.GetResult () в Microsoft. Azure .Storage.Core.Executor. Executor. <> C__DisplayClass0_0 1.<ExecuteSync>b__0() at Microsoft.Azure.Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext[T](Func 1 actionToRun) в Microsoft. Azure .Storage.Core.Executor.Executor.ExecuteSync [T] (RESTCommand 1 cmd, IRetryPolicy policy, OperationContext operationContext) at Microsoft.Azure.Storage.Blob.CloudBlob.DownloadRangeToStream(Stream target, Nullable 1 смещение, длина Nullable`1, AccessCondition accessCondition, параметры операции BlobRequestOptions, параметры операции BlobRequestOptions, operationContext) в Microsoft. Azure .Storage.Blob.CloudBlob.DownloadToStream (Цель потока, AccessCondition accessCondition, параметры BlobRequestOptions, OperationContext operationContext) в BlobStorage.Program.d__2.MoveNext () в c: ... \ source \ source \ repos \ BlobStorage \ Program.cs: строка 111 в System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача-задача) в System.Runtime.CompilerServices.Service-задача-запрос-приемник (для задачи). в System.Runtime.CompilerServices.TaskAwaiter.GetResult () в Bl obStorage.Program.d__0.MoveNext () в c: ... \ source \ repos \ BlobStorage \ Program.cs: строка 19

Это исключение было изначально сгенерировано в этом стеке вызовов: Microsoft. Azure .Storage.Core.Executor.Executor.ExecuteAsyn c (Microsoft. Azure .Storage.Core.Executor.RESTCommand, Microsoft. Azure .Storage.RetryPolicies.IRetryPolicy, Microsoft. Azure .Storage.OperationContext , System.Threading.CancellationToken) System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw () System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (System.Threading.Tasks.Task) System.Runtime. Tasks.Task) System.Runtime.CompilerServices.TaskAwaiter.GetResult () Microsoft. Azure .Storage.Core.Executor. Executor.ExecuteSyn c .AnonymousMethod__0 () Microsoft. Azure .Storage.Core.Util.CommonUtility.RunWithoutSynchronizationContext (System.Fun c) Microsoft. Azure .Storage.Core.Executor.Executor.Ex64teSynx * (Microsoft. Azure .Storage.Core.Executor.RESTCommand, Microsoft. Azure .Storage.RetryPolicies.IRetryPolicy, Microsoft. Azure .Storage.OperationContext) Microsoft. Azure .Storage.Blob.CloudBlob. DownloadRangeToStream (System.IO.Stream, long ?, long ?, Microsoft. Azure .Storage.AccessCondition, Microsoft. Azure .Storage.Blob.BlobRequestOptions, Microsoft. Azure .Storage.OperationContext) Microsoft. Azure .Storage.Blob.CloudBlob.DownloadToStream (System.IO.Stream, Microsoft. Azure .Storage.AccessCondition, Microsoft. Azure .Storage.Blob.BlobRequestOptions, Microsoft. Azure .Storage.OperationContext) .. . [Стек вызовов сокращен]

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

1) Я вижу, что вы возвращаете Task из вашего метода, но не await ничего.
Полезно добавлять ключевое слово 'async` в сигнатуру метода и измените следующий код:

var tokenProvider = new AzureServiceTokenProvider().GetAccessTokenAsync("https://storage.azure.com/",tenantId);

на что-то вроде:

var tokenProvider = new AzureServiceTokenProvider();
var token = await tokenProvider.GetAccessTokenAsync("https://storage.azure.com/",tenantId);
var tokenCredential = new TokenCredential(token );

Теперь, получите токен доступа, вы можете использовать инструмент, такой как http://jwt.io и взломать он открывает и проверяет заявки.

2) Попытка изменить токен доступа с:

GetAccessTokenAsync("https://storage.azure.com/",tenantId);

на:

GetAccessTokenAsync("https://[youraccount].blob.core.windows.net",tenantId);

3) AzureServiceTokenProvider будет искать учетные данные в наборе предопределенных мест.

Документация AzureServiceTokenProvider стоит прочитать, чтобы помочь в устранении неполадок.
Вы пытались использовать первый вариант передачи RunAs=Developer; DeveloperTool=AzureCli в качестве строки подключения, поэтому он явно знает, где посмотреть?

Итак, из того же командного окна, где вы выполнили azure cli и сделали что-то вроде azure login, вы пытались запустить консольную программу оттуда?

Какие подписка вы вошли в систему? az account list
У вас есть много подписок?
Возможно, ваша подписка по умолчанию не та, с которой вы пытаетесь получить доступ к BLOB-объекту.

0 голосов
/ 02 марта 2020

OK. Я нашел решение.

Я нашел эту статью , в которой четко указано в примечании, что роль Data Reader или Data Contributor является обязательной! Ни один из документов MS, таких как this , не подчеркивал важность дополнительной роли (Data Reader / Data Contributor), как в статье.

Обратите внимание, что недостаточно , если ваш пользователь является владельцем / вкладчиком в подписке / группе ресурсов / учетной записи хранения. Пользователю необходимо назначить роль «Читатель данных» или «Участник данных», чтобы получить доступ к данным с использованием Azure аутентификации AD.

Мы предположили, что участника было достаточно, но это не так.

...