你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

创建用户委托 SAS

重要

为了获得最佳安全性,Microsoft 建议将 Microsoft Entra ID 与托管标识结合使用,尽可能对 blob、队列和表数据的请求进行授权。 与共享密钥授权相较,使用Microsoft Entra ID和托管标识进行授权可提供更高的安全性和易用性。 若要了解详细信息,请参阅使用 Microsoft Entra ID 授权。 若要详细了解托管标识,请参阅 什么是 Azure 资源的托管标识

对于托管在 Azure 外部的资源(例如本地应用程序),可以通过 Azure Arc 使用托管标识。例如,在已启用 Azure Arc 的服务器上运行的应用可以使用托管标识连接到 Azure 服务。 若要了解详细信息,请参阅 使用已启用 Azure Arc 的服务器对 Azure 资源进行身份验证

可以使用Microsoft Entra凭据或帐户密钥来保护共享访问签名 (SAS) 令牌,以便访问容器、目录或 Blob。 使用Microsoft Entra凭据保护的 SAS 称为用户委托 SAS。 作为安全最佳做法,我们建议尽可能使用Microsoft Entra凭据,而不是更容易泄露的帐户密钥。 当应用程序设计需要共享访问签名时,请使用Microsoft Entra凭据创建用户委托 SAS,以帮助确保更好的安全性。

每个 SAS 均使用密钥进行签名。 若要创建用户委托 SAS,必须先请求 用户委托密钥,然后使用该密钥对 SAS 进行签名。 用户委托密钥类似于用于对服务 SAS 或帐户 SAS 进行签名的帐户密钥,只不过它依赖于Microsoft Entra凭据。 若要请求用户委派密钥,请调用 “获取用户委派密钥” 操作。 然后,可以使用用户委派密钥创建 SAS。

Azure Blob 存储和Azure Data Lake Storage Gen2支持用户委托 SAS。 用户委派 SAS 不支持存储访问策略。

注意

共享访问签名是授予存储资源权限的密钥,应像保护帐户密钥一样保护它们。 防止 SAS 被恶意使用或意料之外的使用很重要。 请谨慎分发 SAS,并制定撤销受到安全威胁的 SAS 的计划。 应仅通过 HTTPS 连接执行使用共享访问签名的操作,而共享访问签名 URI 应仅在 HTTPS 等安全连接上分发。

有关使用帐户密钥保护 SAS 的信息,请参阅Create服务 SASCreate帐户 SAS

对目录范围访问的用户委派 SAS 支持

当授权版本 () 为 sr=d 2020-02-10 或更高版本,并且启用了分层命名空间 (HNS) 时 sv ,用户委派 SAS 支持目录范围 () 。 目录范围 (sr=d) 的语义类似于容器范围 (sr=c) ,只不过访问仅限于目录及其中的任何文件和子目录。 指定 时 sr=dsdd 还需要查询参数。

授权版本 2020-02-10 的字符串到签名格式保持不变。

用户 OID 的用户委派 SAS 支持

当用户委派 SAS 支持可选的用户对象标识符 (OID) ,当 () 的授权版本sv为 2020-02-10 或更高版本时,该标识符在 或 suoid 参数中saoid携带。 此可选参数为 Hadoop 和 Spark 等多用户群集工作负载提供增强的授权模型。

SAS 令牌可以限制为特定的文件系统操作和用户,这提供了一个不太易受攻击的访问令牌,可以更安全地跨多用户群集分发。 这些功能的一个用例是将 Hadoop ABFS 驱动程序与 Apache Ranger 集成。

授权用户委托 SAS

当客户端使用用户委托 SAS 访问 Blob 存储资源时,对 Azure 存储的请求会获得用于创建 SAS 的Microsoft Entra凭据的授权。 基于角色的访问控制 (为该Microsoft Entra帐户授予的 RBAC) 权限,以及 SAS 上显式授予的权限,决定了客户端对资源的访问权限。 此方法提供额外的安全级别,有助于避免将帐户访问密钥与应用程序代码一起存储。 出于这些原因,使用Microsoft Entra凭据创建 SAS 是安全最佳做法。

授予拥有 SAS 的客户端的权限是向请求用户委派密钥的安全主体授予的权限与使用 signedPermissions (sp) 字段授予 SAS 令牌上的资源的权限的交集。 如果通过 RBAC 授予安全主体的权限未同时授予 SAS 令牌,则不会向尝试使用 SAS 访问资源的客户端授予该权限。 创建用户委托 SAS 时,请确保通过 RBAC 授予的权限和通过 SAS 令牌授予的权限都与客户端所需的访问级别保持一致。

