2017-05-30 6 views
0

Ich habe einen privaten Azure Storage Container und probiere azurblauen Storage SAS aus, damit ich Dateien hochladen und herunterladen kann. Ich bin in der Lage, die Signatur zu erzeugen, aber es wirft mich immer die Authentifizierung fehl FehlerAzure Storage SAS AuthenticationFailed

AuthenticationFailed Server die Anfrage zur Authentifizierung fehlgeschlagen. Stellen Sie sicher, dass der Wert des Autorisierungsheaders einschließlich der Signatur richtig gebildet ist. RequestId: a9dce486-0001-0021-23f7-d8f6dc000000 Zeit: 2017-05-30T03: 45: 56.6617677Z Signatur stimmte nicht überein. Zeichenkette zum Zeichen benutzt war 2017-05-30T03: 40: 48Z 2017-05-30T03: 55: 48Z /blob/{myaccount}/{mycontainer}/11e1575f-d3ad-40cc-b1ce-32e24dc20324.jpg

2016-05-31

Dies ist der Code, den ich habe, die eine Signatur für mich erzeugt zu verwenden, und gibt den vollständigen URI auf die Datei zuzugreifen.

var accountAndKey = new StorageCredentials("******", "*********************"); 
var storageAccount = new CloudStorageAccount(accountAndKey, true); 

var sasConstraints = new SharedAccessBlobPolicy(); 
sasConstraints.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-5); 
sasConstraints.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(10); 
sasConstraints.Permissions = SharedAccessBlobPermissions.Read; 


CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
CloudBlobContainer container = blobClient.GetContainerReference("*****"); 
CloudBlockBlob blockBlob = container.GetBlockBlobReference("11e1575f-d3ad-40cc-b1ce-32e24dc20324.jpg"); 

var sasBlobToken = blockBlob.GetSharedAccessSignature(sasConstraints); 

var sas = blockBlob.Uri + sasBlobToken; 

return sas; 

Dies ist die Signatur es

? Sv = 2016.05.31 & sr = b & sig = 9fUwDWfdtUifv9iZXJKgILEM7Yx1uP3Ku0vrspjWyz8% 3D & st = 2017-05-30T03% 3A40% 3A43Z & erzeugt se = 2017-05-30T03% 3A55% 3A43Z & sp = r

verwendete ich das Azure-Portal die Signatur zu erzeugen und es funktioniert gut. Ich füge es an und kann die Datei wie gewohnt herunterladen. Diese ist die Signatur erzeugt es

sv = 2016.05.31 & ss = b = & srt SOZ & sp = r = & se 2017-05-30T03: 57: 25Z & st = 2017- 05-30T03: 52: 25Z & spr = https & sig = JOnhkge0QWNdv8sXJjb5GazTo9c34KH1IvZBvcNgjHo% 3D

ich vermute, dass seine sehr ein Problem mit dem Zeitstempel. Weil ich einige Unterschiede im Zeitstempel zwischen dem, was ich aus dem Code erzeuge, und dem, was aus dem Portal generiert wird, sehen kann.

Alle Ideen werden sehr geschätzt. Vielen Dank.

EDIT ich den Code aktualisiert 1 Tag bis Ablauf hinzufügen und die Startzeit entfernt, ist dies die Signatur jetzt

? Sv = 2016.05.31 & sr = b & sig = 73m3% 2BJ% 2BUsFk537vd8a7F% 2BdpdON1Pg2RZ1IRynMH4zGA% 3D & se = 2017-05-31T06% 3A12% 3A07Z & sp = r

aber es tut immer noch erlauben sie mir, um die Datei herunterzuladen. Gleiche Fehlermeldung.

Die Signatur stimmt nicht überein. String verwendet, um Zeichen war r 2017-05-31T06: 12: 07Z/Blob/{MyAcc}/{Mein Container} /11e1575f-d3ad-40cc-b1ce-32e24dc20324.jpg 2016-05-31

