2013-10-30 10 views
5

Ich versuche, etwas Code zum Abrufen einer Datei aus S3 mit der REST-API über C# zu bekommen. Ich habe andere Leute gesehen, die ähnliche Dinge gemacht haben, aber aus irgendeinem Grund bekomme ich immer einen 403 Fehler. Ich habe versucht, das gleiche mit dem AWS SDK für .Net zu tun, und es funktioniert, so nehme ich an, es ist die Art, wie ich den Autorisierungsheader erstelle.Amazon S3 REST API 403 Fehler C#

Kann jemand bitte Licht darauf werfen?

string awsAccessId = "***"; 
string awsSecretKey = "***"; 
string bucketName = "thebucket"; 

string httpDate = DateTime.Now.ToString("ddd, dd MMM yyyy HH:mm:ss +0000\n"); 
       string canonicalString = "GET\n" 
             + "\n" 
             + "\n" 
             + "x-amz-date:" + httpDate + "\n" 
             + "/" + bucketName + "/readme.txt"; 

       // now encode the canonical string 
       Encoding ae = new UTF8Encoding(); 
       // create a hashing object 
       HMACSHA1 signature = new HMACSHA1(); 
       // secretId is the hash key 
       signature.Key = ae.GetBytes(awsSecretKey); 
       byte[] bytes = ae.GetBytes(canonicalString); 
       byte[] moreBytes = signature.ComputeHash(bytes); 
       // convert the hash byte array into a base64 encoding 
       string encodedCanonical = Convert.ToBase64String(moreBytes); 

       // Send the request 
       HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://" + bucketName +".s3.amazonaws.com/readme.txt"); 
       request.Headers.Add("x-amz-date", httpDate); 
       request.Headers.Add("Authorization", "AWS " + awsAccessId + ":" + encodedCanonical); 
       request.Method = "GET"; 

       // Get the response 
       HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 
       Console.WriteLine(response.StatusCode); 
       Console.Read(); 
+0

Warum nicht die SDK verwenden, wenn es funktioniert? –

+0

Ich hoffe, es in eine SSIS-Skriptaufgabe – MarkJ

Antwort

1

Ich weiß nicht, ob dies der nur Problem ist, aber es sieht aus wie ein bestimmtes Problem:

+ "x-amz-date:" + httpDate + "\n" 

x-amz-date ist der Header, der das Datum der super: Header in der HTTP-Anforderung selbst, sondern in der Kette zu unterschreiben, die Sie gerade das Datum setzen, ohne "x-amz-date" oder irgendetwas vor ihm, nach den Beispielen:

GET\n 
\n 
\n 
Tue, 27 Mar 2007 19:36:42 +0000\n 
/johnsmith/photos/puppy.jpg 

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationRequestCanonicalization

Es gibt nur eine korrekte Signatur, die für eine Anforderung generiert werden kann. S3 wird diese Signatur erzeugen und sie mit der von Ihnen gesendeten vergleichen, so dass es kein einziges Byte Platz für Fehler in der Zeichenkette gibt.

+0

zu setzen Danke für Ihren Vorschlag. Ich habe die Modifikation gemacht, aber leider funktioniert es immer noch nicht. – MarkJ

+0

Gibt die 403-Nachricht einen Fehler zurück, der Ihnen die Zeichenfolge zum Signieren gibt und Ihnen mitteilt, dass die Signatur nicht übereinstimmt oder nicht? Was sagt der Fehler? (im Antworttext) –

+0

Die Fehlermeldung besagt, dass die Signatur nicht übereinstimmt: SignatureDoesNotMatch Die von uns berechnete Anforderungssignatur stimmt nicht mit der von Ihnen angegebenen Signatur überein. Überprüfen Sie Ihren Schlüssel und die Signiermethode. MarkJ

1

Ich habe Ihren Code getestet, es funktioniert! Sie brauchen nur ein extra \ n plus ändern Sie http zu https und Sie sind fertig.

Amazon Rest API haben keine gute Dokumentation, das Fehlen von Beispielen macht alle zum SDK statt.