你当前正在访问 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 资源进行身份验证

对于使用共享访问签名 (SAS) 的方案,Microsoft 建议使用用户委托 SAS。 用户委托 SAS 使用Microsoft Entra凭据而不是帐户密钥进行保护。 若要了解共享访问签名,请参阅Create用户委托 SAS

服务共享访问签名 (SAS) 委托对其中一个存储服务中的资源的访问权限:Azure Blob 存储、Azure 队列存储、Azure 表存储或Azure 文件存储。 服务级别 SAS 的 URI 由 SAS 将为其委派访问权限的资源的 URI 组成,后跟 SAS 令牌。

SAS 令牌是包含授权请求所需的所有信息的查询字符串。 令牌指定客户端可以访问的资源、授予的权限以及签名有效的时间段。

SAS 还可以指定可以发起请求的受支持 IP 地址或地址范围、发出请求时可以使用的受支持协议,或指定与请求关联的可选访问策略标识符。

最后,每个 SAS 令牌都包含一个签名。

注意

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

授权服务 SAS

使用存储帐户密钥保护帐户 SAS。 创建帐户 SAS 时,客户端应用程序必须拥有帐户密钥。

若要使用Microsoft Entra凭据来保护容器或 Blob 的 SAS,请创建用户委托 SAS

服务 SAS 支持目录范围访问

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

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

构造服务 SAS

下图表示共享访问签名 URI 的各个部分。 所需部分以橙色显示。 构成 SAS 令牌的字段在后续部分中介绍。

共享访问签名 URL 的参数元素的示意图。

以下部分介绍如何指定构成服务 SAS 令牌的参数。

指定 signedVersion 字段

(signedVersionsv) 字段包含共享访问签名的服务版本。 此值指定此共享访问签名 (在 signature) 字段中使用的共享密钥授权版本。 值还指定使用此共享访问签名发出的请求的服务版本。

有关通过共享访问签名执行请求时使用哪个版本的信息,请参阅 Azure 存储服务的版本控制

有关此参数如何影响使用共享访问签名发出的请求的授权的信息,请参阅 使用共享访问签名委托访问权限

字段名称 查询参数 说明
signedVersion sv 必需。 在版本 2012-02-12 及更高版本中受支持。 用于授权和处理使用此共享访问签名发出的请求的存储服务版本。 有关详细信息,请参阅 Azure 存储服务的版本控制

确定旧版 SAS 请求的版本

在不使用 的旧方案中 signedVersion ,Blob 存储会应用规则来确定版本。 有关这些规则的详细信息,请参阅 Azure 存储服务的版本控制

重要

使用比客户端软件更新的存储服务版本的共享访问签名 URI 时,客户端软件可能会遇到意外的协议行为。 构造共享访问签名 URI 的代码应依赖于发出存储服务请求的客户端软件所理解的版本。

仅将已签名的资源指定 (Blob 存储)

所需的 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) 参数。 目录始终嵌套在容器中。

指定已签名的资源 (Azure 文件存储)

Azure 文件存储版本 2015-02-21 及更高版本支持 SAS。

signedResource 字段指定哪些资源可通过共享访问签名进行访问。 下表介绍了如何在 URI 上引用文件或共享资源。

字段名称 查询参数 说明
signedResource sr 必需。

指定 f 共享资源是否为文件。 这样做会授予对文件内容和元数据的访问权限。

指定 s 共享资源是否为共享。 这样做会授予对共享中任何文件的内容和元数据以及共享中目录和文件列表的访问权限。

指定查询参数以替代 Blob 存储 (响应标头,并且仅Azure 文件存储)

若要定义当在请求中使用共享访问签名时要返回的特定响应标头的值,你可以在查询参数中指定响应标头。 自 2013-08-15 版起,Blob 存储支持此功能,2015-02-21 版支持Azure 文件存储。 使用此功能的共享访问签名必须包括sv对于 Blob 存储设置为 2013-08-15 或更高版本的参数,或者2015-02-21对于Azure 文件存储设置为 或更高版本的参数。

下表中列出了响应标头和相应的查询参数:

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

例如,如果在使用版本 2013-08-15 或更高版本创建的共享访问签名上指定 rsct=binary 查询参数,则 Content-Type 响应标头设置为 binary。 此值将替代 Content-Type 仅为使用此共享访问签名的请求为 Blob 存储的标头值。

如果创建将响应标头指定为查询参数的共享访问签名,则必须将它们包含在用于构造签名字符串的字符串到签名中。 有关详细信息,请参阅本文后面的“构造签名字符串”部分。 有关其他示例,请参阅 服务 SAS 示例

