你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
重要
为了获得最佳安全性,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。
用户委派SAS支持Blob存储、数据湖存储、队列存储、表存储或Azure文件。 用户委派 SAS 不支持存储的访问策略。
注意
共享访问签名是授予存储资源权限的密钥,应保护它们,就像保护帐户密钥一样。 保护 SAS 免受恶意或意外使用的影响非常重要。 在分发 SAS 时使用自由裁量权,并制定计划来撤销已泄露的 SAS。 应仅通过 HTTPS 连接执行使用共享访问签名的操作,而共享访问签名 URI 应仅分发到安全连接(如 HTTPS)上。
有关使用帐户密钥保护 SAS 的信息,请参阅 创建服务 SAS,创建帐户 SAS。
用户委派 SAS 对目录范围访问的支持(仅限 Blob 存储和数据湖存储)
当授权版本(sr=d)为 2020-02-10 或更高版本且启用了分层命名空间(HNS)时,用户委派 SAS 支持目录范围(sv)。 目录范围(sr=d)的语义类似于容器范围(sr=c),但访问仅限于目录及其中的任何文件和子目录。 指定 sr=d 时,还需要 sdd 查询参数。
授权版本 2020-02-10 的字符串到签名格式保持不变。
用户委派SAS支持用户OID(仅限Blob存储和数据湖存储)
用户委托 SAS 支持在授权版本 (saoid) 为 2020-02-10 或更高版本时,suoid 或 sv 参数中携带的可选用户对象标识符(OID)。
saoid 和 suoid 参数对应于使用 SAS 的最终用户的安全主体,并为 Hadoop 和 Spark 等多用户群集工作负荷提供增强的授权模型。
SAS 令牌可以限制为特定的文件系统操作和用户,该操作提供一个不太易受攻击的访问令牌,可以更安全地在多用户群集之间分发。 这些功能的一个用例是将 Hadoop ABFS 驱动程序与 Apache Ranger 集成。
若要详细了解可选的 saoid 和 suoid 参数,请参阅 指定已签名的用户对象 ID。
授权用户委派 SAS
当客户端使用用户委托 SAS 访问 Blob 存储资源时,将使用用于创建 SAS 的 Microsoft Entra 凭据对 Azure 存储的请求进行授权。 客户端对资源的访问权限由以下权限决定:
- 向请求用户委派密钥的 Microsoft Entra 安全主体授予的基于角色的访问控制(RBAC)权限。
- 向请求用户委派密钥的安全主体授予的 POSIX 访问控制列表 (ACL) 权限。 仅当 RBAC 权限无法授予访问权限,并且仅在存储帐户上启用分层命名空间时,才会进行此附加检查。
- 在 SAS 令牌上显式授予的权限。
此方法提供了额外的安全性级别,可帮助你避免使用应用程序代码存储帐户访问密钥。 出于这些原因,使用 Microsoft Entra 凭据创建 SAS 是一种安全最佳做法。
向拥有 SAS 的客户端授予的权限是向请求用户委派密钥的安全主体授予的权限的交集,以及使用 signedPermissions(sp)字段向 SAS 令牌上的资源授予的权限。 如果未在 SAS 令牌上授予通过 RBAC 或 POSIX ACL 授予安全主体的权限,则不会向尝试使用 SAS 访问资源的客户端授予该权限。 创建用户委托 SAS 时,请确保通过 RBAC 和 POSIX ACL 授予的权限以及通过 SAS 令牌授予的权限都与客户端所需的访问级别保持一致。
若要创建用户委派 SAS,请执行以下操作:
- 使用 RBAC 或 POSIX ACL 向将请求用户委派密钥的安全主体授予所需的权限。
- 从 Microsoft Entra ID 获取 OAuth 2.0 令牌。
- 使用令牌通过调用 获取用户委派密钥 操作来请求用户委托密钥。
- 使用用户委托密钥使用相应的字段构造 SAS 令牌。
使用 RBAC 分配权限
请求用户委派密钥的安全主体需要具有相应的权限才能执行此操作。 Microsoft Entra ID 安全主体可以是用户、组、服务主体或托管标识。
要请求用户委派密钥,您必须将 Microsoft.Storage/storageAccounts/{serviceType}/generateUserDelegationKey 动作分配给安全主体。 以下内置的 RBAC 角色包括 Microsoft.Storage/storageAccounts/{serviceType}/generateUserDelegationKey 动作,可以显式使用,也可以作为通配符定义的一部分:
由于 获取用户委派密钥 操作在存储帐户级别起作用,因此 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作必须在存储帐户、资源组或订阅级别范围内。 如果为安全主体分配了前面列出的任一内置角色或自定义角色,其中包括 Microsoft.Storage/storageAccounts/blobServices/generateUserDelegationKey 操作,则在存储帐户、资源组或订阅级别,则安全主体可以请求用户委派密钥。
如果安全主体被分配了一个允许访问数据但作用范围为容器级别的角色,你还可以在存储账户、资源组或订阅级别为安全主体分配存储委 托 者角色(如存储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 存储或 Azure 文件。 指定通过共享访问签名访问哪些资源。 |
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.0 或 sip=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 及更高版本 | 仅限Blob存储。 指定由用户委托密钥所有者授权执行 SAS 令牌授予的操作的 Microsoft Entra 安全主体的对象 ID。 此对象 ID 对应于 SAS 最终用户的安全主体。 不会对 POSIX 访问控制列表(ACL)执行其他权限检查。 |
signedUnauthorizedObjectId |
suoid |
可选 | 2020-02-10 及更高版本 | 仅限Blob存储。 指定启用分层命名空间时Microsoft Entra 安全主体的对象 ID。 此对象 ID 对应于 SAS 最终用户的安全主体。 在授权操作之前,Azure 存储会针对对象 ID 执行 POSIX ACL 检查。 |
signedCorrelationId |
scid |
可选 | 2020-02-10 及更高版本 | 仅限Blob存储。 将存储审核日志与生成和分发 SAS 的主体使用的审核日志相关联。 |
signedDirectoryDepth |
sdd |
sr=d 时必需 |
2020-02-10 及更高版本 | 仅限Blob存储。 指示字符串到签名的 canonicalizedResource 字段中所指定的目录的根文件夹中的目录数。 |
signedEncryptionScope |
ses |
可选 | 2020-12-06 及更高版本 | 仅限Blob存储。 指示用于加密请求内容的加密范围。 |
tableName |
tn |
必须 | 2025-07-05及以后 | 只限桌位。 分享的桌子名称。 |
startPk
2startRk
2 |
spksrk |
可选 | 2025-07-05及以后 | 仅限桌上收纳。 可选,但 startPk 必须伴 startRk随。 通过这种共享访问签名可访问的最小分区键和行键。 关键价值观是包容性的。 如果省略了这些,表上就没有可以访问的实体下界。 |
endPk
2endRk
2 |
epkerk |
可选 | 2025-07-05及以后 | 仅限桌上收纳。 可选,但 endPk 必须伴 endRk随。 使用该共享访问签名可访问的最大分区和行键。 关键价值观是包容性的。 如果遗漏了这些,表上就没有可以访问的实体上界。 |
signature |
sig |
必须 | 全部 | 签名是基于哈希的消息身份验证代码(HMAC),它通过使用 SHA256 算法通过字符串到签名和密钥进行计算,然后使用 Base64 编码进行编码。 |
Cache-Control 响应标头 |
rscc |
可选 | 2013-08-15 及更高版本 | 仅限 Blob 存储或 Azure 文件。 Azure 存储将 Cache-Control 响应标头设置为 SAS 令牌中指定的值。 |
Content-Disposition 响应标头 |
rscd |
可选 | 2013-08-15 及更高版本 | 仅限 Blob 存储或 Azure 文件。 Azure 存储将 Content-Disposition 响应标头设置为 SAS 令牌中指定的值。 |
Content-Encoding 响应标头 |
rsce |
可选 | 2013-08-15 及更高版本 | 仅限 Blob 存储或 Azure 文件。 Azure 存储将 Content-Encoding 响应标头设置为 SAS 令牌中指定的值。 |
Content-Language 响应标头 |
rscl |
可选 | 2013-08-15 及更高版本 | 仅限 Blob 存储或 Azure 文件。 Azure 存储将 Content-Language 响应标头设置为 SAS 令牌中指定的值。 |
Content-Type 响应标头 |
rsct |
可选 | 2013-08-15 及更高版本 | 仅限 Blob 存储或 Azure 文件。 Azure 存储将 Content-Type 响应标头设置为 SAS 令牌中指定的值。 |
指定已签名的版本字段
所需的 signedVersion(sv)字段指定共享访问签名的服务版本。 此值指示用于构造 signature 字段的服务版本,并指定处理使用此共享访问签名发出的请求的服务版本。
sv 字段的值必须是版本 2018-11-09 或更高版本。
指定签名资源字段(仅限 Blob 存储)
所需的 signedResource(sr)字段指定哪些资源可通过共享访问签名访问。 下表介绍了如何引用 SAS 令牌中的 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 字段指定了目录,则还需要 signedDirectoryDepth(sdd)参数。 目录始终在容器中。 |
指定签名资源字段(仅限 Azure 文件)
所需的 signedResource(sr)字段指定哪些资源可通过共享访问签名访问。 下表描述了如何在URI上引用文件或共享资源。
| 字段名称 | 查询参数 | 说明 |
|---|---|---|
signedResource |
sr |
必需。 指定 f 共享资源是否是一个文件。 这样做可以访问文件的内容和元数据。请指定 s 共享资源是否为共享资源。 这样做可以访问共享中任何文件的内容和元数据,以及共享中目录和文件列表。 |
指定查询参数覆盖响应头(仅限 Blob 存储和 Azure 文件)
若要定义在请求中使用共享访问签名时要返回的特定响应标头的值,可以在查询参数中指定响应标头。 该功能自 Blob 存储版本 2013-08-15 起和 Azure 文件版本 2015-02-21 起支持。 使用此功能的共享访问签名必须包含 sv 设置为或 2013-08-15 更高版本的参数(适用于Blob存储),或 2015-02-21 设置为或更高版本的Azure文件。
响应头和对应的查询参数列于下表:
| 响应标头名称 | 相应的 SAS 查询参数 |
|---|---|
Cache-Control |
rscc |
Content-Disposition |
rscd |
Content-Encoding |
rsce |
Content-Language |
rscl |
Content-Type |
rsct |
例如,如果你在共享访问签名中指定 rsct=binary 查询参数,该签名是在2013-08-15版本或更高版本创建的,响应 Content-Type 头被设置为 binary。 该值覆盖 Content-Type 仅使用该共享访问签名请求的 blob 头部值。
如果你创建了一个共享访问签名,将响应头作为查询参数,你必须将它们包含在用于构建签名字符串的字符串-符号中。 欲了解更多信息,请参见本文后面的 “指定签名 ”部分。 更多示例请参见 SAS服务示例。
指定签名有效期
signedStart(st)和 signedExpiry(se)字段指示 SAS 的开始时间和到期时间。
signedExpiry 字段是必需的。
signedStart 字段是可选的。 如果省略,则当前 UTC 时间将用作开始时间。
对于用户委派 SAS,SAS 的开始时间和过期时间应位于为用户委派密钥定义的时间间隔内。 如果客户端在用户委托密钥过期后尝试使用 SAS,则无论 SAS 本身是否仍然有效,SAS 都会失败并显示授权错误。
有关接受的 UTC 格式的详细信息,请参阅 格式日期/时间值。
指定表名称(仅表存储)
该 tableName 字段指定要共享的表格名称。
| 字段名称 | 查询参数 | 说明 |
|---|---|---|
tableName |
tn |
必需。 分享的桌子名称。 |
指定权限
为 SAS 令牌上的 signedPermissions (sp) 字段指定的权限指示拥有 SAS 的客户端可以在资源上执行的操作。
权限可以组合在一起,以允许客户端使用相同的 SAS 执行多个操作。 构造 SAS 时,必须按以下顺序包括权限:
racwdxltmeop
容器的有效权限设置示例包括 rw、rd、rl、wd、wl和 rl。 无效设置的示例包括 wr、dr、lr和 dw。 不允许多次指定权限。
用户委派 SAS 无法授予对某些操作的访问权限:
- 容器、队列和表不能被创建、删除或列出。
- 无法读取或写入容器元数据和属性。
- 队列无法被清除,元数据也无法被写入。
- 无法租用容器。
若要构造授予对这些操作的访问权限的 SAS,请使用帐户 SAS。 有关详细信息,请参阅 创建帐户 SAS。
目录、容器或 blob 的权限
下表描述了每种资源类型支持的权限:
| 权限 | URI 符号 | 资源 | 版本支持 | 允许的操作 |
|---|---|---|---|---|
| 读取 | r | 容器 目录 团块 |
全部 | 读取容器或目录中任何 Blob 的内容、阻止列表、属性和元数据。 使用 Blob 作为复制操作的源。 |
| 添加 | 一个 | 容器 目录 团块 |
全部 | 向追加 Blob 添加块。 |
| 创建 | c | 容器 目录 团块 |
全部 | 编写新的 Blob、快照 blob 或将 Blob 复制到新 Blob。 |
| 写入 | w | 容器 目录 团块 |
全部 | 创建或写入内容、属性、元数据或阻止列表。 快照或租用 Blob。 调整 Blob 的大小(仅页 Blob)。 使用 Blob 作为复制操作的目标。 |
| 删除 | d | 容器 目录 团块 |
全部 | 删除 Blob。 对于版本 2017-07-29 及更高版本,Delete 权限还允许中断 Blob 上的租约。 有关详细信息,请参阅 租用 Blob 操作。 |
| 删除版本 | x | 容器 团块 |
2019-12-12 及更高版本 | 删除 Blob 版本。 |
| 永久删除 | y | 团块 | 2020-02-10 及更高版本 | 永久删除 Blob 快照或版本。 |
| 列表 | l | 容器 目录 |
全部 | 以非递归方式列出 Blob。 |
| 标记 | t | 团块 | 2019-12-12 及更高版本 | 读取或写入 Blob 上的标记。 |
| 移动 | m | 容器 目录 团块 |
2020-02-10 及更高版本 | 将 Blob 或目录及其内容移动到新位置。 如果 SAS 令牌中包含 saoid 参数,并且粘滞位在父目录上设置,则可以选择性地将此操作限制为子 blob、目录或父目录的所有者。 |
| 执行 | e | 容器 目录 团块 |
2020-02-10 及更高版本 | 获取系统属性,如果为存储帐户启用了分层命名空间,则获取 Blob 的 POSIX ACL。 如果启用了分层命名空间,并且调用方是 Blob 的所有者,则此权限授予设置拥有组、POSIX 权限和 Blob 的 POSIX ACL 的能力。 它不允许调用方读取用户定义的元数据。 |
| 所有权 | o | 容器 目录 团块 |
2020-02-10 及更高版本 | 启用分层命名空间后,此权限使调用方能够设置所有者或拥有组,或者在调用方重命名或删除具有粘滞位集的目录中的目录或 blob 时充当所有者。 |
| 权限 | p | 容器 目录 团块 |
2020-02-10 及更高版本 | 启用分层命名空间后,此权限允许调用方在目录和 Blob 上设置权限和 POSIX ACL。 |
| 设置不可变性策略 | 我 | 容器 团块 |
2020-06-12 及更高版本 | 设置或删除 Blob 的不可变性策略或法定保留。 |
文件权限
| 权限 | URI 符号 | 允许的操作 |
|---|---|---|
| 读取 | r | 阅读内容、属性、元数据。 使用该文件作为复制作的源代码。 |
| 写入 | w | 创建一个新文件,或者将文件复制到新文件。 创建或编写内容、属性、元数据。 调整文件大小。 将该文件作为复制作的目的地。 |
| 删除 | d | 删除文件。 |
共享权限
| 权限 | URI 符号 | 允许的操作 |
|---|---|---|
| 读取 | r | 阅读共享中任何文件的内容、属性或元数据。 使用共享中的任何文件作为复制作的源文件。 |
| 写入 | w | 在共享中创建新文件,或将文件复制到共享中的新文件。 对于共享中的任何文件,创建或写入内容、属性或元数据。 调整文件大小。 将该文件作为复制作的目的地。 注意:你不能通过服务SAS授予读写共享属性或元数据的权限。 改用SAS账户吧。 |
| 删除 | d | 删除分享中的任何文件。 注意:你不能通过服务SAS授权删除共享。 改用SAS账户吧。 |
| 列表 | l | 在共享中列出文件和目录。 |
队列权限
| 权限 | URI 符号 | 允许的操作 |
|---|---|---|
| 读取 | r | 阅读元数据和属性,包括消息数量。 偷看消息。 |
| 添加 | 一个 | 将消息添加到队列中。 |
| Update | u | 更新队列中的消息。 注意:使用更新的进程权限,这样你才能先收到你想更新的消息。 |
| 流程 | p | 从队列中获取和删除消息。 |
表的权限
| 权限 | URI 符号 | 允许的操作 |
|---|---|---|
| Query | r | 获取实体并查询实体。 |
| 添加 | 一个 | 添加实体。 注意:上传作需要添加和更新权限。 |
| Update | u | 更新实体。 注意:上传作需要添加和更新权限。 |
| 删除 | d | 删除实体。 |
指定 IP 地址或 IP 范围
可选 signedIp(sip)字段指定要从中接受请求的公共 IP 地址或一系列公共 IP 地址。 如果请求源自的 IP 地址与 SAS 令牌上指定的 IP 地址或地址范围不匹配,则请求不会获得授权。 仅支持 IPv4 地址。
指定 IP 地址范围时,范围是非独占的。 例如,在 SAS 上指定 sip=198.51.100.0 或 sip=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 协议
可选 signedProtocol(spr)字段指定允许使用 SAS 发出的请求的协议。 可能的值为 HTTPS 和 HTTP(https,http)或仅 HTTPS(https)。 默认值是 https,http。
注意
无法为 spr 字段指定 HTTP。
指定表访问范围
startPk这些 、 startRk、 endPk和 endRk 字段定义了一系列与共享访问签名相关的表实体。 表查询只返回该范围内的结果,尝试使用共享访问签名添加、更新或删除超出范围的实体将失败。
如果 startPk 等于 endPk,共享访问签名授权访问表中仅一个分区的实体。
如果 startPk 相 endPk 等且 startRk 相等 endRk,共享访问签名只能访问一个分区内的一个实体。
要理解这些字段如何限制对表格中实体的访问,请参考下表:
| 现有场域 | 约束范围 |
|---|---|
startPk |
partitionKey >= startPk |
endPk |
partitionKey <= endPk |
startPk、startRk |
(partitionKey >startPk)||(partitionKey == startPk && rowKey >= startRk) |
endPk、endRk |
(partitionKey <endPk)||(partitionKey == endPk && rowKey <= endRk) |
指定已签名的对象 ID
用户委派 SAS 需要 signedObjectId(skoid)字段。
获取用户委派密钥 操作将返回此值作为响应的一部分。 已签名的对象 ID 是一个 GUID 值,用于为Microsoft标识平台中的安全主体提供不可变标识符。
指定签名的租户 ID
用户委派 SAS 需要 signedTenantId(sktid)字段。
获取用户委派密钥 操作将返回此值作为响应的一部分。 签名的租户 ID 是一个 GUID 值,表示在其中定义安全主体的 Microsoft Entra 租户。
指定已签名的密钥开始时间
必需的 signedKeyStartTime (skt) 字段指示 ISO 日期格式的用户委派密钥生存期的开始时间。
获取用户委派密钥 操作将返回此值作为响应的一部分。
指定签名的密钥过期时间
ISO 日期格式的用户委派 SAS 需要 signedKeyExpiryTime(ske)字段。
获取用户委派密钥 操作将返回此值作为响应的一部分。 已签名的密钥过期时间表示用户委派密钥的生存期结束。 从 SAS 开始时间起,过期时间的值最多可能为七天。
指定已签名密钥服务
用户委派 SAS 需要 signedKeyService(sks)字段。
获取用户委派密钥 操作将返回此值作为响应的一部分。 已签名的密钥服务字段指示用户委派密钥有效的服务。 Blob 存储的已签名密钥服务字段的值 b。
指定已签名密钥版本
用户委派 SAS 需要 signedkeyversion(skv)字段。
获取用户委派密钥 操作将返回此值作为响应的一部分。
signedkeyversion 字段指定用于获取用户委派密钥的存储服务版本。 此字段必须指定版本 2018-11-09 或更高版本。
指定安全主体的已签名用户对象 ID
可选的 signedAuthorizedObjectId(saoid)和 signedUnauthorizedObjectId(suoid)字段支持与 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 字段中捕获。 若要使用 saoid 或 suoid 字段在 SAS 令牌上指定对象 ID, 必须在 skoid 字段中标识的安全主体分配一个 RBAC 角色,该角色包括 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/runAsSuperUser/action 或 Microsoft.Storage/storageAccounts/blobServices/containers/blobs/manageOwnership/action。 有关这些操作的详细信息,请参阅 Azure 资源提供程序操作。
通过在 saoid 或 suoid 字段中指定对象 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 的所有者。
- 除
signedPermissions(sp)权限外,Ownership(o)字段的值还必须包含Permissions(p)权限。
使用 SAS 令牌发出请求时,saoid 或 suoid 字段中指定的对象 ID 包含在诊断日志中。
仅当 saoid(suoid)字段设置为版本 2020-02-10 或更高版本时,才支持 signedVersion 或 sv 字段。 SAS 令牌中只能包含其中一个字段。
指定关联 ID
signedCorrelationId(scid)字段指定一个关联 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 存储的 blob 的 Content-Type 标头值。
如果创建将响应标头指定为查询参数的共享访问签名,则必须在用于构造签名字符串的字符串到签名中包含这些响应标头。 有关详细信息,请参阅“指定签名”部分。
指定加密范围
signed encryption scope(ses)字段指定客户端应用程序在通过 放置 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(错误请求)。
指定签名
signature(sig)字段用于授权客户端使用共享访问签名发出的请求。 字符串到签名是从必须验证以授权请求的字段构造的唯一字符串。 签名是通过 SHA256 算法通过字符串到签名和密钥计算的 HMAC,然后使用 Base64 编码进行编码。
若要构造用户委托 SAS 的签名字符串,请从构成请求的字段创建字符串到签名,将字符串编码为 UTF-8,然后使用 HMAC-SHA256 算法计算签名。 字符串到签名中包含的字段必须进行 URL 解码。
字符串到签名中所需的字段取决于用于授权的服务版本(sv 字段)。 以下部分介绍支持用户委派 SAS 的版本的字符串到签名配置。
版本 2025-07-05 及更高版本
授权版本为2025-07-05及以上的Blob存储的字符串到签名格式如下:
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" +
"\n" +
"\n" +
signedIP + "\n" +
signedProtocol + "\n" +
signedVersion + "\n" +
signedResource + "\n" +
signedSnapshotTime + "\n" +
signedEncryptionScope + "\n" +
rscc + "\n" +
rscd + "\n" +
rsce + "\n" +
rscl + "\n" +
rsct
授权版本为2025-07-05及以后表存储的字符串到符号格式如下:
StringToSign = signedPermissions + "\n" +
signedStart + "\n" +
signedExpiry + "\n" +
canonicalizedResource + "\n" +
signedKeyObjectId + "\n" +
signedKeyTenantId + "\n" +
signedKeyStart + "\n" +
signedKeyExpiry + "\n" +
signedKeyService + "\n" +
signedKeyVersion + "\n" +
"\n" +
"\n" +
signedIP + "\n" +
signedProtocol + "\n" +
signedVersion + "\n" +
startingPartitionKey + "\n"
startingRowKey + "\n"
endingPartitionKey + "\n"
endingRowKey
授权版本为2025-07-05及以后版本的队列存储的字符串到签名格式如下:
StringToSign = signedPermissions + "\n" +
signedStart + "\n" +
signedExpiry + "\n" +
canonicalizedResource + "\n" +
signedKeyObjectId + "\n" +
signedKeyTenantId + "\n" +
signedKeyStart + "\n" +
signedKeyExpiry + "\n" +
signedKeyService + "\n" +
signedKeyVersion + "\n" +
"\n" +
"\n" +
signedIP + "\n" +
signedProtocol + "\n" +
signedVersion
授权版本为2025-07-05及以上的Azure文件的字符串签名格式如下:
StringToSign = signedPermissions + "\n" +
signedStart + "\n" +
signedExpiry + "\n" +
canonicalizedResource + "\n" +
signedKeyObjectId + "\n" +
signedKeyTenantId + "\n" +
signedKeyStart + "\n" +
signedKeyExpiry + "\n" +
signedKeyService + "\n" +
signedKeyVersion + "\n" +
"\n" +
"\n" +
signedIP + "\n" +
signedProtocol + "\n" +
signedVersion + "\n" +
rscc + "\n" +
rscd + "\n" +
rsce + "\n" +
rscl + "\n" +
rsct
版本 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 存储终结点( blob 或 dfs)和资源名称,并且必须进行 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"
文件共享
针对2025-07-05及以后版本:
URL = https://myaccount.file.core.windows.net/music
canonicalizedResource = "/file/myaccount/music"
文件存储
针对2025-07-05及以后版本:
URL = https://myaccount.file.core.windows.net/music/intro.mp3
canonicalizedResource = "/file/myaccount/music/intro.mp3"
Queues
针对2025-07-05及以后版本:
URL = https://myaccount.queue.core.windows.net/thumbnails
canonicalizedResource = "/queue/myaccount/thumbnails"
Tables
如果签名资源是表,确保表名在规范化格式中为小写。
针对2025-07-05及以后版本:
URL = https://myaccount.table.core.windows.net/Employees(PartitionKey='Jeff',RowKey='Price')
canonicalizedResource = "/table/myaccount/employees"
可选字段
如果字段是可选的,但不作为 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 的安全主体是否具有资源所需的权限。