Доступ к контейнеру Azure через Python SDK завершается сбоем из-за AuthorizationPermissionMismatch, но я являюсь владельцем

Я пытаюсь перечислить большие двоичные объекты в контейнере в службе хранилища Azure в сценарии Python с помощью Azure SDK.

Однако я получаю сообщение об ошибке «AuthorizationPermissionMismatch».

Это меня удивляет, потому что через графический интерфейс я могу просто так перечислить содержимое. Я владелец контейнера:

и я думаю, что я правильно понял весь код:

from azure.identity import DefaultAzureCredential
from azure.storage.blob import ContainerClient

if __name__ == "__main__":

    client = ContainerClient(
        credential=DefaultAzureCredential(),
        account_url = "https://satestblobaccess.blob.core.windows.net",
        container_name = "stcnt-test-blob-access"
    )

    blob_names = client.list_blob_names()
    print([b for b in blob_names])

Я запускаю это в PowerShell, пока я вошел в систему как я, и SDK, кажется, прекрасно распознает мою личность.

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

Вместо этого я получаю ошибку AuthorizationPermissionMismatch.

Было бы здорово, если бы кто-нибудь подсказал мне, как это исправить...

Вывод такой (извините за искажение, я не могу заставить его отображать разрывы строк, которые я вижу в окне вывода PowerShell):

[INFO azure.identity._credentials.environment] Конфигурация среды не найдена. ИНФОРМАЦИЯ:azure.identity._credentials.environment:Конфигурация среды не найдена. [INFO azure.identity._credentials.managed_identity] ManagedIdentityCredential будет использовать IMDS INFO:azure.identity._credentials.managed_identity:ManagedIdentityCredential будет использовать IMDS INFO:azure.core.pipeline.policies.http_logging_policy:URL-адрес запроса: 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=REDACTED&resource=REDACTED' Метод запроса: «GET» Заголовки запросов: «Агент пользователя»: «azsdk-python-identity/1.15.0 Python/3.10.13 (Windows-10-10.0.19045-SP0)» К запросу не было прикреплено тело DEBUG:urllib3.connectionpool:Запуск нового HTTP-соединения (1): 169.254.169.254:80 [INFO azure.identity._credentials.chained] DefaultAzureCredential получила токен от AzureCliCredential INFO:azure.identity._credentials.chained:DefaultAzureCredential получил токен от AzureCliCredential ИНФОРМАЦИЯ:azure.core.pipeline.policies.http_logging_policy:URL-адрес запроса: 'https://satestblobaccess.blob.core.windows.net/stcnt-test-blob-access?restype=REDACTED&comp=REDACTED' Метод запроса: «GET» Заголовки запросов: 'x-ms-версия': 'УДАЛЕНО' «Принять»: «приложение/xml» «Агент пользователя»: «azsdk-python-storage-blob/12.19.0 Python/3.10.13 (Windows-10-10.0.19045-SP0)» 'x-ms-date': 'УДАЛЕНО' 'x-ms-client-request-id': 'f729fa05-19dd-11ef-ae9a-a434d95f5cd9' «Авторизация»: «УДАЛЕНО» К запросу не было прикреплено тело ОТЛАДКА:urllib3.connectionpool:Запуск нового HTTPS-соединения (1): satestblobaccess.blob.core.windows.net:443 ОТЛАДКА:urllib3.connectionpool:https://satestblobaccess.blob.core.windows.net:443 "GET /stcnt-test-blob-access?restype=container&comp=list HTTP/1.1" 403 279 ИНФОРМАЦИЯ:azure.core.pipeline.policies.http_logging_policy:Состояние ответа: 403 Заголовки ответов: «Длина контента»: «279» «Тип контента»: «приложение/xml» «Сервер»: «Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0» 'x-ms-request-id': 'fc138e07-a01e-0062-75ea-ad615a000000' 'x-ms-client-request-id': 'f729fa05-19dd-11ef-ae9a-a434d95f5cd9' 'x-ms-версия': 'УДАЛЕНО' 'x-ms-код-ошибки': 'AuthorizationPermissionMismatch' «Дата»: «Пятница, 24 мая 2024 г., 14:57:44 по Гринвичу». Traceback (последний вызов последний): Файл «C:\Users\yrdeb\PycharmProjects\test_blob_access_man_ident\main.py», строка 30, в Файл «C:\Users\yrdeb\PycharmProjects\test_blob_access_man_ident\main.py», строка 30, в print([b вместо b в blob_names]) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\core\paging.py», строка 123, в следующей строке. вернуться дальше (self._page_iterator) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\core\paging.py», строка 75, в следующей строке. self._response = self._get_next(self.continuation_token) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\storage\blob_list_blobs_helper.py», строка 179, в _get_next_cb процесс_хранилище_ошибка (ошибка) Файл «C:\Users\yrdeb.conda\envs\env3106\lib\site-packages\azure\storage\blob_shared\response_handlers.py», строка 184, в Process_storage_error exec("вызвать ошибку из None") # pylint:disable=exec-used # nosec Файл "", строка 1, в azure.core.Exceptions.HttpResponseError: этому запросу не разрешено выполнять эту операцию с использованием этого разрешения. Идентификатор запроса: fc138e07-a01e-0062-75ea-ad615a000000 Время:2024-05-24T14:57:44.6182291Z Содержание: AuthorizationPermissionMismatchЭтому запросу не разрешено выполнять эту операцию с использованием этого разрешения. Идентификатор запроса: fc138e07-a01e-0062-75ea-ad615a000000 Время:2024-05-24T14:57:44.6182291Z

