読者です 読者をやめる 読者になる 読者になる

Azureの小ネタ (改)

~Azureネタを中心に、色々とその他の技術的なことなどを~

コンテナレベルでのShared Access Signature

こんばんは、statemachineです。朝晩の気温が下がってきて過ごしやすくなってきた今日この頃皆さんいかがお過ごしでしょうか。最近、ちょっと連発気味ですが、まったりいきましょう。

前回のShared Access Signature Write編の続き。コンテナレベルで設定できるか試してなかったので、やってみました。


論よりコード。前回との違いといえば、containerに対して、GetSharedAccessSignatureを呼んでいるところくらいでしょうか。

void Main()
{
    var account = CloudStorageAccount.DevelopmentStorageAccount;
    var client = account.CreateCloudBlobClient();
    
    var container = client.GetContainerReference("sas");
    container.CreateIfNotExist();

    var sas = container.GetSharedAccessSignature(new SharedAccessPolicy()
    {
        Permissions = SharedAccessPermissions.Write|SharedAccessPermissions.Read,
        SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1)
    });
    
    Console.WriteLine (sas);
 }

今回は、Uploadする部分を別にして試しています。上記コードを実行すると、SASが取得できるので、それを埋め込んで以下のコードを実行すると、ファイルがアップロードできます。

void Main()
{
    var sas = "?se=2010-09-15T13%3A35%3A40Z&sr=c&sp=rw&sig=gTSikfC1F0yOUXIoo44P0Js2F9YCdBP9AsSEqUnIQ9c%3D";
    Console.WriteLine (sas);
    
    // 画像
    var tulips = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyPictures), "Tulips.jpg");
    var sasCreds = new StorageCredentialsSharedAccessSignature(sas);
    var aClient = new CloudBlobClient("http://127.0.0.1:10000/devstoreaccount1", sasCreds);
    try {
      var aContainer = aClient.GetContainerReference("sas");
      var aBlob = aContainer.GetBlobReference("tulips.jpg");
      aBlob.UploadFile(tulips);
    }
    catch(Exception e)
    {
      Console.WriteLine (e.ToString());
    }
    
    Console.WriteLine ("Done");    
}

有効時間が過ぎたり、コンテナの名前を変えてUploadしようとすると、ちゃんと以下のような例外が発生しました。

?se=2010-09-15T14%3A10%3A18Z&sr=c&sp=rw&sig=mMc%2FDvRDqTMMAki1UiTc9yz4h2IbQ798%2BqUiYy2%2BAT4%3D
Microsoft.WindowsAzure.StorageClient.StorageClientException: Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature. ---> System.Net.WebException: リモート サーバーがエラーを返しました: (403) 使用不可能
   場所 System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult)
   場所 Microsoft.WindowsAzure.StorageClient.EventHelper.ProcessWebResponse(WebRequest req, IAsyncResult asyncResult, EventHandler`1 handler, Object sender)
   --- 内部例外スタック トレースの終わり ---
   場所 Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result()
   場所 Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.ExecuteAndWait()
   場所 Microsoft.WindowsAzure.StorageClient.TaskImplHelper.ExecuteImpl(Func`1 impl)
   場所 Microsoft.WindowsAzure.StorageClient.CloudBlob.UploadFromStream(Stream source, BlobRequestOptions options)
   場所 Microsoft.WindowsAzure.StorageClient.CloudBlob.UploadFile(String fileName, BlobRequestOptions options)
   場所 Microsoft.WindowsAzure.StorageClient.CloudBlob.UploadFile(String fileName)
   場所 UserQuery.Main() 場所 c:\Users\statemachine\AppData\Local\Temp\mnkrxeqg.0.cs:行 45


最終的には、本環境で試す必要がありますが、開発ストレージにて。