若要创建用户委托 SAS,请执行以下操作:

  1. 使用 RBAC 向将请求用户委派密钥的安全主体授予所需的权限。
  2. 从 Microsoft Entra ID 获取 OAuth 2.0 令牌。
  3. 使用令牌通过调用“获取用户委派密钥”操作来请求 用户委托密钥
  4. 使用用户委派密钥构造包含相应字段的 SAS 令牌。

使用 RBAC 分配权限

请求用户委派密钥的安全主体需要具有相应的权限才能执行此操作。 Microsoft Entra ID安全主体可以是用户、组、服务主体或托管标识。

若要请求用户委派密钥,必须将 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作分配给安全主体。 以下内置 RBAC 角色包括 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作(显式操作或作为通配符定义的一部分):

由于 “获取用户委派密钥 ”操作在存储帐户级别执行,因此 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的范围必须限定在存储帐户、资源组或订阅的级别。 如果在存储帐户、资源组或订阅级别为安全主体分配了前面列出的任何内置角色或包含 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作的自定义角色,则安全主体可以请求用户委派密钥。

如果为安全主体分配了允许数据访问但范围限定为容器级别的角色,则还可以在存储帐户、资源组或订阅级别将 存储 Blob 委派者 角色分配给安全主体。 存储 Blob 委派者角色授予安全主体请求用户委托密钥的权限。

有关 Azure 存储的 RBAC 角色的详细信息,请参阅使用 Microsoft Entra 授权

获取 OAuth 2.0 令牌

若要获取用户委派密钥,请先从 Microsoft Entra ID 请求 OAuth 2.0 令牌。 为令牌提供持有者方案,以授权调用 “获取用户委派密钥 ”操作。 有关从 Microsoft Entra ID 请求 OAuth 令牌的详细信息,请参阅身份验证流和应用程序方案

请求用户委派密钥

调用 “获取用户委派密钥” 操作会将密钥作为一组值返回,这些值用作用户委派 SAS 令牌上的参数。 获取 用户委派密钥 参考和下一节“构造用户委托 SAS”中介绍了这些参数。

当客户端使用 OAuth 2.0 令牌请求用户委托密钥时,Azure 存储将代表安全主体返回用户委托密钥。 使用用户委托密钥创建的 SAS 被授予授予安全主体的权限。

获得用户委派密钥后,可以使用它在密钥的生存期内创建任意数量的用户委派共享访问签名。 用户委托密钥独立于用于获取它的 OAuth 2.0 令牌,因此只要密钥仍然有效,就无需续订令牌。 可以指定密钥的有效期最长为 7 天。

构造用户委托 SAS

下表汇总了用户委托 SAS 令牌支持的字段。 后续部分提供有关如何指定这些参数的其他详细信息。

SAS 字段名称 SAS 令牌参数 必需还是可选 版本支持 说明
signedVersion sv 必需 2018-11-09 及更高版本 指示用于构造签名字段的服务的版本。 它还指定用于处理使用此 SAS 发出的请求的服务版本。
signedResource sr 必需 全部 指定可通过共享访问签名访问哪些 Blob 资源。
signedStart st 可选 全部 可选。 共享访问签名生效的时间,以接受的 ISO 8601 UTC 格式之一表示。 如果省略此值,则使用当前 UTC 时间作为开始时间。 有关接受的 UTC 格式的详细信息,请参阅 设置 DateTime 值的格式
signedExpiry se 必需 全部 共享访问签名无效的时间,以接受的 ISO 8601 UTC 格式之一表示。 有关接受的 UTC 格式的详细信息,请参阅 设置 DateTime 值的格式
signedPermissions sp 必需 全部 指示拥有 SAS 的客户端可以在资源上执行哪些操作。 权限可以组合在一起。
signedIp sip 可选 2015-04-05 及更高版本 指定要从中接受请求的 IP 地址或 IP 地址的包含范围。 指定范围时,请记住该范围是非独占的。 仅支持 IPv4 地址。

