使用Azure Table SAS令牌使用Invoke-RestMethod读取数据

时间:2018-03-06 19:54:18

标签: powershell azure-table-storage

我想知道是否可以在使用PowerShell对Azure表进行REST API调用时使用SAS令牌作为授权标头。我已经创建了一个测试帐户SAS并尝试传递实际的令牌值,从" sr ="开始。标签以及完整的URI,但我收到以下错误:

  

Invoke-RestMethod:     AuthenticationFailed     服务器无法验证请求。确保正确形成Authorization标头的值,包括签名。

$resource = "$tableName(PartitionKey='$domain',RowKey='$apiKey')"
$tableUrl = "https://$storageAccount.table.core.windows.net/$resource"

$sasReadToken = "SharedAccessSignature ?sv=2017-07-29&ss=t&srt=o&sp=r&se=2019-03-07T02:37:08Z&st=2018-03-06T18:37:08Z&spr=https&sig=<removed>"

$GMTTime = (Get-Date).ToUniversalTime().toString('R')

$header = @{
    Authorization = $sasReadToken;
    'x-ms-date'    = $GMTTime;
    Accept         = "application/json;odata=fullmetadata";
}

$result = Invoke-RestMethod -Uri $tableUrl -Headers $header -Method Get -Verbose

虽然我意识到有一个AzureRm模块来处理其中的一些,但我不想在主机PC上安装不必要的库。这甚至可能吗?

注意:我的示例中已删除签名。

2 个答案:

答案 0 :(得分:0)

SAS令牌在Authorization标头中无效。它们仅作为查询字符串参数的集合有效。

有关Azure存储SAS令牌的详细信息,请参阅https://docs.microsoft.com/en-us/azure/storage/common/storage-dotnet-shared-access-signature-part-1

答案 1 :(得分:0)

我能够使用我的SAS作为URI的一部分,使用以下代码对存储进行身份验证。 请注意,SAS令牌是$ tableUri变量的一部分,而不是标题的一部分。我还必须在标头中添加Accept = 'application/json;odata=nometadata'参数,否则我收到(415)错误(不支持的媒体类型)。最后,我必须在PowerShell中添加-UseBasicParsing来读取返回的数据。

function Get-MyAdvisorToken {
[cmdletbinding()]
param (
    [parameter()]$MyAdvisorApiKey,
    [parameter()]$DomainName
)

#retrieves SaSToken from Azure Table when supplying the API KEY and DOMAIN
$partitionKey = $DomainName #partitionKey
$rowKey = $MyAdvisorApiKey #rowKey
$sasReadToken = "?sv=2017-07-29&ss=t&srt=o&sp=r&se=2018-03-06T19:37:08Z&st=2018-03-06T18:37:08Z&spr=https&sig=<removed>"
$tableUri = "https://$storageAccount.table.core.windows.net/$tableName(PartitionKey='$partitionKey',RowKey='$rowKey')$sasReadToken"

$GMTTime = (Get-Date).ToUniversalTime().toString('R')
$header = @{
    'x-ms-date'    = $GMTTime;
    Accept = 'application/json;odata=nometadata'
}

$result = Invoke-WebRequest -Uri $tableUri -Headers $header -UseBasicParsing
$jsonResult = $result.Content | ConvertFrom-Json
return $jsonResult
}