SO 上有大量关于在使用 SAS 令牌作为 URI 的一部分时如何不需要授权标头的帖子。这些帖子是正确的,并且以下代码有效:
Dim oRequest
Dim sURL
Dim SASToken
SASToken = "sv=2021-10-04&ss=btqf&srt=sco&st=2023-01-10T14%3A23%3A49Z&se=2024-01-10T14%3A23%3A00Z&sp=rwdxftlacup&sig=MySigButNotNotMyRealSig%3D"
sURL = "https://myaccount.queue.core.windows.net/myqueue/messages?peekonly=true&numofmessages=32&" & SASToken
Set oRequest = CreateObject("MSXML2.XMLHTTP.6.0")
oRequest.Open "GET", sURL
oRequest.setRequestHeader "x-ms-date", getUTC
oRequest.Send
Wscript.Echo oRequest.Status, oRequest.statusText
Output:
200 OK
但是,我有一个 IoT 设备,将 URL 长度限制为 288 个字符。我能够制作的带有 SAS 令牌的最短 URI 是 320 个字符。除了公开我的 blob,我认为唯一的选择是实际使用 Authorization 标头,但仅将 Sas 令牌放入 Authorization 标头中是行不通的。
Dim oRequest
Dim sURL
Dim SASToken
SASToken = "sv=2021-10-04&ss=btqf&srt=sco&st=2023-01-10T14%3A23%3A49Z&se=2024-01-10T14%3A23%3A00Z&sp=rwdxftlacup&sig=MySigButNotNotMyRealSig%3D"
sURL = "https://myaccount.queue.core.windows.net/myqueue/messages?peekonly=true&numofmessages=32&" & SASToken
Set oRequest = CreateObject("MSXML2.XMLHTTP.6.0")
oRequest.Open "GET", sURL
oRequest.setRequestHeader "x-ms-date", getUTC
oRequest.setRequestHeader "Authorization", "SharedAccessSignature " & SASToken
oRequest.Send
Wscript.Echo oRequest.Status, oRequest.statusText
Output:
400 Authentication information is not given in the correct format.
Check the value of Authorization header.
我看到一些代码可以生成信息的 SHA256 哈希值并在标头中使用它,但我的 IoT 设备无法生成此信息。
不幸的是,您无法在授权标头中传递 SAS 令牌。它必须是您的请求 URL 的一部分。
但是,您可以采取一些措施来减少请求 URL 长度。
ss=btqf&srt=sco
。相反,您会得到 sr=q
。st
),因为它是可选的。如果 SAS 令牌中未包含 SAS 开始日期,则 SAS 令牌立即生效。read
许可 (sp=r
)。也许另一种选择是将 CDN 放在 Blob 存储前面,作为授权标头传递到 CDN,并有一个重写规则,从授权标头获取它并作为查询字符串附加到 Blob 存储源?