例如 sip=168.1.5.65sip=168.1.5.60-168.1.5.70
signedProtocol spr 可选 2015-04-05 及更高版本 指定允许使用 SAS 发出的请求的协议。 包括此字段以要求使用 SAS 令牌发出的请求使用 HTTPS。
signedObjectId skoid 必需 2018-11-09 及更高版本 标识Microsoft Entra安全主体。
signedTenantId sktid 必需 2018-11-09 及更高版本 指定在其中定义安全主体Microsoft Entra租户。
signedKeyStartTime skt 可选。 2018-11-09 及更高版本 该值由 “获取用户委派密钥 ”操作返回。 指示用户委派密钥的生存期开始,以接受的 ISO 8601 UTC 格式之一表示。 如果省略值,则假定为当前时间。 有关接受的 UTC 格式的详细信息,请参阅 设置 DateTime 值的格式
signedKeyExpiryTime ske 必需 2018-11-09 及更高版本 该值由 “获取用户委派密钥 ”操作返回。 指示用户委托密钥的生存期结束,以接受的 ISO 8601 UTC 格式之一表示。 有关接受的 UTC 格式的详细信息,请参阅 设置 DateTime 值的格式
signedKeyVersion skv 必需 2018-11-09 及更高版本 该值由 “获取用户委派密钥 ”操作返回。 指定用于获取用户委派密钥的存储服务版本。 此字段必须指定版本 2018-11-09 或更高版本。
signedKeyService sks 必需 2018-11-09 及更高版本 指示用户委派密钥对其有效的服务。 目前仅支持 Blob 存储。
signedAuthorizedObjectId saoid 可选 2020-02-10 及更高版本 指定Microsoft Entra安全主体的对象 ID,该安全主体由用户委派密钥的所有者授权以执行 SAS 令牌授予的操作。 对可移植操作系统接口 (POSIX) 访问控制列表执行 (ACL) ,没有其他权限检查。
signedUnauthorizedObjectId suoid 可选 2020-02-10 及更高版本 指定启用分层命名空间时Microsoft Entra安全主体的对象 ID。 Azure 存储在授权操作之前针对对象 ID 执行 POSIX ACL 检查。
signedCorrelationId scid 可选 2020-02-10 及更高版本 将存储审核日志与生成和分发 SAS 的主体使用的审核日志相关联。
signedDirectoryDepth sdd 如果 sr=d,则必须提供。 2020-02-10 及更高版本 指示字符串到签名字段中指定的 canonicalizedResource 目录的根文件夹中的目录数。
signedEncryptionScope ses 可选 2020-12-06 及更高版本 指示用于加密请求内容的加密范围。
signature sig 必需 全部 签名是基于哈希的消息身份验证代码 (HMAC) ,它通过使用 SHA256 算法通过字符串到签名和密钥进行计算,然后使用 Base64 编码进行编码。
Cache-Control 响应标头 rscc 可选 2013-08-15 及更高版本 Azure 存储将 Cache-Control 响应标头设置为 SAS 令牌上指定的值。
Content-Disposition 响应标头 rscd 可选 2013-08-15 及更高版本 Azure 存储将 Content-Disposition 响应标头设置为 SAS 令牌上指定的值。
Content-Encoding 响应标头 rsce 可选 2013-08-15 及更高版本 Azure 存储将 Content-Encoding 响应标头设置为 SAS 令牌上指定的值。
Content-Language 响应标头 rscl 可选 2013-08-15 及更高版本 Azure 存储将 Content-Language 响应标头设置为 SAS 令牌上指定的值。
Content-Type 响应标头 rsct 可选 2013-08-15 及更高版本 Azure 存储将 Content-Type 响应标头设置为 SAS 令牌上指定的值。

指定签名的版本字段

必需的 signedVersion (sv) 字段指定共享访问签名的服务版本。 此值指示用于构造 signature 字段的服务版本,并指定用于处理使用此共享访问签名发出的请求的服务版本。 字段的值 sv 必须是版本 2018-11-09 或更高版本。

指定已签名的资源域

必需的 signedResource (sr) 字段指定可通过共享访问签名访问哪些资源。 下表介绍如何在 SAS 令牌中引用 Blob、容器或目录资源:

资源 参数值 支持的版本 说明
Blob b 全部 授予对 Blob 内容和元数据的访问权限。
Blob 版本 Bv 2018-11-09 及更高版本 授予对 Blob 版本的内容和元数据的访问权限,但不授予对基本 Blob 的访问权限。
Blob 快照 bs 2018-11-09 及更高版本 授予对 blob 的内容和元数据快照的访问权限,但不能授予对基本 Blob 的访问权限。
容器 c 全部 授予对容器中任何 Blob 的内容和元数据以及容器中 Blob 列表的访问权限。
Directory d 2020-02-10 及更高版本 在启用了分层命名空间的存储帐户中,授予对目录中任何 Blob 的内容和元数据以及目录中 Blob 列表的访问权限。 如果为 signedResource 字段指定了目录, signedDirectoryDepth 则还需要 (sdd) 参数。 目录始终位于容器中。

