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.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage