2013-02-24 85 views
4

我尝试通过REST Api访问Windows Azure存储帐户时遇到身份验证问题。Windows Azure表REST Api身份验证

我已阅读以下资源,以确定如何生成的要求:只有4个在请求变量

http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx

http://convective.wordpress.com/2010/08/18/examples-of-the-windows-azure-storage-services-rest-api/

Azure Blob Service REST API returns 403 error: "Request date header not specified"

从我的理解: 确定服务端点的实际URI, GMT时间的当前日期 主要访问密钥 帐户名称。

我有两个来自MSDN资源,另外两个来自我的Windows Azure Portal。

GET http://<account_name>.table.core.windows.net/ HTTP/1.1 
x-ms-date: Sun, 24 Feb 2013 09:19:31 GMT 
x-ms-version: 2009-09-19 
Authorization: SharedKey <account_name>:<primary_key> 
Accept-Charset: UTF-8 
Accept: application/atom+xml,application/xml 
DataServiceVersion: 1.0;NetFx 
MaxDataServiceVersion: 1.0;NetFx 
Host: <account_name>.table.core.windows.net 

我检查,以确保帐户名和主键是正确的,而X-MS-日期戳是基于与其他职位的建议,在15分钟内。

我会收到以下消息:

HTTP/1.1 403 Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. 
Content-Length: 437 
Content-Type: application/xml 
Server: Microsoft-HTTPAPI/2.0 
x-ms-request-id: d78c2c11-8699-4737-9592-82813eac356e 
Date: Sun, 24 Feb 2013 21:20:03 GMT 

<?xml version="1.0" encoding="utf-8" standalone="yes"?> 
<error xmlns="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata"> 
    <code>AuthenticationFailed</code> 
    <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:d78c2c11-8699-4737-9592-82813eac356e 
Time:2013-02-24T21:20:03.2036675Z</message> 
</error> 

上固定正确地认证的要求有什么建议?

此外,我能够下载Azure存储资源管理器实用程序并以这种方式访问​​服务,因此我知道存储帐户有效且正在工作。

回答

4

后一些更多的搜索,我发现下面的文章:

  1. http://msdn.microsoft.com/en-us/library/windowsazure/dd135720.aspx
  2. http://blog.einbu.no/2009/08/authenticating-against-azure-table-storage/

的基本结论是,SharedKeyLite必须用于这种类型的请求。

资源#1,它说:

表服务要求每个请求进行身份验证。共享密钥和共享密钥Lite认证均受支持。共享密钥身份验证更安全,建议用于使用REST API对表服务进行的请求。 用于WCF数据服务的Microsoft .NET客户端库仅支持共享密钥Lite身份验证。

一个资源#2说明了如何创建ShareKeyLite并在底部提到:

由于SharedKey比SharedKeyLite更稳健,这将是显而易见的选择。但是,我们仍然需要SharedKeyLite方案来访问Development Table Storage,因为它是唯一可以接受的方案。 (由于在Windows Azure SDK的七月CTP的。)

1

我有同样的问题。我也下载了Azure存储浏览器实用程序。我正在使用Fiddler Web Debugger来查看从天真到蔚蓝的请求。要求是这样的:

GET http://mystorageaccount.table.core.windows.net/Tables() HTTP/1.1 
User-Agent: Microsoft ADO.NET Data Services 
DataServiceVersion: 1.0;NetFx 
MaxDataServiceVersion: 2.0;NetFx 
x-ms-version: 2009-09-19 
x-ms-date: Tue, 26 Feb 2013 07:18:04 GMT 
Authorization: SharedKeyLite mystorageaccount:mystorageaccountkey 
Accept: application/atom+xml,application/xml 
Accept-Charset: UTF-8 
Host: mystorageaccount.table.core.windows.net 
+0

我做了同样的事情,虽然它的工作原理并没有真正解释为什么原始请求失败。 此外,它带来了另外两个问题: 1. SharedKey和SharedKeyLite有什么区别? 这是我的理解ShareKeyLite只是基于用于生成哈希的信息的一个不太安全的SharedKey形式。 2.哪里可以找到Windows Azure Portal中的SharedKeyLite? 我发现的所有内容都是位于底部功能区中的“管理密钥”按钮,同时查看存储帐户页面。它只是通过执行base64手动生成的(sha1(something)) – 2013-02-27 06:36:28

+0

是的,马特。天蓝色的问题有很多... – DmitryBLR 2013-02-27 11:02:51

1

我在这里打了同样的错误AuthenticationFailed。对于表服务,这个错误没有提供任何细节。只有通过反复试验才能看到来自其他网络的代码片段与我所做的不同之处 - 就是调试它的方法。

对于blob服务,我曾看到过提到的错误 - 服务器计算出的StringToSign(带有值)和来自签名的stringToSign不匹配。这帮助我修复了计算身份验证头的代码。

更多详细信息以及其他错误代码,将永远帮助开发人员。

回到问题,问题是需要x-ms-date标头而不是'Date'标头。所以,错误代码放错了位置。

对于winjs windows store应用程序。工作代码看起来像这样:

var url = 'https://<storageaccount>.table.core.windows.net/<table name>()'; 
var date = new Date().toGMTString().replace('UTC', 'GMT'); 
var xhrOptions = { 
    type: 'GET', 
    url: url, 
    headers: { 
     // Date: date, // does not work and raises AuthenticationFailed error 
     'x-ms-date' : date, // works 
     'Content-Type': 'application/atom+xml', 
     'x-ms-version': '2009-09-19', 
     DataServiceVersion: '1.0;NetFx', 
     MaxDataServiceVersion: '1.0;NetFx', 
    }, 
}; 

xhrOptions.headers.Authorization = computeAuthorizationHeader(xhrOptions);