指定签名有效期

(signedStartst) 和 signedExpiry (se) 字段指示 SAS 的开始时间和过期时间。 signedExpiry 字段是必填的。 signedStart 字段为可选。 如果省略它,则使用当前 UTC 时间作为开始时间。

对于用户委派 SAS,SAS 的开始和过期时间应在为用户委派密钥定义的时间间隔内。 如果客户端在用户委派密钥过期后尝试使用 SAS,则 SAS 将失败并显示授权错误,而不管 SAS 本身是否仍然有效。

有关接受的 UTC 格式的详细信息,请参阅 设置 DateTime 值的格式

指定权限

为 SAS 令牌上的 signedPermissions (sp) 字段指定的权限指示拥有 SAS 的客户端可以在资源上执行哪些操作。

可以将权限组合在一起,以允许客户端使用同一 SAS 执行多个操作。 构造 SAS 时,必须按以下顺序包括权限:

racwdxltmeop

容器的有效权限设置示例包括 rw、、rdrlwdwlrl。 无效设置的示例包括 wrdrlrdw。 不允许多次指定权限。

用户委派 SAS 无法授予对某些操作的访问权限:

  • 无法创建、删除或列出容器。
  • 无法读取或写入容器元数据和属性。
  • 无法租用容器。

若要构造授予对这些操作的访问权限的 SAS,请使用帐户 SAS。 有关详细信息,请参阅创建帐户 SAS

下表描述了每种资源类型支持的权限:

权限 URI 符号 资源 版本支持 允许的操作
读取 r 容器
Directory
Blob
全部 读取容器或目录中任何 Blob 的内容、阻止列表、属性和元数据。 使用 Blob 作为复制操作的源。
添加 a 容器
Directory
Blob
全部 将块添加到追加 Blob。
创建 c 容器
Directory
Blob
全部 编写新 Blob、快照 blob 或将 Blob 复制到新 Blob。
写入 w 容器
Directory
Blob
全部 Create或写入内容、属性、元数据或阻止列表。 拍摄 Blob 快照或租用 Blob。 调整 Blob 大小(仅限页 Blob)。 使用 Blob 作为复制操作的目标。
删除 d 容器
Directory
Blob
全部 删除 Blob。 对于版本 2017-07-29 及更高版本,“删除”权限还允许中断 Blob 上的租约。 有关详细信息,请参阅 租用 Blob 操作。
删除版本 x 容器
Blob
2019-12-12 及更高版本 删除 blob 版本。
永久删除 y Blob 2020-02-10 及更高版本 永久删除 blob 快照或版本。
列出 l 容器
Directory
全部 以非递归方式列出 Blob。
标记 t Blob 2019-12-12 及更高版本 读取或写入 Blob 上的标记。
移动 m 容器
Directory
Blob
2020-02-10 及更高版本 将 Blob 或目录及其内容移动到新位置。 如果 saoid SAS 令牌中包含 参数并在父目录上设置了粘滞位,则可以选择将此操作限制为子 Blob、目录或父目录的所有者。
执行 e 容器
Directory
Blob
2020-02-10 及更高版本 获取系统属性,如果为存储帐户启用了分层命名空间,则获取 Blob 的 POSIX ACL。 如果启用了分层命名空间,并且调用方是 blob 的所有者,则此权限授予设置 Blob 的所有者组、POSIX 权限和 POSIX ACL 的能力。 它不允许调用方读取用户定义的元数据。
所有权 o 容器
Directory
Blob
2020-02-10 及更高版本 启用分层命名空间后,此权限使调用方能够设置所有者或拥有组,或者在调用方重命名或删除设置了粘滞位的目录中的目录或 Blob 时充当所有者。
权限 p 容器
Directory
Blob
2020-02-10 及更高版本 启用分层命名空间后,此权限允许调用方在目录和 Blob 上设置权限和 POSIX ACL。
设置不可变性策略 i 容器
Blob
2020-06-12 及更高版本 设置或删除 Blob 上的不可变性策略或法定保留。

指定 IP 地址或 IP 范围

可选的 signedIp (sip) 字段指定接受请求的公共 IP 地址或公共 IP 地址范围。 如果请求源自的 IP 地址与 SAS 令牌上指定的 IP 地址或地址范围不匹配,则请求未获得授权。 仅支持 IPv4 地址。

指定 IP 地址范围时,该范围是非独占的。 例如,在 sip=168.1.5.65 SAS 上指定 或 sip=168.1.5.60-168.1.5.70 会将请求限制为这些 IP 地址。

