2017-05-03 41 views
0

我想弄清楚如何在.NET應用程序中傳遞參數。 URL請求的樣子:亞馬遜API在C#.NET中生成請求籤名

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] 

,我很困惑,難道這些部分:

&Timestamp=[YYYY-MM-DDThh:mm:ssZ] 
     &Signature=[Request_Signature] 

我不知道是否我可以只是簡單的做這樣的事情的時間戳部分:

var TimeStamp = DateTime.Now; // without any special datetime formating? 

所以我的問題是如何在請求URL中生成這個簽名URL?

我有上述所有這些參數,但我不知道如何生成這最後一個?

有人可以幫我嗎?

+0

任何傢伙?有小費嗎 ? – User987

回答

4

AWS利用HMAC請求籤名。一般來說,它的工作方式是創建一個「消息」,它由諸如訪問密鑰,請求頭,請求主體和時間戳等組成。然後你HMAC這個「消息」,併成爲你的「簽名」的請求。這可以防止重放攻擊,因爲每個請求都必須具有唯一的簽名。

它看起來像時間戳只需要在ISO格式(YYYY-MM-DDThh:mm:ssZ),所以,不,你不能只使用DateTime.NowToString使用的默認格式不是ISO。相反,你需要使用類似:

DateTime.Now.ToString("yyyy-MM-ddThh:mm:sszzz"); 

或者它實際上可能是更好的使用UTC時間,只需追加Z

DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ssZ"); 

至於創建簽名,請參閱AWS documentation,他們提供了一些示例代碼:

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; 
} 
+0

克里斯哇非常感謝!我發現這段代碼,但我仍然對參數的「RegionName」和「ServiceName」部分感到困惑,我需要在那部分放置什麼? – User987

+1

這就是AWS特有的東西,但我相信它們指的是您的地區,因爲像AWS這樣的雲服務通常是針對特定地區的('east-us-1')。無論你在做什麼,都會去那裏。該服務可能是您提出請求的特定AWS服務(例如'iam') –

+0

驚人的Chriss非常感謝!傳入getSignatureMethod的dateStamp怎麼樣,是否需要以與時間戳相同的格式傳遞(yyyy-MM-ddThh:mm:ssZ)? – User987