仅) 指定表存储 (表名称

tableName 字段指定要共享的表的名称。

字段名称 查询参数 说明
tableName tn 必需。 要共享的表的名称。

指定访问策略

URI 的访问策略部分指示共享访问签名有效以及要向用户授予的权限的时间段。 下表描述了构成访问策略的 URI 部分:

字段名称 查询参数 说明
signedStart st 可选。 共享访问签名生效的时间,以接受的 ISO 8601 UTC 格式之一表示。 如果省略此参数,则将当前 UTC 时间用作开始时间。

在早于 2012-02-12 的版本中,与 之间的signedStartsignedExpiry持续时间不能超过一小时,除非使用容器策略。 有关接受的 UTC 格式的详细信息,请参阅 设置日期/时间值的格式
signedExpiry se 必需。 共享访问签名无效的时间,以接受的 ISO 8601 UTC 格式之一表示。 如果已在关联的存储访问策略中指定了此字段,则必须省略此字段。 有关接受的 UTC 格式的详细信息,请参阅 设置日期/时间值的格式
signedPermissions 1 sp 必需。 与共享访问签名关联的权限。 用户只能执行权限允许的操作。 如果已在关联的存储访问策略中指定了此字段,则必须省略此字段。
startPk 2

startRk 2
spk

srk
仅表存储。

可选,但 startPk 必须附带 startRk。 可通过此共享访问签名访问的最小分区键和行键。 键值包括两个端点。 如果省略它们,则表实体上没有可访问的下限。
endPk 2

endRk 2
epk

erk
仅表存储。

可选,但 endPk 必须附带 endRk。 可通过此共享访问签名访问的最大分区键和行键数。 键值包括两个端点。 如果省略它们,则表示可以访问的表实体上没有上限。

1 除非 signedPermissions 指定为存储访问策略的一部分,否则 URI 上的字段是必需的。
2startPk只能在表存储资源上指定 、 startRkendPkendRk 字段。

指定权限

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

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

racwdxltmeop

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

服务 SAS 无法授予对某些操作的访问权限:

  • 无法创建、删除或列出容器、队列和表。
  • 无法读取或写入容器元数据和属性。
  • 无法清除队列,并且无法写入其元数据。
  • 无法租用容器。

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

重要

共享访问签名是向存储资源授予权限的密钥,应像保护帐户密钥一样保护它们。 执行仅通过 HTTPS 连接使用共享访问签名的操作,并仅在安全连接(如 HTTPS)上分发共享访问签名 URI。

以下部分介绍了每种资源类型支持的权限。

目录、容器或 Blob 的权限

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

权限 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 上的标记。
查找 f 容器 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 上的不可变性策略或法定保留。

文件的权限

权限 URI 符号 允许的操作
读取 r 读取内容、属性和元数据。 使用 文件作为复制操作的源。
创建 c Create新文件或将文件复制到新文件。
写入 w Create或写入内容、属性、元数据。 调整文件的大小。 使用 文件作为复制操作的目标。
删除 d 删除文件。

共享的权限

权限 URI 符号 允许的操作
读取 r 读取共享中任何文件的内容、属性或元数据。 使用共享中的任何文件作为复制操作的源。
创建 c Create共享中的新文件,或将文件复制到共享中的新文件。
写入 w 对于共享中的任何文件,请创建或写入内容、属性或元数据。 调整文件的大小。 使用 文件作为复制操作的目标。 注意:不能使用服务 SAS 授予读取或写入共享属性或元数据的权限。 请改用帐户 SAS。
删除 d 删除共享中的任何文件。 注意:不能使用服务 SAS 授予删除共享的权限。 请改用帐户 SAS。
列出 l 列出共享中的文件和目录。

队列的权限

权限 URI 符号 允许的操作
读取 r 读取元数据和属性,包括消息计数。 查看消息。
添加 a 向队列中添加消息。
更新 u 更新队列中的消息。 注意:对更新使用“处理”权限,以便可以先获取要更新的消息。
进程 p 获取消息并将其从队列中删除。

表的权限

权限 URI 符号 允许的操作
查询 r 获取和查询实体。
添加 a 添加实体。 注意:更新插入操作需要“添加”和“更新”权限。
更新 u 更新实体。 注意:更新插入操作需要“添加”和“更新”权限。
删除 d 删除实体。

指定 IP 地址或 IP 范围

从版本 2015-04-05 开始,可选的 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 协议

从版本 2015-04-05 开始,可选的 signedProtocol (spr) 字段指定允许使用 SAS 发出的请求的协议。 可能的值为“HTTPS 和 HTTP”(https,http) 或“仅 HTTPS”(https)。 默认值是 https,http。 请注意,“仅限 HTTP”是不允许的值。

指定表访问范围

startPkstartRkendPkendRk 字段定义一系列与共享访问签名关联的表实体。 表查询仅返回范围内的结果,尝试使用共享访问签名在此范围之外添加、更新或删除实体将失败。

如果 startPk 等于 endPk,则共享访问签名仅授权访问表中的一个分区中的实体。

如果 startPk 等于 endPkstartRk 等于 endRk,则共享访问签名只能访问一个分区中的一个实体。

若要了解这些字段如何限制对表中实体的访问,请参阅下表:

存在的字段 约束的范围
startPk partitionKey >= startPk
endPk partitionKey <= endPk
startPk, startRk (partitionKey >startPk) || (partitionKey == startPk && rowKey >= startRk)
endPk, endRk (partitionKey <endPk) || (partitionKey == endPk && rowKey <= endRk)

指定目录深度

启用分层命名空间且 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 或更高版本支持此字段。

指定已签名的标识符

在 URI 上指定 signedIdentifier 字段时,可以将指定的共享访问签名与相应的存储访问策略相关联。 存储访问策略对一个或多个共享访问签名提供另一种控制措施,包括在需要时撤消这些签名的功能。 每个容器、队列、表或共享最多可以有五个存储访问策略。

下表介绍了如何在 URI 上引用已签名的标识符:

字段名称 查询参数 说明
signedIdentifier si 可选。 最多 64 个字符的唯一值,该值与为容器、队列或表指定的访问策略相关联。

存储访问策略包含一个签名标识符,该值最多为 64 个字符,在资源中是唯一的。 可以为共享访问签名的 URI 中的 字段指定此签名标识符 signedidentifier 的值。 在 URI 上指定签名标识符时,会将签名与存储访问策略相关联。 若要使用 REST API 建立容器级访问策略,请参阅 使用共享访问签名委托访问权限

指定加密范围

通过使用 signedEncryptionScope URI 上的 字段,可以指定客户端应用程序可以使用的加密范围。 使用 SAS 令牌上传 blob (PUT) 时,它会强制实施具有指定加密范围的服务器端加密。 GET 和 HEAD不会像以前一样受到限制和执行。

下表介绍了如何在 URI 上引用已签名的加密范围:

字段名称 查询参数 说明
signedEncryptionScope ses 可选。 指示用于加密请求内容的加密范围。

版本 2020-12-06 或更高版本支持此字段。 如果在支持的版本之前添加 ses ,则服务将返回错误响应代码 403 (禁止) 。

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

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

指定签名

使用 URI 的签名部分来授权使用共享访问签名发出的请求。 Azure 存储使用共享密钥授权方案来授权服务 SAS。

下表介绍了如何在 URI 上指定签名:

字段名称 查询参数 说明
signature sig string-to-sign 是从 字段构造的唯一字符串,必须对其进行验证才能授权请求。 签名是基于哈希的消息身份验证代码, (HMAC) 使用 SHA256 算法计算字符串到签名和密钥,然后使用 Base64 编码进行编码。

构造签名字符串

若要构造共享访问签名的签名字符串,请先从构成请求的字段中构造字符串到签名,将字符串编码为 UTF-8,然后使用 HMAC-SHA256 算法计算签名。 字符串到签名中包含的字段必须进行 URL 解码。

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

版本 2020-12-06 添加了对已签名加密范围字段的支持。 若要构造 Blob 存储资源的字符串签名,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedIP + "\n" +  
               signedProtocol + "\n" +  
               signedVersion + "\n" +  
               signedResource + "\n" +
               signedSnapshotTime + "\n" +
               signedEncryptionScope + "\n" +
               rscc + "\n" +  
               rscd + "\n" +  
               rsce + "\n" +  
               rscl + "\n" +  
版本 2018-11-09 及更高版本

版本 2018-11-09 添加了对已签名资源和已签名 blob 的支持,快照时间字段。 这些字段必须包含在字符串到签名中。 若要构造 Blob 存储资源的字符串签名,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedIP + "\n" +  
               signedProtocol + "\n" +  
               signedVersion + "\n" +  
               signedResource + "\n"
               signedSnapshotTime + "\n" +
               rscc + "\n" +  
               rscd + "\n" +  
               rsce + "\n" +  
               rscl + "\n" +  
               rsct  
版本 2015-04-05 及更高版本

版本 2015-04-05 添加了对已签名 IP 和已签名协议字段的支持。 这些字段必须包含在字符串到签名中。 若要构造 Blob 存储或Azure 文件存储资源的字符串签名,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedIP + "\n" +  
               signedProtocol + "\n" +  
               signedVersion + "\n" +  
               rscc + "\n" +  
               rscd + "\n" +  
               rsce + "\n" +  
               rscl + "\n" +  
               rsct  

若要构造表存储资源的 string-to-sign,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedIP + "\n" +  
               signedProtocol + "\n" +  
               signedVersion + "\n" +  
               startingPartitionKey + "\n"  
               startingRowKey + "\n"  
               endingPartitionKey + "\n"  
               endingRowKey  
  

若要构造队列存储资源的字符串签名,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedIP + "\n" +  
               signedProtocol + "\n" +  
               signedVersion  
  
版本 2013-08-15 至 2015-02-21

若要使用版本 2013-08-15 到 2015-02-21 为 Blob 存储或Azure 文件存储资源构造字符串签名,请使用以下格式。 对于Azure 文件存储,自版本 2015-02-21 起支持 SAS。

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedVersion + "\n" +  
               rscc + "\n" +  
               rscd + "\n" +  
               rsce + "\n" +  
               rscl + "\n" +  
               rsct  

若要构造表的 string-to-sign,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedVersion + "\n" +  
               startPk + "\n" +  
               startRk + "\n" +  
               endPk + "\n" +  
               endRk  
  

若要构造队列的字符串签名,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedVersion 
版本 2012-02-12

若要为版本 2012-02-12 的 Blob 存储资源构造字符串签名,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier + "\n" +  
               signedVersion  
早于 2012-02-12 的版本

若要为早于 2012-02-12 的版本构造 Blob 存储资源的字符串到签名,请使用以下格式:

StringToSign = signedPermissions + "\n" +  
               signedStart + "\n" +  
               signedExpiry + "\n" +  
               canonicalizedResource + "\n" +  
               signedIdentifier  
  

构造要签名的字符串时,请记住以下事项:

  • 如果字段是可选的并且未在请求中提供,则为该字段指定一个空字符串。 请确保在空字符串后包含换行符 (\n)。

  • 表的字符串到签名必须包含其他参数,即使它们是空字符串。

  • signedpermission字符串的 部分必须包含特定于每种资源类型的固定顺序的权限指定。 可以接受这些权限的任意组合,但权限字母的顺序必须与下表中的顺序相符。

    资源类型 权限顺序
    Blob racwd
    容器 racwdl
    队列 raup
    文件 rcwd
    共享 rcwdl
    raud

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

  • 如果要将请求与存储访问策略相关联,请提供 signedIdentifier 字符串部分的值。

  • 指定早于 2012-02-12 的存储服务版本的共享访问签名只能共享 Blob 或容器,并且必须省略 signedVersion 和之前的换行符。

  • 字符串的 canonicalizedResource 部分是签名资源的规范化路径。 它必须包含版本 2015-02-21 或更高版本的服务名称 (Blob 存储、表存储、队列存储或Azure 文件存储) 、存储帐户名称和资源名称,并且必须进行 URL 解码。 Blob 的名称必须包括 Blob 的容器。 表名必须为小写。

容器、队列、表或文件共享的规范化资源字符串必须省略提供该对象的访问的 SAS 的尾部斜杠 (/) 。

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

容器

对于版本 2015-02-21 及更高版本:

URL = https://myaccount.blob.core.windows.net/music  
canonicalizedResource = "/blob/myaccount/music"  

对于早于 2015-02-21 的版本:

URL = https://myaccount.blob.core.windows.net/music
canonicalizedResource = "/myaccount/music"  

Blob

对于版本 2015-02-21 及更高版本:

URL = https://myaccount.blob.core.windows.net/music/intro.mp3  
canonicalizedResource = "/blob/myaccount/music/intro.mp3"  

对于早于 2015-02-21 的版本:

URL = https://myaccount.blob.core.windows.net/music/intro.mp3
canonicalizedResource = "/myaccount/music/intro.mp3"  

文件共享

URL = https://myaccount.file.core.windows.net/music
canonicalizedResource = "/file/myaccount/music"  

文件

URL = https://myaccount.file.core.windows.net/music/intro.mp3
canonicalizedResource = "/file/myaccount/music/intro.mp3"  

队列

对于版本 2015-02-21 及更高版本:

URL = https://myaccount.queue.core.windows.net/thumbnails  
canonicalizedResource = "/queue/myaccount/thumbnails"  

对于早于 2015-02-21 的版本:

URL = https://myaccount.queue.core.windows.net/thumbnails  
canonicalizedResource = "/myaccount/thumbnails"  

如果已签名的资源是表,请确保表名采用规范化格式的小写。

对于版本 2015-02-21 及更高版本:

URL = https://myaccount.table.core.windows.net/Employees(PartitionKey='Jeff',RowKey='Price')  
canonicalizedResource = "/table/myaccount/employees"  

对于早于 2015-02-21 的版本:

URL = https://myaccount.table.core.windows.net/Employees(PartitionKey='Jeff',RowKey='Price')  
canonicalizedResource = "/myaccount/employees"  

共享访问签名的生存期和吊销

共享访问签名授予用户访问存储帐户资源的权限。 计划使用 SAS 时,请考虑 SAS 的生存期,以及在某些情况下应用程序是否需要撤销访问权限。

即席 SAS 与存储访问策略

服务 SAS 可以采用以下两种形式之一:

  • 临时 SAS:创建临时 SAS 时,如果) 省略开始时间,则 SAS 的开始时间、到期时间和权限均在 SAS URI 中指定 (或隐含。 任何类型的 SAS 都可以用作临时 SAS。

    可以使用 字段管理临时 SAS signedExpiry 的生存期。 如果要在过期后继续授予客户端对资源的访问权限,则必须颁发新签名。 建议缩短共享访问签名的生存期。 在版本 2012-02-12 之前,与存储访问策略不关联的共享访问签名的活动期限不能超过一小时。

  • 具有存储访问策略的 SAS:存储访问策略是在资源容器上定义的,该容器可以是 Blob 容器、表、队列或文件共享。 可以使用存储访问策略来管理一个或多个共享访问签名的约束。 将 SAS 与存储访问策略相关联时,SAS 会继承约束 (即开始时间、到期时间和为存储访问策略定义的权限) 。

    存储访问策略由 URI 上的 signedIdentifier 字段表示。 存储访问策略对一个或多个共享访问签名提供另一种控制措施,包括在需要时撤消这些签名的功能。

撤销 SAS

由于 SAS URI 是一个 URL,因此获取 SAS 的任何人都可以使用它,无论最初创建者是谁。 如果 SAS 是公开发布的,则世界上的任何人都可以使用它。 SAS 向拥有资源的任何人授予对资源的访问权限,直到发生以下四种情况之一:

  • 达到临时 SAS 上指定的过期时间。

  • 如果引用了存储访问策略,并且访问策略指定了过期时间,则达到 SAS 引用的存储访问策略中指定的过期时间。

    可以达到过期时间,可能是因为间隔已过,或者因为你已将存储的访问策略修改为过去的过期时间,这是撤销 SAS 的一种方法。

  • 将删除 SAS 引用的存储访问策略,这会撤销 SAS。 如果 Azure 存储找不到共享访问签名中指定的存储访问策略,则客户端无法访问 URI 指示的资源。

    如果使用与已删除策略完全相同的名称重新创建存储访问策略,则根据与该存储访问策略关联的权限,所有现有 SAS 令牌都将再次有效。 这假定 SAS 上的过期时间尚未过。 如果打算撤销 SAS,请确保在将来使用过期时间重新创建访问策略时使用不同的名称。

  • 将重新生成用于创建 SAS 的帐户密钥。 重新生成帐户密钥会导致使用该密钥的所有应用程序组件在更新为使用其他有效帐户密钥或新重新生成的帐户密钥之前无法授权。 重新生成帐户密钥是立即撤销临时 SAS 的唯一方法。

重要

共享访问签名 URI 与用于创建签名的帐户密钥和关联的存储访问策略(如果适用)相关联。 如果未指定存储访问策略,则吊销共享访问签名的唯一方法是更改帐户密钥。

最佳做法是,建议将存储访问策略与服务 SAS 结合使用。 如果选择不使用存储访问策略,请务必缩短临时 SAS 的有效期限。 有关将服务 SAS 与存储访问策略相关联的详细信息,请参阅 定义存储访问策略

服务 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&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 时间格式指定。
IP 范围 sip=168.1.5.60-168.1.5.70 将从中接受请求的 IP 地址范围。
协议 spr=https 仅允许使用 HTTPS 的请求。
Azure 存储版本 sv=2023-05-24 对于 Azure 存储版本 2012-02-12 和更高版本,此参数指示要使用的版本。
资源 sr=b 资源是 Blob。
签名 sig=<signature> 用于授予对 Blob 的访问权限。 签名是使用 SHA256 算法通过字符串到签名和密钥计算的 HMAC,然后使用 Base64 编码进行编码。

另请参阅