Powershell中的Azure API SharedKeyLite

Sam*_*ren 13 powershell azure azure-table-storage

我正在尝试在PowerShell中实现SharedKeyLite授权头函数.这是连接到Azure Tables REST API.我遗漏了一些因为我一直收到错误:

服务器无法验证请求.确保正确形成Authorization标头的值,包括签名.

   function GenerateHeader($accountName, $accountKey, $action)
{
    $xmsdate = get-date
    $xmsdate = $xmsdate.ToUniversalTime()
    $xmsdate = $xmsdate.toString('r')
    $newLine = "`n";
    $message = $xmsdate + $newline + "/" + $accountname + "/" + $action;
    $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Convert]::FromBase64String($accesskey)
    $signature = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($message))
    $signature = [Convert]::ToBase64String($signature)
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("x-ms-version", "2014-02-14")
    $headers.Add("x-ms-date", $xmsdate)
    $headers.Add("Authorization", "SharedKeyLite " + $accountName + ":" + $signature)

    return $headers
}
Run Code Online (Sandbox Code Playgroud)

更新:这是调用此函数的代码.$ action变量设置为URI字符串.

$uriString = "https://$StorageAccountName.table.core.windows.net/Tables"

$headers = GenerateHeader $StorageAccountName $StorageAccountKey "Tables"

Invoke-RestMethod -Uri $uriString -Method $method -Headers $headers -Body $body
Run Code Online (Sandbox Code Playgroud)

这是它抛出的错误.

Invoke-RestMethod:AuthenticationFailedServer无法验证请求.确保正确形成Authorization标头的值,包括签名.RequestId:4215377d-0002-0044-1a92-94cd56000000时间:2015-05-22T13:21:53.5205261Z在C:\ Users\Samuel\Source\BaseDataInstall\BaseDataInstall\AzureHelpers.ps1:45 char:2 + Invoke-RestMethod - Uri $ uriString -Method $ method -Headers $ headers -Body $ body + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ClassInfo:InvalidOperation: (System.Net.HttpWebRequest:HttpWebRequest)[Invoke-RestMethod],WebExc eption + FullyQualifiedErrorId:WebCmdletWebResponseException,Microsoft.PowerShell.Commands.InvokeRestMethodCommand

编辑:这是函数外部的$ headers变量的示例输出...

Key   : x-ms-version
Value : 2014-02-14

Key   : x-ms-date
Value : Tue, 26 May 2015 19:30:20 GMT

Key   : Authorization
Value : SharedKeyLite <MyStorageName>:lf+ndqhi4OeJhIfLljugT0dfcLbqXDBHwrQJn9Q66HQ=
Run Code Online (Sandbox Code Playgroud)

Sam*_*ren 4

所以这最终是一个简单的编码错误:(

我觉得现在发布这个有点愚蠢,但我将发布一个答案,因为我在任何地方都找不到 Powershell 中适用于 Azure 的工作授权构建器。这确实适用于 Azure 表...

function GenerateHeader($accountName, $accountKey, $action)
{
    $xmsdate = get-date
    $xmsdate = $xmsdate.ToUniversalTime()
    $xmsdate = $xmsdate.toString('R')
    $newLine = "`n";
    $action = $action.ToLower()
    $message = $xmsdate + $newline + "/" + $accountname + "/" + $action;
    $hmacsha = New-Object System.Security.Cryptography.HMACSHA256
    $hmacsha.key = [Convert]::FromBase64String($accountKey)
    $signature = $hmacsha.ComputeHash([Text.Encoding]::UTF8.GetBytes($message))
    $signature = [Convert]::ToBase64String($signature)
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("Content-Type", "application/json")
    $headers.Add("x-ms-date", $xmsdate)
    $headers.Add("Authorization", "SharedKeyLite " + $accountName + ":" + $signature)

    return $headers
}
Run Code Online (Sandbox Code Playgroud)