0

我无法使用此文档查询存储表。

这是我用来获取共享密钥以针对 Azure 存储表进行身份验证的函数。

function Get-SharedKeyLiteAuthHeader {
    param(
        [Parameter(Mandatory = $TRUE)]
        [String]
        $StorageAccount,
        [Parameter(Mandatory = $TRUE)]
        [String]
        $TableName,
        [Parameter(Mandatory = $TRUE)]
        [String]
        $AccessKey,
        [Parameter(Mandatory = $FALSE)]
        [String]
        $Version = "2020-04-08"
    )
    $GMTTime = (Get-Date).ToUniversalTime().toString('R')
    $StringToSign = "$GMTTime`n/$($StorageAccount)/$($TableName)"
    $Hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $Hmacsha.key = [Convert]::FromBase64String($AccessKey)
    $Signature = $Hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($StringToSign))
    $Signature = [Convert]::ToBase64String($Signature)

    return @{
        'x-ms-date'    = $GMTTime
        Authorization  = "SharedKeyLite " + $StorageAccount + ":" + $Signature
        "x-ms-version" = $Version
        Accept         = "application/json;odata=fullmetadata"
    }
}

这是我正在进行的 REST 调用,它返回所有表条目并返回状态代码 200。

$Uri = "https://$($StorageAccount).table.core.windows.net/$($TableName)"
$Headers = Get-SharedKeyLiteAuthHeader -StorageAccount $StorageAccount -TableName $TableName -AccessKey $AccessKey

$AllEntries = Invoke-RestMethod -Method GET -Uri $Uri -Headers $Headers -ContentType application/json

这是我正在进行的返回 403 AuthenticationFailed 的 REST 调用。

$Uri = "https://$($StorageAccount).table.core.windows.net/$($TableName)()?$top=2"
$Headers = Get-SharedKeyLiteAuthHeader -StorageAccount $StorageAccount -TableName $TableName -AccessKey $AccessKey

$SomeEntries = Invoke-RestMethod -Method GET -Uri $Uri -Headers $Headers -ContentType application/json

我的最终目标是按 date 过滤,但我无法让任何查询参数正常工作。我怀疑这与缺少标题元素有关,但我无法确定这些可能是什么,因为讨论所需标题元素的文档列出了我已经指定的所有元素。

任何帮助表示赞赏 - 谢谢。

4

1 回答 1

0

尝试更改 URL,只需删除()

https://$($StorageAccount).table.core.windows.net/$($TableName)?$top=2

在此处输入图像描述


我试过你的代码,它返回AuthenticationFailed

Invoke-RestMethod : {"odata.error":{"code":"AuthenticationFailed","message":{"lang":"en-US","value":"Server failed to authenticate the request. Make sure the value of Authorization 
header is formed correctly including the signature.

也许你会StringToSign在收到这个错误时改变。但是,它是正确的,无需添加查询字符串,请参见此处

查询字符串应包含问号和 comp 参数(例如,?comp=metadata)。查询字符串中不应包含其他参数。

于 2021-02-05T02:42:18.030 回答