下表根据客户端环境和存储帐户的位置,说明是否在给定方案的 SAS 令牌上包括 signedIp 字段。

客户端环境 存储帐户位置 建议
在 Azure 中运行的客户端 与客户端位于同一区域中 在此方案中提供给客户端的 SAS 不应包含 字段的 signedIp 出站 IP 地址。 使用具有指定出站 IP 地址的 SAS 从同一区域中发出的请求失败。

请改用 Azure 虚拟网络来管理网络安全限制。 从同一区域中向 Azure 存储发出的请求始终通过专用 IP 地址进行。 有关详细信息,请参阅配置 Azure 存储防火墙和虚拟网络
在 Azure 中运行的客户端 在与客户端不同的区域中 在此方案中提供给客户端的 SAS 可能包括字段的公共 IP 地址或地址 signedIp 范围。 使用 SAS 发出的请求必须源自指定的 IP 地址或地址范围。
在本地或其他云环境中运行的客户端 在任何 Azure 区域中 在此方案中提供给客户端的 SAS 可能包括字段的公共 IP 地址或地址 signedIp 范围。 使用 SAS 发出的请求必须源自指定的 IP 地址或地址范围。

如果请求通过代理或网关传递,请为 signedIp 字段提供该代理或网关的公共出站 IP 地址。

指定 HTTP 协议

可选的 signedProtocol (spr) 字段指定允许使用 SAS 发出的请求的协议。 可能的值为“HTTPS 和 HTTP”(https,http) 或“仅 HTTPS”(https)。 默认值为 https,http

注意

无法为 spr 字段指定 HTTP。

指定已签名的对象 ID

signedObjectId 用户委派 SAS 需要 (skoid) 字段。 获取用户委派密钥操作在响应中返回此值。 带符号的对象 ID 是一个 GUID 值,它为Microsoft 标识平台中的安全主体提供不可变标识符。

指定签名的租户 ID

signedTenantId 用户委派 SAS 需要 (sktid) 字段。 获取用户委派密钥操作在响应中返回此值。 签名的租户 ID 是一个 GUID 值,该值表示在其中定义了安全主体的Microsoft Entra租户。

指定已签名的密钥开始时间

可选的 signedKeyStartTime (skt) 字段以 ISO Date 格式指示用户委派密钥的生存期开始时间。 获取用户委派密钥操作在响应中返回此值。 如果省略开始时间,则假定已签名密钥的开始时间为当前时间。

指定已签名密钥过期时间

ISO signedKeyExpiryTime Date 格式的用户委派 SAS 需要 (ske) 字段。 获取用户委派密钥操作在响应中返回此值。 签名的密钥过期时间指示用户委派密钥的生存期结束。 过期时间的值可能从 SAS 开始时间起最多 7 天。

指定已签名密钥服务

signedKeyService 用户委派 SAS 需要 (sks) 字段。 获取用户委派密钥操作在响应中返回此值。 签名密钥服务字段指示用户委派密钥对其有效的服务。 Blob 存储 b的已签名密钥服务字段的值为 。

指定签名密钥版本

signedkeyversion 用户委托 SAS 需要 (skv) 字段。 “获取用户委派密钥”操作在响应中返回此值。 字段 signedkeyversion 指定用于获取用户委派密钥的存储服务版本。 此字段必须指定版本 2018-11-09 或更高版本。

指定安全主体的已签名对象 ID

可选的 signedAuthorizedObjectId (saoid) 和 signedUnauthorizedObjectId (suoid) 字段支持与 Apache Hadoop 和 Apache Ranger 集成,以实现Azure Data Lake Storage Gen2工作负载。 在 SAS 令牌上使用以下字段之一来指定安全主体的对象 ID:

  • saoid字段指定Microsoft Entra安全主体的对象 ID,该主体由用户委派密钥的所有者授权来执行 SAS 令牌授予的操作。 Azure 存储验证 SAS 令牌,并确保在 Azure 存储授予访问权限之前,用户委派密钥的所有者具有所需的权限。 不会对 POSIX ACL 执行其他权限检查。
  • 为存储帐户启用分层命名空间时, suoid 字段指定Microsoft Entra安全主体的对象 ID。 字段 suoid 仅对具有分层命名空间的帐户有效。 suoid当字段包含在 SAS 令牌中时,Azure 存储在授权操作之前会针对对象 ID 执行 POSIX ACL 检查。 如果此 ACL 检查不成功,则操作将失败。 如果 SAS 令牌中包含 字段, suoid 则必须为存储帐户启用分层命名空间。 否则,权限检查将失败并出现授权错误。

