Функция Azure не передает файл в хранилище BLOB-объектов с использованием удостоверения, назначенного пользователем.

Добавлен пользовательский идентификатор в приложении-функции и в учетной записи хранения BLOB-объектов в качестве роли «Участник данных BLOB-объектов хранилища». Код отлично работает с добавлением исходящего IP-адреса приложения-функции в учетной записи хранения. Но хотите использовать идентификацию, назначенную пользователем.

Я получаю сообщение об ошибке «Произошла одна или несколько ошибок. (Этот запрос не авторизован для выполнения этой операции.)»

Кто-нибудь раньше сталкивался с этой проблемой? Заранее цените вашу помощь.

            StorageCredentials storageCredential = new StorageCredentials(AccountName, AccessKey);
            CloudStorageAccount storageAccount = new CloudStorageAccount(storageCredential, true);

            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer blobContainer = blobClient.GetContainerReference("rawzone");
            BlobRequestOptions requestOptions = new BlobRequestOptions() { RetryPolicy = new NoRetry() };
            CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("test");

            string result = "writing test file " + DateTime.Now.ToString();
            blockBlob.UploadTextAsync(result).Wait();

person Prakash G    schedule 18.06.2020    source источник


Ответы (1)


Я тестирую на своем сайте, и он работает очень хорошо. Вы можете обратиться к следующим шагам, чтобы сделать это.

1.Создайте мой управляемый идентификатор, назначенный пользователем, и добавьте к нему Storage Blob Data Contributor.

введите описание изображения здесь

2. В функции Azure включите управляемое удостоверение, назначаемое пользователем, и добавьте ранее созданное удостоверение пользователя.

3. В лазурной функции HTTP-триггер и следующий код в функции, который будет использовать идентификацию, управляемую пользователем. В предоставленном вами коде используются учетные данные хранилища, и он всегда будет работать нормально.

AzureServiceTokenProvider azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://storage.azure.com/");
TokenCredential tokenCredential = new TokenCredential(accessToken);
StorageCredentials storageCredentials = new StorageCredentials(tokenCredential);
CloudBlobClient blobClient = new CloudBlobClient(new Uri("https://xxxxx.blob.core.windows.net"), storageCredentials);

CloudBlobContainer blobContainer = blobClient.GetContainerReference("container");
BlobRequestOptions requestOptions = new BlobRequestOptions() { RetryPolicy = new NoRetry() };
CloudBlockBlob blockBlob = blobContainer.GetBlockBlobReference("hello.txt");

string result = "writing test file " + DateTime.Now.ToString();
blockBlob.UploadTextAsync(result).Wait();

4. Для управления процессом используйте строку подключения, переданную конструктору AzureServiceTokenProvider или указанную в _ 4_ переменная среды.

Щелкните идентификатор пользователя и получите его идентификатор приложения.

RunAs=App;AppId={ClientId of user-assigned identity}

введите описание изображения здесь

5.Затем запустите функцию azure, и она запишет текст в большой двоичный объект.

введите описание изображения здесь

person Joey Cai    schedule 22.06.2020
comment
Спасибо @Joey Cai за внимание к моей проблеме. Ваш код отлично работает, если для учетной записи хранения не настроен брандмауэр. Вы пробовали использовать параметр Вся сеть или Выбранная сеть в брандмауэрах и виртуальных сетях учетной записи хранения? Он отлично работает только с настройкой All Network. Требуется ли наличие удостоверения, приложения-функции и учетной записи хранения в одной подписке или в одном месте? - person Prakash G; 22.06.2020
comment
Я получаю токен доступа, но он выдает ту же ошибку в blockBlob.UploadTextAsync (result) .Wait (); Моя личность имеет доступ только к участнику Storage Blob Data Contributor. Еще раз благодарим вас за внимание к этому вопросу. - person Prakash G; 22.06.2020
comment
Я также установил флажок для исключения «Разрешить доверенным службам Майкрософт доступ к этой учетной записи хранения» в настройке «Выбранная сеть». - person Prakash G; 22.06.2020
comment
Почему вы хотите использовать брандмауэр? Вы хотите, чтобы только функциональное приложение могло получить доступ к хранилищу Azure? - person Joey Cai; 23.06.2020
comment
Это политика организации. Только ресурсы в виртуальной сети должны иметь доступ к учетной записи хранения. Они говорят с исключением: Разрешить доверенным службам Microsoft доступ к этой учетной записи хранения. У вас должен быть доступ к учетной записи хранения. - person Prakash G; 23.06.2020
comment
См. Эту статью. - person Joey Cai; 24.06.2020
comment
Служба функций Azure не указана в списке доверенных служб Майкрософт для доступа к учетной записи хранения с использованием системной управляемой идентификации. Это означает, что функция azure не предусмотрена для доступа к учетной записи хранения с включенным брандмауэром. - person Prakash G; 24.06.2020
comment
Да, функция Azure в нее не входит. - person Joey Cai; 25.06.2020
comment
Если это вам поможет, примите это как ответ. Установите флажок и сделайте его зеленым. Спасибо. - person Joey Cai; 25.06.2020