Чтобы получить доступ к данным внутри контейнера, вам необходимо назначить себе роль «Участник данных BLOB-объекта хранилища».

Gaurav Mantri 24.05.2024 17:38

Обратитесь к этому адресу Learn.microsoft.com/en-us/azure/storage/blobs/… вам нужна Storage Blob Data Contributor роль.

Venkatesan 24.05.2024 17:43
1
2
181
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

AuthorizationPermissionMismatch Этот запрос не имеет права выполнять эту операцию с использованием этого разрешения. Идентификатор запроса: fc138e07-a01e-0062-75ea-ad615a000000 Время: 2024-05-24T14:57:44.6182291Z

Вышеупомянутая ошибка возникает, если у вас нет надлежащего разрешения на доступ к хранилищу BLOB-объектов Azure.

Согласно этому MS-Document,

Чтобы получить доступ к BLOB-объекту внутри контейнера, вам необходимо назначить роль себе или пользователю Storage Blob Data Contributor.

В своей среде я назначил Storage Blob Data Contributor конкретному контейнеру на портале.

Портал:

Теперь, после назначения роли, я выполнил тот же код в своей среде. Это сработало успешно.

Код

from azure.identity import DefaultAzureCredential
from azure.storage.blob import ContainerClient

if __name__ == "__main__":

    client = ContainerClient(
        credential=DefaultAzureCredential(),
        account_url = "https://venkat456.blob.core.windows.net",
        container_name = "test"
    )

    blob_names = client.list_blob_names()
    print([b for b in blob_names])

Выход:

['Adobe Scan 10-Apr-2024.pdf', 'document.PDF', 'gnupg-2.4.5.tar.bz2.sig', 'industry.csv.gpg', 'sample2.ps1']

Это работает, спасибо! Знаете, хотя меня это немного беспокоит. Видите ли, в графическом интерфейсе я могу получить доступ к списку контейнеров без этой роли. Я ожидал, что смогу иметь тот же доступ при использовании CLI или SDK (вход в систему под тем же именем), поэтому мне никогда не приходило в голову, что мне нужно больше разрешений :) ... в любом случае, теперь все хорошо.

Ytsen de Boer 30.05.2024 13:47

Другие вопросы по теме

Потоковая передача (загрузка) файла из хранилища BLOB-объектов Azure пользователю через flask
Как скопировать все контейнеры исходной учетной записи хранения в целевую учетную запись хранения в виде папок в контейнере?
ADF CopyActivity рекурсивно распаковывает архив, но в этом нет необходимости
Есть ли способ использовать команду COPY INTO Databricks для копирования всех файлов из BLOB-объекта Azure в дельта-таблицу?
Azure Blob Storage создает токен SAS делегирования пользователей
Перемещение файла из контейнера BLOB-объектов Azure в общий файловый ресурс Azure в приложении Springboot
Как запустить функцию HTTP-триггера с помощью трепетания кнопки?
Как параметризовать набор данных, чтобы я мог использовать несколько файлов Excel в папке больших двоичных объектов для передачи в PowerQuery один за другим?
Создание общего API для доступа к любому BLOB-объекту в любой учетной записи хранения в клиенте
Межклиентское хранилище BLOB-объектов Azure SAS завершается сбоем с сообщением «Подпись не соответствует» с использованием UserDelegatedCredential и azure-sdk-for-go