你当前正在访问 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 用户委派 SAS。 作为安全最佳做法,我们建议尽可能使用 Microsoft Entra 凭据,而不是帐户密钥,这可能会更容易受到损害。 当应用程序设计需要共享访问签名时,请使用 Microsoft Entra 凭据创建用户委托 SAS,以帮助确保更好的安全性。

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

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

注意

共享访问签名是授予存储资源权限的密钥,应保护它们,就像保护帐户密钥一样。 保护 SAS 免受恶意或意外使用的影响非常重要。 在分发 SAS 时使用自由裁量权,并制定计划来撤销已泄露的 SAS。 应仅通过 HTTPS 连接执行使用共享访问签名的操作,而共享访问签名 URI 应仅分发到安全连接(如 HTTPS)上。

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

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

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

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

用户委托 SAS 对用户 OID 的支持

用户委托 SAS 支持在授权版本 (saoid) 为 2020-02-10 或更高版本时,suoidsv 参数中携带的可选用户对象标识符(OID)。 saoidsuoid 参数对应于使用 SAS 的最终用户的安全主体,并为 Hadoop 和 Spark 等多用户群集工作负荷提供增强的授权模型。

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

若要详细了解可选的 saoidsuoid 参数,请参阅 指定已签名的用户对象 ID

授权用户委派 SAS

当客户端使用用户委托 SAS 访问 Blob 存储资源时,将使用用于创建 SAS 的 Microsoft Entra 凭据对 Azure 存储的请求进行授权。 客户端对资源的访问权限由以下权限决定:

  • 向请求用户委派密钥的 Microsoft Entra 安全主体授予的基于角色的访问控制(RBAC)权限。
  • 向请求用户委派密钥的安全主体授予的 POSIX 访问控制列表 (ACL) 权限。 仅当 RBAC 权限无法授予访问权限,并且仅在存储帐户上启用分层命名空间时,才会进行此附加检查。
  • 在 SAS 令牌上显式授予的权限。

此方法提供了额外的安全性级别,可帮助你避免使用应用程序代码存储帐户访问密钥。 出于这些原因,使用 Microsoft Entra 凭据创建 SAS 是一种安全最佳做法。

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

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

  1. 使用 RBAC 或 POSIX ACL 向将请求用户委派密钥的安全主体授予所需的权限。
  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 令牌,因此只要密钥仍然有效,就不需要续订令牌。 可以指定密钥在最长七天内有效。

构造用户委托 SAS

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

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

例如,sip=198.51.100.0sip=198.51.100.10-198.51.100.20
signedProtocol spr 可选 2015-04-05 及更高版本 指定允许使用 SAS 发出的请求的协议。 包含此字段,要求使用 SAS 令牌发出的请求使用 HTTPS。
signedObjectId skoid 必须 2018-11-09 及更高版本 指定Microsoft Entra 安全主体的对象 ID。 此对象 ID 对应于请求用户委托密钥的安全主体。

在授权操作之前,Azure 存储会根据对象 ID 检查 RBAC 权限。 如果 RBAC 权限无法授予访问权限,则 Azure 存储会根据对象 ID 检查 POSIX ACL 权限。
signedTenantId sktid 必须 2018-11-09 及更高版本 指定在其中定义安全主体的 Microsoft Entra 租户。
signedKeyStartTime skt 必需。 2018-11-09 及更高版本 该值由 获取用户委派密钥 操作返回。 指示用户委托密钥生存期的开始,以接受的 ISO 8601 UTC 格式之一表示。 有关接受的 UTC 格式的详细信息,请参阅 格式日期/时间值
signedKeyExpiryTime ske 必须 2018-11-09 及更高版本 该值由 获取用户委派密钥 操作返回。 指示用户委托密钥的生命周期结束,以接受的 ISO 8601 UTC 格式之一表示。 有关接受的 UTC 格式的详细信息,请参阅 格式日期/时间值
signedKeyVersion skv 必须 2018-11-09 及更高版本 该值由 获取用户委派密钥 操作返回。 指定用于获取用户委派密钥的存储服务版本。 此字段必须指定版本 2018-11-09 或更高版本。
signedKeyService sks 必须 2018-11-09 及更高版本 指示用户委派密钥有效的服务。 目前仅支持 Blob 存储。
signedAuthorizedObjectId saoid 可选 2020-02-10 及更高版本 指定由用户委托密钥所有者授权执行 SAS 令牌授予的操作的 Microsoft Entra 安全主体的对象 ID。 此对象 ID 对应于 SAS 最终用户的安全主体。 不会对 POSIX 访问控制列表(ACL)执行其他权限检查。
signedUnauthorizedObjectId suoid 可选 2020-02-10 及更高版本 指定启用分层命名空间时Microsoft Entra 安全主体的对象 ID。 此对象 ID 对应于 SAS 最终用户的安全主体。 在授权操作之前,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 令牌中指定的值。