请求用户委派密钥的安全主体的对象 ID 在必填 skoid 字段中捕获。 若要使用 saoid 或 字段在 SAS 令牌上指定对象 ID,必须为字段中skoid标识的安全主体分配包含 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/actionMicrosoft.Storage/storageAccounts/blobServices/containers/blobs/manageOwnership/action 的 RBAC suoid 角色。 有关这些操作的详细信息,请参阅 Azure 资源提供程序操作

通过在 或 suoid 字段中指定对象 IDsaoid,还可以通过以下方式限制与目录或 Blob 所有权相关的操作:

  • 如果操作创建目录或 Blob,Azure 存储会将目录或 blob 的所有者设置为对象 ID 指定的值。 如果未指定对象 ID,Azure 存储会将目录或 Blob 的所有者设置为 参数 skoid 指定的值。
  • 如果在父目录上设置了粘滞位,并且操作删除或重命名目录或 Blob,则父目录所有者或资源所有者的对象 ID 必须与对象 ID 指定的值匹配。
  • 如果操作设置目录或 Blob 的所有者,并且 x-ms-owner 指定了标头,则对象 ID 指定的值必须与标头指定的 x-ms-owner 值匹配。
  • 如果操作为目录或 Blob 设置组,并且 x-ms-group 指定了标头,则对象 ID 指定的值必须是 标头指定的 x-ms-group 组的成员。
  • 如果操作为目录或 Blob 设置权限或 ACL,还必须满足以下两个条件之一:
    • 为对象 ID 指定的值必须是目录或 Blob 的所有者。
    • 除 () o 权限外Permissions, (sp) 字段的值signedPermissions还必须包含 Ownership (p) 权限。

使用 SAS 令牌发出请求时,saoidsuoid或 字段中指定的对象 ID 包含在诊断日志中。

saoid仅当 signedVersion (sv) 字段设置为版本 2020-02-10 或更高版本时,才支持 或 suoid 字段。 SAS 令牌中只能包含其中一个字段。

指定相关 ID

(signedCorrelationIdscid) 字段指定一个关联 ID,该 ID 可用于将存储审核日志与生成和分发 SAS 的主体使用的审核日志相关联。 例如,受信任的授权服务通常具有一个托管标识,该标识对用户进行身份验证和授权,生成 SAS,将条目添加到本地审核日志,并将 SAS 返回给用户,用户随后可以使用 SAS 访问 Azure 存储资源。 通过在本地审核日志和存储审核日志中包含相关 ID,可以在以后关联这些事件。 该值是一个不带大括号且带小写字符的 GUID。

版本 2020-02-10 及更高版本支持此字段。

指定目录深度

signedResource如果 字段指定目录 (sr=d) ,则还必须指定 signedDirectoryDepth (sdd) 字段,以指示根目录下子目录的数目。 字段的值 sdd 必须是非负整数。

例如,根目录 https://{account}.blob.core.windows.net/{container}/ 的深度为 0。 根目录中的每个子目录将深度加 1。 目录 https://{account}.blob.core.windows.net/{container}/d1/d2 的深度为 2。

版本 2020-02-10 及更高版本支持此字段。

指定查询参数以替代响应标头

若要定义当在请求中使用共享访问签名时要返回的特定响应标头的值,你可以在查询参数中指定响应标头。 响应标头和相应的查询参数如下所示:

响应标头名称 相应的 SAS 查询参数
Cache-Control rscc
Content-Disposition rscd
Content-Encoding rsce
Content-Language rscl
Content-Type rsct

例如,如果在 SAS 令牌上指定 rsct=binary 查询参数,则 Content-Type 响应标头将设置为 binary。 该值仅替代为使用此共享访问签名的请求的 Blob 存储的 Content-Type 标头值。

如果创建将响应标头指定为查询参数的共享访问签名,则必须在用于构造签名字符串的 string-to-sign 中包含这些响应标头。 有关详细信息,请参阅“指定签名”部分。

指定加密范围

() 字段指定客户端应用程序在通过放置 Blob 操作使用 SAS 令牌上传 Blob 时使用的加密范围。sessigned encryption scope signed encryption scope如果 SAS 令牌上的签名版本 (sv) 字段为版本 2020-12-06 或更高版本,则支持 字段。 如果签名的版本字段指定的版本早于支持的版本,则服务将返回错误响应代码 403 (禁止) 。

