Сбой чтения Python Blob Storage при использовании Azure AD RBAC - без атрибута «подписанный сеанс» - PullRequest
0 голосов
/ 26 марта 2019

Краткое описание проблемы: чтение Python из хранилища BLOB-объектов с использованием Azure SDK для Python завершается с ошибкой на BlockBlobService.get_blob_to_path, с ошибкой у используемого клиента RBAC нет атрибута, называемого «подписанный сеанс», после проверки подлинности в Azure AD .

Деталь:

У меня есть доступ на чтение (в качестве ТРЕТЬЕЙ СТОРОНЫ) к учетной записи хранилища BLOB-объектов Azure - с помощью RBAC Azure Active Directory (управление доступом на основе ролей). Владельцы магазина Blob предоставили мне роль хранилища данных Blob Data Reader.

Подробные примеры, которые я нахожу в Интернете для подключения из Python для чтения из хранилища BLOB-объектов, используют параметры account_name и account_key - но у меня нет этих учетных данных, поскольку я не являюсь владельцем самого хранилища.

Таким образом, я обнаружил, как использовать RBAC для подключения к Azure - однако сама операция чтения, похоже, завершается с ошибкой - хотя я полагаю, что моя проблема на самом деле в том, чтобы создать BlockBlobService.

Я создал упрощенный сценарий для извлечения образца файлов из магазина на основе файлов, которые, как я знаю, мне нужно загрузить. Кажется, я могу подключиться к Azure Active Directory (отключение подключения к Интернету подтверждает сбой), но после выполнения чтения через некоторое время (~ 30 секунд) возникает ошибка, как показано ниже.

Естественно - отредактированные разделы имеют правильные учетные данные / данные в моем коде:


    from azure.storage.blob import BlockBlobService
    from azure.storage.blob import ContainerPermissions
    from azure.graphrbac import GraphRbacManagementClient
    from azure.common.credentials import UserPassCredentials

    print('Connecting to Azure Active Directory')
    credentials = UserPassCredentials(
                'myname@email.com',      # Your user
                'zzzzz',          # Your password
                resource="https://graph.windows.net"
        )

    tenant_id = "zzzz"

    graphrbac_client = GraphRbacManagementClient(
        credentials,
        tenant_id
    )

    AccountName = "account_name"
    imagesContainer = "container_name"

    ## Connect to the Azure Block Blob service using the GraphRBAC
    print('Connecting to Azure Block Blob Service')
    block_blob_service = BlockBlobService(account_name=AccountName, token_credential=graphrbac_client)

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


    block_blob_service.get_blob_to_path(imagesContainer, AzureFilename, newFileName)

Exception has occurred: azure.common.AzureException
'GraphRbacManagementClient' object has no attribute 'signed_session'
  File "C:\zzz\PullUnsortedImagesFromAzure.py", line 138, in <module>
    block_blob_service.get_blob_to_path(imagesContainer, AzureFilename, newFileName)
  File "C:\Python\Python37\Lib\runpy.py", line 85, in _run_code
    exec(code, run_globals)
  File "C:\Python\Python37\Lib\runpy.py", line 96, in _run_module_code
    mod_name, mod_spec, pkg_name, script_name)
  File "C:\Python\Python37\Lib\runpy.py", line 263, in run_path
    pkg_name=pkg_name, script_name=fname)

Что интересно, так это то, что в проводнике Windows я действительно вижу создаваемый файл, но на самом деле его не извлекают из хранилища BLOB-объектов.

Я действительно не эксперт, когда дело доходит до AD - так что я предполагаю, но я думаю, что проблема, вероятно, происходит из:


    block_blob_service = BlockBlobService(account_name=AccountName, token_credential=graphrbac_client)

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

Спасибо!

1 Ответ

1 голос
/ 27 марта 2019

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

1. Зарегистрировать приложение на портале Azure.

Щелкните приложениеВы только что зарегистрировались.enter image description here Нажмите Настройки-> нажмите клавиши-> введите описание ключа-> нажмите Сохранить.Значение ключа - секрет клиента.

enter image description here 2. Предоставьте разрешения для вашего приложения .

3. Доступ к хранилищу

import adal
from azure.storage.blob import (
    BlockBlobService,
    ContainerPermissions,
)
from azure.storage.common import (
    TokenCredential
)

RESOURCE = "https://storage.azure.com/"
clientId = "***"
clientSecret = "***="
tenantId = "***"
authority_url = "https://login.microsoftonline.com/" + tenantId

print(authority_url)
context = adal.AuthenticationContext(authority_url)

token = context.acquire_token_with_client_credentials(
    RESOURCE,
    clientId,
    clientSecret)
print(token)

tokenCre = TokenCredential(token["accessToken"])

blobService = BlockBlobService(account_name="***", token_credential=tokenCre)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...