4

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

我已阅读以下资源以确定如何生成请求:

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 服务 REST API 返回 403 错误:“未指定请求日期标头”

据我了解,请求中只有 4 个变量:确定服务端点的实际 URI,GMT 时间的当前日期主访问密钥帐户名称。

我的前两个来自 MSDN 资源,另外两个来自我的 Windows Azure 门户。

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-date 时间戳在 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

5 回答 5

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 上它说:

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

一个资源 #2 它解释了如何创建 ShareKeyLite,并在底部提到:

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

于 2013-02-27T08:24:45.440 回答
1

我有同样的问题。我也下载了 Azure 存储资源管理器实用程序。我正在使用 Fiddler Web Debugger 查看从实用程序到 azure 的请求。请求是这样的:

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
于 2013-02-26T07:24:33.330 回答
1

我在这里遇到同样的错误AuthenticationFailed。对于表服务,此错误未提供任何详细信息。只有通过反复试验并查看来自其他网络的代码片段并与我所拥有的进行差异 - 才是调试它的方法。

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

更多详细信息以及 rest api 中的错误代码,将始终对开发人员有所帮助。

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

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

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);
于 2013-05-20T08:35:51.057 回答
0

授权字符串需要根据此规范进行签名http://msdn.microsoft.com/en-us/library/windowsazure/dd179428.aspx

特别是你的标题部分说

<primary_key>

应该是类似的输出

Base64(HMAC_SHA256(UTF8("<primary_key>"),UTF8("VERB\n\n\nDATE\nRESOURCE")))
于 2013-04-05T20:48:27.297 回答
0

您可以使用此处提到的解决方案。

访问 azure 表时要提及的一件事应该使用“共享密钥”,如果是“Blob”,则“使用 SharedKey Lite”

http://social.msdn.microsoft.com/Forums/en-US/windowsazureconnectivity/thread/84415c36-9475-4af0-9f52-c534f5681432

如果您在代理后面工作,请记住一件事,只需检查端口是否被阻止。如果某些端口被阻止,则 Windows azure 将没有响应。

于 2013-04-30T04:22:56.170 回答