如果为容器或文件系统设置了默认加密范围,则 ses 字段将遵循容器加密策略。 如果查询参数和x-ms-default-encryption-scope标头不匹配ses,并且x-ms-deny-encryption-scope-override标头设置为 true,则服务将返回错误响应代码 403 (禁止) 。

x-ms-encryption-scope如果标头和ses查询参数都在 PUT 请求中提供,并且不匹配,则服务将返回错误响应代码 400 (错误的请求) 。

指定签名

(signaturesig) 字段用于授权客户端使用共享访问签名发出的请求。 string-to-sign 是一个唯一字符串,它由必须验证才能授权请求的字段构造而成。 签名是使用 SHA256 算法通过字符串到签名和密钥计算的 HMAC,然后使用 Base64 编码进行编码。

若要构造用户委派 SAS 的签名字符串,请从构成请求的字段创建字符串以签名,将字符串编码为 UTF-8,然后使用 HMAC-SHA256 算法计算签名。 字符串到签名中包含的字段必须进行 URL 解码。

字符串到签名中所需的字段取决于用于授权的服务版本 (sv 字段) 。 以下部分介绍支持用户委派 SAS 的版本的字符串到签名配置。

版本 2020-12-06 及更高版本

用于授权版本 2020-12-06 及更高版本的 string-to-sign 具有以下格式:

StringToSign =  signedPermissions + "\n" +
                signedStart + "\n" +
                signedExpiry + "\n" +
                canonicalizedResource + "\n" +
                signedKeyObjectId + "\n" +
                signedKeyTenantId + "\n" +
                signedKeyStart + "\n" +
                signedKeyExpiry  + "\n" +
                signedKeyService + "\n" +
                signedKeyVersion + "\n" +
                signedAuthorizedUserObjectId + "\n" +
                signedUnauthorizedUserObjectId + "\n" +
                signedCorrelationId + "\n" +
                signedIP + "\n" +
                signedProtocol + "\n" +
                signedVersion + "\n" +
                signedResource + "\n" +
                signedSnapshotTime + "\n" +
                signedEncryptionScope + "\n" +
                rscc + "\n" +
                rscd + "\n" +
                rsce + "\n" +
                rscl + "\n" +
                rsct

版本 2020-02-10

授权版本 2020-02-10 的字符串到签名具有以下格式:

StringToSign =  signedPermissions + "\n" +
                signedStart + "\n" +
                signedExpiry + "\n" +
                canonicalizedResource + "\n" +
                signedKeyObjectId + "\n" +
                signedKeyTenantId + "\n" +
                signedKeyStart + "\n" +
                signedKeyExpiry  + "\n" +
                signedKeyService + "\n" +
                signedKeyVersion + "\n" +
                signedAuthorizedUserObjectId + "\n" +
                signedUnauthorizedUserObjectId + "\n" +
                signedCorrelationId + "\n" +
                signedIP + "\n" +
                signedProtocol + "\n" +
                signedVersion + "\n" +
                signedResource + "\n" +
                signedSnapshotTime + "\n" +
                rscc + "\n" +
                rscd + "\n" +
                rsce + "\n" +
                rscl + "\n" +
                rsct

早于 2020-02-10 的版本

早于 2020-02-10 的授权版本的 string-to-sign 具有以下格式:

StringToSign =  signedPermissions + "\n" +  
                signedStart + "\n" +  
                signedExpiry + "\n" +  
                canonicalizedResource + "\n" +  
                signedKeyObjectId + "\n" +
                signedKeyTenantId + "\n" +
                signedKeyStart + "\n" +
                signedKeyExpiry  + "\n" +
                signedKeyService + "\n" +
                signedKeyVersion + "\n" +
                signedAuthorizedUserObjectId + "\n" +
                signedUnauthorizedUserObjectId + "\n" +
                signedCorrelationId + "\n" +
                signedIP + "\n" +  
                signedProtocol + "\n" +  
                signedVersion + "\n" +  
                signedResource + "\n" +
                rscc + "\n" +
                rscd + "\n" +  
                rsce + "\n" +  
                rscl + "\n" +  
                rsct

规范化资源

字符串的 canonicalizedResource 部分是签名资源的规范化路径。 它必须包含 Blob 存储终结点和资源名称,并且必须进行 URL 解码。 Blob 路径必须包含其容器。 目录路径必须包含与 参数对应的 sdd 子目录数。

容器的规范化资源字符串必须省略提供该容器访问权限的 SAS 的尾部斜杠 (/) 。

以下示例演示如何根据资源类型构造 canonicalizedResource 字符串的 部分。