指定已签名的版本字段

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

指定已签名的资源字段

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

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

指定签名有效期

signedStartst)和 signedExpiryse)字段指示 SAS 的开始时间和到期时间。 signedExpiry 字段是必需的。 signedStart 字段是可选的。 如果省略,则当前 UTC 时间将用作开始时间。

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

有关接受的 UTC 格式的详细信息,请参阅 格式日期/时间值

指定权限

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

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

racwdxltmeop

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

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

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

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

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

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

指定 IP 地址或 IP 范围

可选 signedIpsip)字段指定要从中接受请求的公共 IP 地址或一系列公共 IP 地址。 如果请求源自的 IP 地址与 SAS 令牌上指定的 IP 地址或地址范围不匹配,则请求不会获得授权。 仅支持 IPv4 地址。

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

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

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

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

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

指定 HTTP 协议

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

注意

无法为 spr 字段指定 HTTP。

指定已签名的对象 ID

用户委派 SAS 需要 signedObjectIdskoid)字段。 获取用户委派密钥 操作将返回此值作为响应的一部分。 已签名的对象 ID 是一个 GUID 值,用于为Microsoft标识平台中的安全主体提供不可变标识符。

指定签名的租户 ID

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

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

必需的 signedKeyStartTimeskt) 字段指示 ISO 日期格式的用户委派密钥生存期的开始时间。 获取用户委派密钥 操作将返回此值作为响应的一部分。

指定签名的密钥过期时间

ISO 日期格式的用户委派 SAS 需要 signedKeyExpiryTimeske)字段。 获取用户委派密钥 操作将返回此值作为响应的一部分。 已签名的密钥过期时间表示用户委派密钥的生存期结束。 从 SAS 开始时间起,过期时间的值最多可能为七天。

指定已签名密钥服务

用户委派 SAS 需要 signedKeyServicesks)字段。 获取用户委派密钥 操作将返回此值作为响应的一部分。 已签名的密钥服务字段指示用户委派密钥有效的服务。 Blob 存储的已签名密钥服务字段的值 b

指定已签名密钥版本

用户委派 SAS 需要 signedkeyversionskv)字段。 获取用户委派密钥 操作将返回此值作为响应的一部分。 signedkeyversion 字段指定用于获取用户委派密钥的存储服务版本。 此字段必须指定版本 2018-11-09 或更高版本。

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

可选的 signedAuthorizedObjectIdsaoid)和 signedUnauthorizedObjectIdsuoid)字段支持与 Azure Data Lake Storage 工作负载的 Apache Hadoop 和 Apache Ranger 集成。 使用 SAS 令牌上的以下字段之一为安全主体指定对象 ID:

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

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

通过在 saoidsuoid 字段中指定对象 ID,还可以通过以下方式限制与目录或 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 的所有者。
    • signedPermissionssp)权限外,Ownershipo)字段的值还必须包含 Permissionsp)权限。

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

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

指定关联 ID

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

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

指定目录深度

如果 signedResource 字段指定目录(sr=d),则还必须指定 signedDirectoryDepthsdd)字段,以指示根目录下的子目录数。 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 存储的 blob 的 Content-Type 标头值。

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

指定加密范围

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

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

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

指定签名

signaturesig)字段用于授权客户端使用共享访问签名发出的请求。 字符串到签名是从必须验证以授权请求的字段构造的唯一字符串。 签名是通过 SHA256 算法通过字符串到签名和密钥计算的 HMAC,然后使用 Base64 编码进行编码。

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

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

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

授权版本 2020-12-06 及更高版本的字符串到签名具有以下格式:

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 的授权版本的字符串到签名具有以下格式:

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)
URL = https://myaccount.dfs.core.windows.net/music  
canonicalizedResource = "/blob/myaccount/music"  
目录示例(Azure Data Lake Storage)
URL = https://myaccount.dfs.core.windows.net/music/instruments/guitar/  
canonicalizedResource = "/blob/myaccount/music/instruments/guitar/"  
Blob 示例(Azure Data Lake Storage)
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=198.51.100.10-198.51.100.20&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=198.51.100.10-198.51.100.20 将从中接受请求的 IP 地址范围。
协议 spr=https 仅允许使用 HTTPS 的请求。
Blob 服务版本 sv=2022-11-02 对于 Azure 存储版本 2012-02-12 及更高版本,此参数指示要使用的版本。
资源 sr=b 资源是 Blob。
签名 sig=<signature> 用于授权访问 Blob。 签名是一个 HMAC,它通过使用 SHA256 算法通过字符串到签名和密钥进行计算,然后使用 Base64 编码进行编码。

撤销用户委派 SAS

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

重要

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

撤销用户委派密钥

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

更改或删除角色分配或 ACL

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

另请参阅