使用 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 的 Blob 存储客户端库为 blob 创建服务 SAS。

关于服务 SAS

服务 SAS 使用存储帐户访问密钥进行签名。 服务 SAS 会委托对单个 Azure 存储服务中的资源(例如 Blob 存储)的访问权限。

还可以使用存储访问策略来定义 SAS 的权限和持续时间。 如果提供现有存储访问策略的名称,则该策略与 SAS 关联。 若要详细了解存储访问策略,请参阅定义存储访问策略。 如果未提供存储访问策略,可通过本文中的代码示例来了解如何定义 SAS 的权限和持续时间。

为 blob 创建服务 SAS

可以使用以下方法创建服务 SAS,以委派对 Blob 资源的有限访问权限:

用于对 SAS 进行签名的存储帐户访问密钥将会作为 account_key 参数传递到该方法。 允许的权限将作为 permission 参数传递给该方法,并在 BlobSasPermissions 类中进行定义。

以下代码示例显示了如何为 blob 资源创建具有读取权限的服务 SAS:

def create_service_sas_blob(self, blob_client: BlobClient, 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_blob_sas(
        account_name=blob_client.account_name,
        container_name=blob_client.container_name,
        blob_name=blob_client.blob_name,
        account_key=account_key,
        permission=BlobSasPermissions(read=True),
        expiry=expiry_time,
        start=start_time
    )

    return sas_token

使用服务 SAS 为客户端对象授权

以下代码示例显示了如何使用在较早的示例中创建的服务 SAS 来授权 BlobClient 对象。 此客户端对象可用于根据 SAS 授予的权限对 blob 资源执行操作。

# 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"{blob_client.url}?{sas_token}"

# Create a BlobClient object with SAS authorization
blob_client_sas = BlobClient.from_blob_url(blob_url=sas_url)

资源

若要详细了解如何使用适用于 Python 的 Azure Blob 存储客户端库,请参阅以下资源。

代码示例

客户端库资源

另请参阅