使用 Python 为容器或 blob 创建服务 SAS
使用共享访问签名 (SAS),可以授予对存储帐户中容器和 blob 的有限访问权限。 创建 SAS 时,需要指定其约束条件,包括允许客户端访问哪些 Azure 存储资源、它们对这些资源具有哪些权限,以及 SAS 的有效期。
每个 SAS 均使用密钥进行签名。 可通过以下两种方式之一对 SAS 进行签名:
- 使用通过 Microsoft Entra 凭据创建的密钥。 使用 Microsoft Entra 凭据签名的 SAS 是用户委托 SAS。 必须为创建用户委托 SAS 的客户端分配一个 Azure RBAC 角色,该角色包括 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作。 若要了解详细信息,请参阅创建用户委托 SAS。
- 使用存储帐户密钥。 服务 SAS 和帐户 SAS 均使用存储帐户密钥进行签名。 创建服务 SAS 的客户端必须具有对帐户密钥的直接访问权限,或分配有 Microsoft.Storage/storageAccounts/listkeys/action 权限。 若要了解详细信息,请参阅创建服务 SAS 或创建帐户 SAS。
注意
用户委托 SAS 为使用存储帐户密钥签名的 SAS 提供更高的安全性。 Microsoft 建议尽可能使用用户委托 SAS。 有关详细信息,请参阅向具有共享访问签名的数据授予有限的访问权限 (SAS)。
本文介绍了如何使用存储帐户密钥通过面向 Python 的 Azure 存储客户端库为容器或 blob 创建服务 SAS。
关于服务 SAS
服务 SAS 使用存储帐户访问密钥进行签名。 服务 SAS 会委托对单个 Azure 存储服务中的资源(例如 Blob 存储)的访问权限。
还可以使用存储访问策略来定义 SAS 的权限和持续时间。 如果提供现有存储访问策略的名称,则该策略与 SAS 关联。 若要详细了解存储访问策略,请参阅定义存储访问策略。 如果未提供存储访问策略,可通过本文中的代码示例来了解如何定义 SAS 的权限和持续时间。
创建服务 SAS
可以根据应用的需求为容器或 Blob 创建服务 SAS。
可以使用以下方法创建服务 SAS,以委派对容器资源的有限访问权限:
用于对 SAS 进行签名的存储帐户访问密钥将会作为 account_key
参数传递到方法。 允许的权限将作为 permission
参数传递给方法,并在 ContainerSasPermissions 类中进行定义。
以下代码示例显示了如何为容器资源创建具有读取权限的服务 SAS:
def create_service_sas_container(self, container_client: ContainerClient, account_key: str):
# Create a SAS token that's valid for one day, as an example
start_time = datetime.datetime.now(datetime.timezone.utc)
expiry_time = start_time + datetime.timedelta(days=1)
sas_token = generate_container_sas(
account_name=container_client.account_name,
container_name=container_client.container_name,
account_key=account_key,
permission=ContainerSasPermissions(read=True),
expiry=expiry_time,
start=start_time
)
return sas_token
使用服务 SAS 为客户端对象授权
可以使用服务 SAS 来根据 SAS 授予的权限授权客户端对象对容器或 Blob 执行操作。
以下代码示例显示了如何使用在先前示例中创建的服务 SAS 来授权 ContainerClient 对象。 此客户端对象可用于根据 SAS 授予的权限对容器资源执行操作。
# The SAS token string can be appended to the resource URL with a ? delimiter
# or passed as the credential argument to the client constructor
sas_url = f"{container_client.url}?{sas_token}"
# Create a ContainerClient object with SAS authorization
container_client_sas = ContainerClient.from_container_url(container_url=sas_url)
资源
若要详细了解如何使用适用于 Python 的 Azure Blob 存储客户端库,请参阅以下资源。