7

Windows Azure のプライベート コンテナーに格納されている BLOB にアクセスしようとしています。コンテナーには共有アクセス署名がありますが、BLOB にアクセスしようとすると、StorgeClientException が発生します。

コンテナーを作成して BLOB をアップロードするコードは次のようになります。

// 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"));
}

ブロブを読み取るために使用しようとしているコードは次のようになります。

// 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();

アカウント資格情報を追加することで上記の作業を行うことができますが、それはまさに私が避けようとしていることです。アカウントの資格情報がそこにあるだけで、クライアント アプリに署名を取得する方法がわかりません。

どんな助けでも大歓迎です。

4

2 に答える 2

4

なぜこれ?

writer.WriteLine(container.GetSharedAccessSignature(new SharedAccessPolicy(), "securedblobpolicy"));

sasすでに作成した文字列を書いていませんか?

遅くなり、何かを見落としている可能性がありますが、最初にファイルを書き込むために使用したのと同じアクセス署名を保存していないようです。

また、ここでは関係ないかもしれませんが、コンテナ全体のポリシーの数には制限があると思います。このコードを使用して複数のファイルを同じコンテナーにアップロードし、毎回新しいコンテナー sas を作成していますか?

一般的には、有効期限が短い必要なときに、個々のブロブに対して sas を要求する方がよいと思います。

于 2012-05-05T07:14:42.690 に答える
1

「my.azurestorage.windows.net」は単なるタイプミスですか? 「https:// account .blob.core.windows.net」のようなものがあると思います。

それ以外の場合、コードは動作するhttp://blog.smarx.com/posts/shared-access-signatures-are-easy-these-daysのコードと非常によく似ています。

于 2012-05-05T05:50:01.923 に答える