容器示例 (Azure Blob 存储)
URL = https://myaccount.blob.core.windows.net/music  
canonicalizedResource = "/blob/myaccount/music"  
Blob 示例 (Azure Blob 存储)
URL = https://myaccount.blob.core.windows.net/music/intro.mp3  
canonicalizedResource = "/blob/myaccount/music/intro.mp3"  
容器示例 (Azure Data Lake Storage Gen2)
URL = https://myaccount.dfs.core.windows.net/music  
canonicalizedResource = "/blob/myaccount/music"  
目录示例 (Azure Data Lake Storage Gen2)
URL = https://myaccount.dfs.core.windows.net/music/instruments/guitar/  
canonicalizedResource = "/blob/myaccount/music/instruments/guitar/"  
Blob 示例 (Azure Data Lake Storage Gen2)
URL = https://myaccount.dfs.core.windows.net/music/intro.mp3  
canonicalizedResource = "/blob/myaccount/music/intro.mp3"  

可选字段

如果字段是可选的且未作为 SAS 令牌的一部分提供,请为该字段指定一个空字符串。 请确保在空字符串后包含换行符 (\n)。

用户委托 SAS 示例

以下示例显示了一个 Blob URI,其中追加了用户委托 SAS 令牌。 用户委派 SAS 令牌提供对 Blob 的读取和写入权限。

https://myaccount.blob.core.windows.net/sascontainer/blob1.txt?sp=rw&st=2023-05-24T01:13:55Z&se=2023-05-24T09:13:55Z&skoid=<object-id>&sktid=<tenant-id>&skt=2023-05-24T01:13:55Z&ske=2023-05-24T09:13:55Z&sks=b&skv=2022-11-02&sip=168.1.5.60-168.1.5.70&spr=https&sv=2022-11-02&sr=b&sig=<signature>

下表描述了 URI 的每个部分:

名称 SAS 部分 说明
资源 URI https://myaccount.blob.core.windows.net/sascontainer/blob1.txt Blob 的地址。 强烈建议使用 HTTPS。
分隔符 ? 查询字符串前面的分隔符。 分隔符不是 SAS 令牌的一部分。
权限 sp=rw SAS 授予的权限包括读取 (r) 和写入 (w)。
开始时间 st=2023-05-24T01:13:55Z 以 UTC 时间格式指定。 如果想要 SAS 立即生效,则省略开始时间。
过期时间 se=2023-05-24T09:13:55Z 以 UTC 时间格式指定。
对象 ID skoid=<object-id> Microsoft Entra安全主体。
租户 ID sktid=<tenant-id> 在其中注册安全主体Microsoft Entra租户。
密钥开始时间 skt=2023-05-24T01:13:55Z 用户委托密钥生存期的开始时间。
密钥过期时间 ske=2023-05-24T09:13:55Z 用户委托密钥的生存期结束。
密钥服务 sks=b 服务值仅支持 Blob 服务。
密钥版本 skv=2022-11-02 用于获取用户委派密钥的存储服务版本。
IP 范围 sip=168.1.5.60-168.1.5.70 将从中接受请求的 IP 地址范围。
协议 spr=https 仅允许使用 HTTPS 的请求。
Blob 服务版本 sv=2022-11-02 对于 Azure 存储版本 2012-02-12 和更高版本,此参数指示要使用的版本。
资源 sr=b 资源是 Blob。
签名 sig=<signature> 用于授予对 Blob 的访问权限。 签名是使用 SHA256 算法通过字符串到签名和密钥计算的 HMAC,然后使用 Base64 编码进行编码。

撤销用户委托 SAS

如果你认为 SAS 已泄露,则应撤销它。 可以通过撤销用户委派密钥,或者更改或删除用于创建 SAS 的安全主体的 RBAC 角色分配来撤销用户委托 SAS。

重要

用户委派密钥和 RBAC 角色分配都由 Azure 存储缓存,因此启动吊销过程和现有用户委托 SAS 无效之间可能存在延迟。

撤销用户委托密钥

可以通过调用“撤销用户委派密钥”操作 来撤销用户委托密钥 。 撤销用户委托密钥时,依赖于该密钥的任何共享访问签名都无效。 然后,可以再次调用 “获取用户委派密钥” 操作,并使用密钥创建新的共享访问签名。 这是撤销用户委托 SAS 的最快方法。

更改或删除角色分配

可以更改或删除用于创建 SAS 的安全主体的 RBAC 角色分配。 当客户端使用 SAS 访问资源时,Azure 存储会验证其凭据用于保护 SAS 的安全主体是否具有资源所需的权限。

另请参阅