Azure AD RBAC的Python Blob存储读取失败-无属性';签名会话';
问题摘要:使用Azure SDK for Python从Blob存储区读取Python在BlockBlobService.get_Blob_to_path上失败,错误是在我向Azure AD进行身份验证后,我使用的RBAC客户端没有名为“signed session”的属性 详情如下: 我已经(作为第三方)获得了对Azure Blob存储帐户的读取访问权-使用Azure Active Directory RBAC(基于角色的访问控制)。Blob存储区的所有者授予我存储Blob数据读取器的角色 我在网上找到的从Python连接到Blob存储读取的详细示例使用account_名称和account_键参数,但我没有这些凭据,因为我不拥有存储本身 因此,我发现了如何使用RBAC连接到Azure——然而读取操作本身似乎失败了——尽管我认为我的问题实际上是在创建BlockBlobService的步骤中 我已经创建了一个简化的脚本,根据我知道需要下载的文件,从商店中提取文件样本。我似乎能够连接到Azure Active Directory(断开internet连接确认失败),但一旦执行读取,经过一段时间(~30秒),就会生成一个错误,如下所示 自然-编辑的部分在我的代码中具有正确的凭据/详细信息:Azure AD RBAC的Python Blob存储读取失败-无属性';签名会话';,python,azure,azure-active-directory,azure-storage-blobs,Python,Azure,Azure Active Directory,Azure Storage Blobs,问题摘要:使用Azure SDK for Python从Blob存储区读取Python在BlockBlobService.get_Blob_to_path上失败,错误是在我向Azure AD进行身份验证后,我使用的RBAC客户端没有名为“signed session”的属性 详情如下: 我已经(作为第三方)获得了对Azure Blob存储帐户的读取访问权-使用Azure Active Directory RBAC(基于角色的访问控制)。Blob存储区的所有者授予我存储Blob数据读取器的角色 我
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)
如果有人能帮我指出我应该做什么,我将不胜感激
谢谢大家! 您可以按照以下步骤验证应用程序以访问存储blob 一,。在Azure门户中 单击您刚刚注册的应用程序。 单击设置->单击关键点->输入关键点的说明->单击保存。密钥的值是客户端机密 二, 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)
非常感谢您的回复,Tony-不幸的是,我没有权限添加应用程序或在存储容器中授予权限-但我已要求所有者这样做,所以希望会很快。。。我会在测试后发回@布莱恩,不客气。如果您需要进一步的帮助,请告诉我。@Brian嗨Brian,现在进展如何?嗨-管理员刚刚添加了应用程序,但我没有任何乐趣。我发现使用应用程序ID时,ADAL确实连接到了存储,但是客户机机密对我来说似乎是个谜——我尝试了ObjectID,但是我一直得到ADAL错误“AADSTS7000215:提供的客户端密码无效。我已经在我自己的Azure上创建了一个测试应用程序,但看不到客户端机密来自何处。在上面的代码中,clientSecret指的是什么?我在哪里可以找到它?非常感谢@布莱恩:我已经更新了答案,你可以检查一下。
block_blob_service = BlockBlobService(account_name=AccountName, token_credential=graphrbac_client)
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)