使用 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 当前不可用的服务级别操作的访问权限,例如获取 Blob 服务属性、设置 Blob 服务属性和获取 Blob 服务统计信息。
- 一次性委托对存储帐户中多个服务的访问权限。 例如,可以使用帐户 SAS 委托对 Azure Blob 存储和 Azure 文件存储中的资源的访问权限。
帐户 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,请参阅以下资源。