microsoft azure table authentication stringtosign error

时间:2014-09-05 05:58:27

标签: azure azure-storage azure-table-storage

我遇到了对azure table分页查询进行stringtosign身份验证的问题。

这是当前使用的stringtosign即时消息:

GET\n\n\nFri, 05 Sep 2014 03:57:11 GMT\n/mystorageaccount/mytablename\nNextPartitionKey:1!20!UmFjZSBNZW1iZXJfNA--\nNextRowKey:1!12!TmFtZV85ODE-

stringtosign身份验证有什么问题吗? 其余的标题与Fiddle完全相同。

示例

GET /mytablename?NextPartitionKey=1%2120%21UmFjZSBNZW1iZXJfNA--&NextRowKey=1%2112%21TmFtZV85ODE- HTTP/1.1
Host: mystorageaccount.table.core.windows.net
x-ms-version: 2014-02-14
x-ms-date: Fri, 05 Sep 2014 05:49:19 GMT
Authorization: SharedKey mystorageaccount:GD2w4pqsllzIOixNF/AfFqLkZhYzLpjK67a8OI7j6Go=
Accept: application/atom+xml
Accept-Charset: UTF-8
DataServiceVersion: 3.0;NetFx
MaxDataServiceVersion: 3.0;NetFx

我已阅读了两个

嗨Gaurav Mantri,

它仍然无效。我将粘贴请求,我的字符串和下面的响应:

GET /mytablename?NextPartitionKey=1%2120%21UmFjZSBNZW1iZXJfNA--&NextRowKey=1%2112%21TmFtZV85ODE- HTTP/1.1
Host: mystorageaccount.table.core.windows.net
x-ms-version: 2014-02-14
x-ms-date: Fri, 05 Sep 2014 07:05:12 GMT
Authorization: SharedKey mystorageaccount:HSYfO1Baadqcd4bQO5Q6uN1hrr2aXtLcQbFPkWgIXuw=
Accept: application/atom+xml
Accept-Charset: UTF-8
DataServiceVersion: 3.0;NetFx
MaxDataServiceVersion: 3.0;NetFx

要签名的字符串:

GET\n\n\nFri, 05 Sep 2014 07:05:12 GMT\n/mystorageaccount/mytablename\nnextpartitionkey:1!20!UmFjZSBNZW1iZXJfNA--\nnextrowkey:1!12!TmFtZV85ODE-

回应:

<?xml version=\"1.0\" encoding=\"utf-8\"?><m:error xmlns:m=\"http://schemas.microsoft.com/ado/2007/08/dataservices/metadata\"><m:code>AuthenticationFailed</m:code><m:message xml:lang=\"en-US\">Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:37272f11-0002-0014-5aa7-f7dd1c000000
Time:2014-09-05T07:05:09.5720897Z</m:message></m:error>

1 个答案:

答案 0 :(得分:2)

我有机会实际编写代码并试用它。基本上,在为表资源创建CanonicalizedResource字符串时,不需要包含除comp querystring参数之外的查询字符串参数。从本质上讲,这是您需要从文档(http://msdn.microsoft.com/library/azure/dd179428.aspx)中遵循的内容:

  

2009-09-19共享密钥精简版和表格服务格式

     

此格式支持所有版本的共享密钥和共享密钥精简版   表服务和2009-09-19版本的Shared Key Lite   Blob和队列服务以及文件服务的2014-02-14。   此格式与以前版本的格式相同   存储服务。在此构造CanonicalizedResource字符串   格式如下:

     
      
  1. 以空字符串开头(&#34;&#34;),附加正斜杠(/),后跟拥有该资源的帐户的名称   访问。
  2.   
  3. 附加资源的编码URI路径。如果请求URI指向资源的组件,请附加相应的查询   串。查询字符串应包含问号和comp   参数(例如,?comp = metadata)。不应该有其他参数   包含在查询字符串中。
  4.   

一旦你这样做,你的代码应该运行得很好。这是我写的示例代码:

    static void QueryTable()
    {
        var requestMethod = "GET";
        var storageServiceVersion = "2014-02-14";
        var date = DateTime.UtcNow.ToString("R");
        var canonicalizedResource = string.Format("/{0}/{1}", StorageAccount, TableName);
        var stringToSign = string.Format("{0}\n\n\n{1}\n{2}", requestMethod, date, canonicalizedResource);
        var authorizationHeader = GetAuthorizationHeader(stringToSign);
        using (var httpClient = new HttpClient())
        {
            httpClient.BaseAddress = new Uri(TableEndpoint);
            httpClient.DefaultRequestHeaders.Clear();
            httpClient.DefaultRequestHeaders.Add("x-ms-date", date);
            httpClient.DefaultRequestHeaders.Add("x-ms-version", storageServiceVersion);
            httpClient.DefaultRequestHeaders.Add("Authorization", authorizationHeader);

            var result = httpClient.GetAsync(TableName + "?NextPartitionKey=1!48!VXwzMzg0MDAzOWYzMjQ0ZDgxOWZjZmM5M2EyMzNkM2IxOA--&NextRowKey=1!0!");
            result.Wait();
        }
    }

    static string GetAuthorizationHeader(string canonicalizedString)
    {
        var signature = string.Empty;
        using (var hash = new HMACSHA256(Convert.FromBase64String(StorageAccountKey)))
        {
            var data = Encoding.UTF8.GetBytes(canonicalizedString);
            signature = Convert.ToBase64String(hash.ComputeHash(data));
        }

        return string.Format(CultureInfo.InvariantCulture, "{0} {1}:{2}", "SharedKey", StorageAccount, signature);
    }

根据此处的文档:http://msdn.microsoft.com/library/azure/dd179428.aspx(2009-09-19共享密钥格式部分,第4点),您需要将所有查询参数转换为小写 。所以你的规范化资源字符串应该是:

GET\n\n\nFri, 05 Sep 2014 03:57:11 GMT\n/mystorageaccount/mytablename\nnextpartitionkey:1!20!UmFjZSBNZW1iZXJfNA--\nnextrowkey:1!12!TmFtZV85ODE- 

试一试。那应该解决这个问题。

相关问题