Shared Access Signature
Tech Days にご登壇頂いたパートナーさんに、”Shared Access Signature” の話を聞き、そういえば試してなかったし、存在さえ忘れていたので、試してみました。
パブリックなのでいつでも参照可能なコンテンツ(public)
3月4日(木)20:49:54 まで参照可能なコンテンツ(Shared Access Signature)
3月13日(水)20:49:54 まで参照可能なコンテンツ(Shared Access Signature)
※上記のリンクは3月14日以降の適当な時に削除
blob のアクセス権は、public or private の読み込み設定が提供されていますが、昨年の夏に、“Shared Access Signature” が追加されています。”Shared Access Signature” は、書き込みや削除等も含めたアクセス権を、細かく設定できる方法です。ただ、最初に覚えておく必要があるのは、ユーザーを識別する訳ではなく、URL のパラメータ部分で識別するということです。パラメータには、”開始時間&終了時間&アクセス権&署名” が追加されます。また、あらかじめコンテナに設定されたポリシーをベースにする場合、”アクセス権&ポリシー名&署名” がパラメータになります(上記のリンクは、後者です)。どのような権限設定があるかというと、
ー コンテンツ/リスト/プロパティ/メタデータの読み込み/書き込み
ー 削除
ー リース
ー スナップショット作成
ー コンテナ内 blob の列挙
ができます。利用する際には、コンテンツ提供側は、上記の操作、アクセス権を付与する時間等の文字列情報を元に署名を作成します。URL だけで書き込みができてしまうことを考えると、最小限のアクセス権、最小限のアクセス時間で利用するのは必須となります。
コードで試したのですが、試し終わってから、myAzureStorage の存在を思い出して見てみたら、やっぱりありました。すごく簡単、コード不要。。。
いちお、コードも記述しておきます。以下は、コンテナに設定したポリシーと同様のアクセス権を持つ blob の署名を作成する例です。blob 単体の署名作成も可能ですが、期間は1時間以内、URL に期間等も入れる必要がある等の制約があります。
-----
// コンテナ作成
CloudStorageAccount cloudStorageAccount = CloudStorageAccount.FromConfigurationSetting("DataConnectionString");
CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
CloudBlobContainer container = cloudBlobClient.GetContainerReference("sharedfolder2");
container.CreateIfNotExist();
// コンテナのポリシー設定
SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy();
sharedAccessPolicy.Permissions = SharedAccessPermissions.Read;
sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow;
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddDays(1);
BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions();
blobContainerPermissions.SharedAccessPolicies.Add("testread", sharedAccessPolicy);
container.SetPermissions(blobContainerPermissions);
// ブロブの保存
CloudBlockBlob blob = container.GetBlockBlobReference(FileUpload1.FileName);
blob.Properties.ContentType = "コンテンツによって設定";
blob.UploadFromStream(FileUpload1.FileContent);
// 署名作成
Label1.Text = blob.GetSharedAccessSignature(new SharedAccessPolicy(), "testread");