Use*_*987 0 c# asp.net asp.net-mvc amazon-web-services c#-4.0
我试图弄清楚如何在我的 .NET 应用程序中传递参数。URL 请求如下所示:
http://webservices.amazon.com/onca/xml?
Service=AWSECommerceService
&Operation=ItemLookup
&ResponseGroup=Large
&SearchIndex=All
&IdType=UPC
&ItemId=635753490879
&AWSAccessKeyId=[Your_AWSAccessKeyID]
&AssociateTag=[Your_AssociateTag]
&Timestamp=[YYYY-MM-DDThh:mm:ssZ]
&Signature=[Request_Signature]
Run Code Online (Sandbox Code Playgroud)
我感到困惑的部分是:
&Timestamp=[YYYY-MM-DDThh:mm:ssZ]
&Signature=[Request_Signature]
Run Code Online (Sandbox Code Playgroud)
我不确定我是否可以简单地为时间戳部分做这样的事情:
var TimeStamp = DateTime.Now; // without any special datetime formating?
Run Code Online (Sandbox Code Playgroud)
所以我的问题是如何在请求 URL 中实际生成此签名 URL?
我有上面所有这些参数,但我不确定如何生成最后一个?
有人可以帮我吗 ?
AWS 使用 HMAC 请求签名。一般来说,其工作方式是创建一条“消息”,它由访问密钥、请求标头、请求正文和时间戳等内容组成。然后,您 HMAC 这条“消息”,它就成为您的请求的“签名”。这可以防止重放攻击,因为每个请求都必须具有唯一的签名。
看起来时间戳只需采用 ISO 格式 ( YYYY-MM-DDThh:mm:ssZ),所以,不,你不能只使用DateTime.Now. 使用的默认格式ToString不是 ISO。相反,您需要使用类似的东西:
DateTime.Now.ToString("yyyy-MM-ddThh:mm:sszzz");
Run Code Online (Sandbox Code Playgroud)
或者,使用 UTC 时间并简单地附加一个实际上可能会更好Z:
DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ssZ");
Run Code Online (Sandbox Code Playgroud)
至于创建签名,请参阅AWS文档,其中提供了一些示例代码:
static byte[] HmacSHA256(String data, byte[] key)
{
String algorithm = "HmacSHA256";
KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm);
kha.Key = key;
return kha.ComputeHash(Encoding.UTF8.GetBytes(data));
}
static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName)
{
byte[] kSecret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray());
byte[] kDate = HmacSHA256(dateStamp, kSecret);
byte[] kRegion = HmacSHA256(regionName, kDate);
byte[] kService = HmacSHA256(serviceName, kRegion);
byte[] kSigning = HmacSHA256("aws4_request", kService);
return kSigning;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3637 次 |
| 最近记录: |