Comment signer un Amazon web service à la demande .NET avec du SAVON et sans WSE

L'Amazon de la Publicité des Produits de l'API (anciennement partenaires d'Amazon Web Service ou Amazon AWS) a mis en place une nouvelle règle qui est par 15 août 2009, toutes les demandes de service web doit être signé. Ils ont fourni des exemples de code sur leur site montrant comment le faire en C# à l'aide de REST et SOAP. La mise en œuvre que j'utilise est du SAVON. Vous pouvez trouver un exemple de code ici, je ne suis pas compris, car il ya une bonne quantité.

Le problème, je vais avoir, c'est leur exemple de code utilise WSE 3 et notre code actuel n'utilise pas WSE. Quelqu'un sait-il comment mettre en place cette mise à jour, avec seulement l'aide de la génération automatique de code à partir du WSDL? J'aimerais ne pas avoir à basculer vers le WSE 3 trucs pour l'instant, si je n'ai pas à depuis cette mise à jour est plus rapide, patch pour nous tenir jusqu'à ce que nous pouvons pleinement mise en œuvre dans l'actuel dev version (3 août ils commencent à déposer 1 à 5 demandes, dans l'environnement direct, si elles ne sont pas signées, ce qui est une mauvaise nouvelle pour notre application).

Voici un extrait de la partie principale qui fait la signature de la requête SOAP.

class ClientOutputFilter : SoapFilter
{
//to store the AWS Access Key ID and corresponding Secret Key.
String akid;
String secret;
//Constructor
public ClientOutputFilter(String awsAccessKeyId, String awsSecretKey)
{
this.akid = awsAccessKeyId;
this.secret = awsSecretKey;
}
//Here's the core logic:
//1. Concatenate operation name and timestamp to get StringToSign.
//2. Compute HMAC on StringToSign with Secret Key to get Signature.
//3. Add AWSAccessKeyId, Timestamp and Signature elements to the header.
public override SoapFilterResult ProcessMessage(SoapEnvelope envelope)
{
var body = envelope.Body;
var firstNode = body.ChildNodes.Item(0);
String operation = firstNode.Name;
DateTime currentTime = DateTime.UtcNow;
String timestamp = currentTime.ToString("yyyy-MM-ddTHH:mm:ssZ");
String toSign = operation + timestamp;
byte[] toSignBytes = Encoding.UTF8.GetBytes(toSign);
byte[] secretBytes = Encoding.UTF8.GetBytes(secret);
HMAC signer = new HMACSHA256(secretBytes);  //important! has to be HMAC-SHA-256, SHA-1 will not work.
byte[] sigBytes = signer.ComputeHash(toSignBytes);
String signature = Convert.ToBase64String(sigBytes); //important! has to be Base64 encoded
var header = envelope.Header;
XmlDocument doc = header.OwnerDocument;
//create the elements - Namespace and Prefix are critical!
XmlElement akidElement = doc.CreateElement(
AmazonHmacAssertion.AWS_PFX, 
"AWSAccessKeyId", 
AmazonHmacAssertion.AWS_NS);
akidElement.AppendChild(doc.CreateTextNode(akid));
XmlElement tsElement = doc.CreateElement(
AmazonHmacAssertion.AWS_PFX,
"Timestamp",
AmazonHmacAssertion.AWS_NS);
tsElement.AppendChild(doc.CreateTextNode(timestamp));
XmlElement sigElement = doc.CreateElement(
AmazonHmacAssertion.AWS_PFX,
"Signature",
AmazonHmacAssertion.AWS_NS);
sigElement.AppendChild(doc.CreateTextNode(signature));
header.AppendChild(akidElement);
header.AppendChild(tsElement);
header.AppendChild(sigElement);
//we're done
return SoapFilterResult.Continue;
}
}

Et qui est appelée lorsque l'appel de service web

//create an instance of the serivce
var api = new AWSECommerceService();
//apply the security policy, which will add the require security elements to the
//outgoing SOAP header
var amazonHmacAssertion = new AmazonHmacAssertion(MY_AWS_ID, MY_AWS_SECRET);
api.SetPolicy(amazonHmacAssertion.Policy());
Avez-vous un contact plus à Amazon? Ils ont besoin de comprendre pourquoi ils ne devraient pas obliger les gens à utiliser des logiciels obsolètes qui est à peine pris en charge (WSE). Vérifier mon profil, et demandez-leur de me contacter à l'johnwsaundersiii à live.com.
Bonjour, oui nous avons un contact là-bas. Je vais voir sur la transmission du message.

OriginalL'auteur Brian Surowiec | 2009-07-30