Verwendung von SharedAccessSignature für den Zugriff auf Blobs
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 das Blob zuzugreifen, erhalte ich eine StorgeClientException "Server konnte die Anforderung nicht authentifizieren. Stellen Sie sicher, dass der Authorization-Header einschließlich der Signatur korrekt gebildet wurde."
Der Code, der den Container erstellt und den Blob hochgeladen hat, sieht folgendermaßen aus:
<code>// 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")); } </code>
Der Code, den ich zum Lesen des Blobs verwendet habe, sieht folgendermaßen aus:
<code>// 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(); </code>
Ich kann das oben genannte Problem lösen, indem ich die Anmeldeinformationen des Kontos hinzufüge, aber genau das versuche ich zu vermeiden. Ich möchte nicht, dass etwas so vertraulich ist wie meine Anmeldeinformationen, und ich habe keine Ahnung, wie ich die Signatur in die Client-App einbinden kann, ohne über die Anmeldeinformationen des Kontos zu verfügen.
Jede Hilfe wird sehr geschätzt.