使用 Python 创建帐户 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 存储客户端库创建帐户 SAS。

关于帐户 SAS

帐户 SAS 是在存储帐户级别创建的。 通过创建帐户 SAS,可以:

帐户 SAS 不支持存储访问策略。

创建帐户 SAS

帐户 SAS 使用帐户访问密钥进行签名。 以下代码示例演示如何调用 generate_account_sas 方法来获取帐户 SAS 令牌字符串。

def create_account_sas(self, account_name: str, account_key: str):
    # Create an account SAS that's valid for one day
    start_time = datetime.datetime.now(datetime.timezone.utc)
    expiry_time = start_time + datetime.timedelta(days=1)

    # Define the SAS token permissions
    sas_permissions=AccountSasPermissions(read=True)

    # Define the SAS token resource types
    # For this example, we grant access to service-level APIs
    sas_resource_types=ResourceTypes(service=True)

    sas_token = generate_account_sas(
        account_name=account_name,
        account_key=account_key,
        resource_types=sas_resource_types,
        permission=sas_permissions,
        expiry=expiry_time,
        start=start_time
    )

    return sas_token

ResourceTypes 构造函数的有效参数为:

  • service:默认值为 False;设置为 True 以授予对服务级 API 的访问权限。
  • container:默认值为 False;设置为 True 以授予对容器级 API 的访问权限。
  • object:默认值为 False;设置为 True 以授予对 blob、队列消息和文件的对象级 API 的访问权限。

有关可用权限,请参阅 AccountSasPermissions

通过客户端使用帐户 SAS

若要使用帐户 SAS 访问 Blob 服务的服务级别 API,请使用存储帐户的帐户 SAS 和 Blob 存储终结点创建 BlobServiceClient 对象。

# The SAS token string can be appended to the account URL with a ? delimiter
# or passed as the credential argument to the client constructor
account_sas_url = f"{blob_service_client.url}?{sas_token}"

# Create a BlobServiceClient object
blob_service_client_sas = BlobServiceClient(account_url=account_sas_url)

如果向这些资源类型授予了作为签名值的一部分的访问权限,则还可以使用帐户 SAS 来授权和处理 ContainerClient 对象或 BlobClient 对象。

资源

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

代码示例

客户端库资源

另请参阅