+0

Ihr Code sieht gut aus für mich. Können Sie es versuchen, indem Sie die Startzeit entfernen und die Ablaufzeit (zB einen Tag) in Ihrem Code erhöhen? –

+0

@GauravMantri Ich habe den Code bearbeitet, um die Änderungen zu tun, aber immer noch kein Glück –

+0

Was ist die Version von SDK verwenden Sie, um das SAS-Token zu generieren? –

Antwort

0

I kann das Problem auch nicht mithilfe des Codes reproduzieren. Hier ist eine Methode, die SAS generieren konnte, ohne die GetSharedAccessSignature-Methode zu verwenden. Bitte versuchen Sie es und prüfen Sie, ob es auf Ihrer Seite funktionieren kann.

private static string GetSharedAccessSignature(
     string accountName, 
     string accountkey, 
     string blobContainer, 
     string blobName, 
     DateTimeOffset sharedAccessStartTime, 
     DateTimeOffset sharedAccessExpiryTime) 
{ 
    var canonicalNameFormat = $"/blob/{accountName}/{blobContainer}/{blobName}"; 
    var st = sharedAccessStartTime.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); 
    var se = sharedAccessExpiryTime.UtcDateTime.ToString("yyyy-MM-ddTHH:mm:ssZ"); 
    var sasVersion = "2016-05-31"; 

    string stringToSign = string.Format("{0}\n{1}\n{2}\n{3}\n{4}\n{5}\n{6}\n{7}\n{8}\n{9}\n{10}\n{11}\n{12}", new object[] 
    { 
     "r", 
     st, 
     se, 
     canonicalNameFormat, 
     string.Empty, 
     string.Empty, 
     string.Empty, 
     sasVersion, 
     string.Empty, 
     string.Empty, 
     string.Empty, 
     string.Empty, 
     string.Empty 
    }); 

    var sas = GetHash(stringToSign, accountkey); 

    var credentials = 
     $"?sv={sasVersion}&sr=b&sig={UrlEncoder.Default.Encode(sas)}&st={UrlEncoder.Default.Encode(st)}&se={UrlEncoder.Default.Encode(se)}&sp=r"; 

    string blobUri = $"https://{accountName}.blob.core.windows.net/{blobContainer}/{blobName}"; 
    return blobUri + credentials; 
} 

private static string GetHash(string stringToSign, string key) 
{ 
    byte[] keyValue = Convert.FromBase64String(key); 

    using (HMACSHA256 hmac = new HMACSHA256(keyValue)) 
    { 
     return Convert.ToBase64String(hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign))); 
    } 
} 
+0

Hallo, ich habe den Code ausprobiert, aber es gibt immer noch den gleichen Fehler .. Ich habe sogar versucht [dieses SAS-Tutorial] (https: // github .com/Azure-Samples/storage-dotnet-sas-getting-started), die auf dem lokalen Speicheremulator funktionieren, schlägt fehl, wenn die Signatur –

+0

verwendet wird. Überprüfen Sie bitte den Namen des Speicherkontos und den Kontoschlüssel, die zum Generieren von SAS verwendet werden Recht? Ist der Kontoschlüssel abgelaufen? Haben Sie die Kontoverbindungszeichenfolge anstelle des Kontoschlüssels falsch verwendet? Da der generierende SAS-Betrieb auf lokaler Seite läuft. Der Kontoname und der Kontoschlüssel werden nicht validiert, wenn sie nicht gültig sind. – Amor

+0

Ich fühle mich jetzt so dumm, ja du hast Recht mit dem falschen Kontoschlüssel. Ich nahm an, dass es in Ordnung war, weil ich die Blob-Clients, Container und Blob-Referenzen erfolgreich bekommen konnte. Ich hatte keine Ahnung, dass alles lokal gemacht wurde ... Vielen Dank! –

Verwandte Themen