使用 Azure REST API 指定 SAS 令牌授权标头

问题描述 投票:0回答:2

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 设备无法生成此信息。

azure azure-rest-api
2个回答
2
投票

不幸的是,您无法在授权标头中传递 SAS 令牌。它必须是您的请求 URL 的一部分。

但是,您可以采取一些措施来减少请求 URL 长度。

  • 对队列使用 Service SAS 而不是 Account SAS。这将从 SAS 令牌中删除
    ss=btqf&srt=sco
    。相反,您会得到
    sr=q
  • 查看是否可以省略 SAS 开始日期 (
    st
    ),因为它是可选的。如果 SAS 令牌中未包含 SAS 开始日期,则 SAS 令牌立即生效。
  • 仅使用您需要的权限。现在您的 SAS 令牌拥有所有权限。通过将权限限制为仅所需的权限,您可以进一步减少请求 URL 的长度。由于您只是查看消息,因此您只需要
    read
    许可 (
    sp=r
    )。
  • 查看是否可以在访问策略中移动 SAS 令牌相关参数。这样您的 SAS 令牌将只有签名版本、访问策略和签名参数。

0
投票

也许另一种选择是将 CDN 放在 Blob 存储前面,作为授权标头传递到 CDN,并有一个重写规则,从授权标头获取它并作为查询字符串附加到 Blob 存储源?

© www.soinside.com 2019 - 2024. All rights reserved.