【问题标题】:How do I authenticate a user against an Azure storage blob in python?如何针对 python 中的 Azure 存储 blob 对用户进行身份验证?
【发布时间】:2019-05-23 05:40:36
【问题描述】:

我正在寻找一种针对 Azure blob 容器对用户进行身份验证的方法。示例代码(是的,新手提醒)工作得很好,使用存储帐户的访问密钥,但这感觉就像将整个存储帐户的完全控制权交给任何窃取凭据的人一样令人不安。

身份验证示例(来自https://azure.microsoft.com/en-us/resources/samples/storage-python-getting-started/)如下所示:

block_blob_service = BlockBlobService(account_name='<acc>', account_key='<key>')

我在 Active Directory 中设置了一个服务用户,该用户在存储帐户中的角色限制其使用 blob 容器;它的目的只是将新项目写入一个特定的容器中。

我想在 python 脚本中使用该用户的凭据,这样如果它泄漏,就无法访​​问其他存储资源。有没有办法根据资源/ID组合生成访问密钥,或者类似的方式来实现?我一直在浏览 Azure Python API 文档,但没有取得任何进展。

编辑:我取得了一些进展。我创建了一个具有适当 IAM 限制的服务主体。当我调用它时,这似乎登录成功:

credentials = ServicePrincipalCredentials( client_id=<>, secret=<>, tenant=<>)
print(credentials)

这给了我一个对象:

<msrestazure.azure_active_directory.ServicePrincipalCredentials object at 0x7f34f52668d0>

如果我给它不正确的凭据,则会出错。所以,太好了,我有一个凭证对象。怎么办?我找不到将其输入 BlockBlobService 的方法。

【问题讨论】:

  • 自从我使用 Azure 已经有一段时间了,但很确定你需要从 Azure 门户获取帐户名/密钥......如果它像 AWS,你应该能够创建“用户” 应用程序/开发人员以编程方式访问存储的密钥(而不是让用户使用根密钥访问)
  • 有一个用户 ID,但我看不到密钥。没有附加到它是一个 AD 帐户;如果我可以创建一个特定于容器的密钥对,那就太好了。但目前我所能做的就是授予对整个存储容器的访问权限,而且我确信一定有比这更精细的访问控制方式!
  • 您好,如果您认为我的回答对您有帮助,您可以将其标记为答案。非常感谢!

标签: python azure azure-active-directory azure-storage azure-blob-storage


【解决方案1】:

您可以参考此article 以从应用程序向 Azure Active Directory 进行身份验证以访问 Blob。

1.Register your application with an Azure AD tenant

2.Grant your registered app permissions to Azure Storage

3.Python代码:

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)

blobService.list_blobs(container_name="***")
for i in blobService.list_blobs(container_name="***"):
    print(i.properties.name)

【讨论】:

  • 谢谢!那很有用。我想我正在取得进步。
  • @zaump 当然!如果我的回答对你有帮助,你可以采纳,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-14
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多