Ich versuche, auf einen Blob zuzugreifen, der in einem privaten Container in Windows Azure gespeichert ist. Der Container hat eine Shared Access-Signatur, aber wenn ich versuche, auf den Blob zuzugreifen, erhalte ich eine StorgeClientException "Server konnte die Anforderung nicht authentifizieren. Stellen Sie sicher, dass der Autorisierungsheader korrekt gebildet ist und die Signatur enthält" .So verwenden Sie SharedAccessSignature für den Zugriff auf Blobs
Der Code, der den Container erstellt und hochgeladen das Blob wie folgt aussieht:
// create the container, set a Shared Access Signature, and share it
// first this to do is to create the connnection to the storage account
// this should be in app.config but as this isa test it will just be implemented
// here:
// add a reference to Microsoft.WindowsAzure.StorageClient
// and Microsoft.WindowsAzure.StorageClient set up the objects
//storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
storageAccount = CloudStorageAccount.Parse(ConfigurationManager.AppSettings["ConnectionString"]);
blobClient = storageAccount.CreateCloudBlobClient();
// get a reference tot he container for the shared access signature
container = blobClient.GetContainerReference("blobcontainer");
container.CreateIfNotExist();
// now create the permissions policy to use and a public access setting
var permissions = container.GetPermissions();
permissions.SharedAccessPolicies.Remove("accesspolicy");
permissions.SharedAccessPolicies.Add("accesspolicy", new SharedAccessPolicy
{
// this policy is live immediately
// if the policy should be delatyed then use:
//SharedAccessStartTime = DateTime.Now.Add(T); where T is some timespan
SharedAccessExpiryTime =
DateTime.UtcNow.AddYears(2),
Permissions =
SharedAccessPermissions.Read | SharedAccessPermissions.Write
});
// turn off public access
permissions.PublicAccess = BlobContainerPublicAccessType.Off;
// set the permission on the ocntianer
container.SetPermissions(permissions);
var sas = container.GetSharedAccessSignature(new SharedAccessPolicy(), "accesspolicy");
StorageCredentialsSharedAccessSignature credentials = new StorageCredentialsSharedAccessSignature(sas);
CloudBlobClient client = new CloudBlobClient(storageAccount.BlobEndpoint,
new StorageCredentialsSharedAccessSignature(sas));
CloudBlob sasblob = client.GetBlobReference("blobcontainer/someblob.txt");
sasblob.UploadText("I want to read this text via a rest call");
// write the SAS to file so I can use it later in other apps
using (var writer = new StreamWriter(@"C:\policy.txt"))
{
writer.WriteLine(container.GetSharedAccessSignature(new SharedAccessPolicy(), "securedblobpolicy"));
}
Der Code wie folgt den Blob zu lesen sieht Ich habe versucht, zu verwenden:
// the storace credentials shared access signature is copied directly from the text file "c:\policy.txt"
CloudBlobClient client = new CloudBlobClient("https://my.azurestorage.windows.net/", new StorageCredentialsSharedAccessSignature("?sr=c&si=accesspolicy&sig=0PMoXpht2TF1Jr0uYPfUQnLaPMiXrqegmjYzeg69%2FCI%3D"));
CloudBlob blob = client.GetBlobReference("blobcontainer/someblob.txt");
Console.WriteLine(blob.DownloadText());
Console.ReadLine();
ich kann Machen Sie die oben genannten Arbeiten, indem Sie die Kontoanmeldeinformationen hinzufügen, aber genau das versuche ich zu vermeiden. Ich möchte nichts so empfindlich wie meine Kontoanmeldeinformationen nur sitzen da draußen und ich habe keine Ahnung, wie Sie die Signatur in die Client-App erhalten, ohne die Kontoanmeldeinformationen zu haben.
Jede Hilfe wird sehr geschätzt.
my.azurestorage.windows.net ist da, da es keine Notwendigkeit gibt, Kontoinformationen öffentlich zu machen. Der Code ähnelt dem Code in dem Blog, auf den Sie verwiesen haben. Der Code funktioniert zwar in gewissem Umfang, er ermöglicht jedoch keinen anonymen Zugriff auf einen Blob mit der gemeinsamen Zugriffssignatur. Das ist das Problem! – crunchy
Aber natürlich endet Ihr tatsächlicher Wert dort in '.blob.core.windows.net', oder? (Und das Präfix ist der Name Ihres Speicherkontos?) – smarx
der Wert in der tatsächlichen Anwendung ist die Adresse für den Container. Ich habe meinen Code gerade nicht geöffnet, aber was da drin ist, ist genau, da ich auf die Container und Blobs zugreifen kann, wenn ich die Kontoanmeldeinformationen zur Verfügung stelle. Ich bin mir immer noch nicht sicher, warum die angegebene Richtlinie nicht die richtigen Werte zurückgibt, aber es funktioniert jetzt. Danke für die Eingabe. – crunchy