2012-07-18 6 views
7

Azure BlobsおよびShared Access Signaturesが期限切れになると問題が発生します。 1時間(7日間)以上BLOBへのアクセスを許可する必要があるので、名前付きコンテナポリシーを使用していますが、残念ながら7日間が経過すると新しいURLが生成されないようです。Azure Blobコンテナ共有アクセス署名の有効期限が切れる

「デフォルト」ポリシーを作成するためのコードは次のとおりです。私は次のとSharedAccessSignature URLを作成

CloudStorageAccount account = new CloudStorageAccount(credentials, true); 

CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials); 

CloudBlobContainer container = client.GetContainerReference("files"); 

SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy(); 
sharedAccessPolicy.Permissions = SharedAccessPermissions.Read; 
sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); 

BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions(); 
blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy); 

container.SetPermissions(blobContainerPermissions); 

CloudStorageAccount account = new CloudStorageAccount(credentials, true); 

CloudBlobClient client = new CloudBlobClient(account.BlobEndpoint, credentials); 

CloudBlobContainer container = client.GetContainerReference("files"); 

CloudBlob blob = container.GetBlobReference(path); 

string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy(), "default"); 

Console.WriteLine(blob.Uri.AbsoluteUri + sas); 

これを私は今から1分であることを、有効期限を設定しています、このコードに注意してください、テストやすくするためにurlを生成し、次の分(または実際のコードでは7日間)正しく動作します。 1分が終わると、URLは無効になり、期待どおりに機能しなくなります。

ただし、有効期限が過ぎると、コードを再度実行して新しいURLを生成します。残念ながら、それはまだ無効な同じURLを生成します。そのポリシーを使用して

sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); 

何かが10:11午前のみ午前10時10分(EDT)から有効です(:

は、私は今、そのポリシーを設定すると意味、絶対的なコンテナポリシーの開始/終了時間ですEDT)今日?

+0

したがって、コンテナポリシーの開始時間と終了時間は絶対的です。私も彼らは親戚だと思った。 – nmit026

答えて

9

あなたができることの1つは、有効期限のないアクセスポリシーを作成することです。署名付きURLを作成するときに有効期限を指定します。

だからあなたのコードは次のようになります。

 SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy(); 
     sharedAccessPolicy.Permissions = SharedAccessPermissions.Read; 
     sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow; 
     //sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1); No need to define expiry time here. 

     BlobContainerPermissions blobContainerPermissions = new BlobContainerPermissions(); 
     blobContainerPermissions.SharedAccessPolicies.Add("default", sharedAccessPolicy); 

     container.SetPermissions(blobContainerPermissions); 

     Console.WriteLine("Press any key to continue...."); 
     Console.ReadLine(); 
     CloudBlob blob = container.GetBlobReference(path); 

     string sas = blob.GetSharedAccessSignature(new SharedAccessPolicy() 
     { 
      SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7),//add expiry date only when you're creating the signed URL 
     } 
      , "default"); 

     Console.WriteLine(blob.Uri.AbsoluteUri + sas); 

     Process.Start(new ProcessStartInfo(blob.Uri.AbsoluteUri + sas)); 

     Console.WriteLine("Press any key to continue...."); 
     Console.ReadLine(); 

をウィルあなたのためにこの作品?明らかに7日後にURLを再生成する必要がありますが、アクセスポリシーを変更する必要はありません。

これが役に立ちます。

+1

ありがとうございます。残念ながら、コンテナアクセスポリシーを使用している場合は、共有アクセス署名を作成する際に追加のパラメータを指定することはできません。エラーは、 "アクセスポリシーフィールドは、署名またはSAS識別子に関連付けられますが、両方には関連付けられません"。 – mfanto

+0

私は同意します。だから、私はSharedAccessExpiryTimeをアクセスポリシーから除外し(私はそのコード行にコメントした)、それを署名付きのURLに含めました。 –

+0

私は謝罪する、私はコメントを逃した。これはうまくいくので、大量のコードを書き直す必要がなくなります。ありがとう、非常にうまくいった。 – mfanto

0

有効期限が1分になると、SAS生成ボックスとWindows Azureストレージの間にクロックスキュー効果が発生する可能性があります。より長い間隔を使用する必要があります。 postは、共有アクセスシグネチャの奥深くにあり、役立つかもしれません。

+0

投稿していただきありがとうございます。残念ながら、それは時間間隔に関係なく起こります。もともと私は7日間を設定していたので、それを発見しました。コミットログを見て、7日前にアクセスポリシーを設定しました。私は問題は、コンテナのポリシーの時間は、ポリシーが作成された時間を意味し、時間のURLは生成されないということです。GetSharedAccessSignature()はネットワークコールを行わないので、ポリシーの一意の署名を生成することはできません。 – mfanto

0

コンテナレベルのアクセスポリシーで最大値に達している可能性があります。

格納されたアクセスポリシーには、コンテナ内で一意の最大64文字の名前が含まれます。この名前は、共有アクセスシグネチャのsignedidentifierフィールドに格納されているアクセスポリシーにリンクしています。コンテナには、最大5つの格納されたアクセスポリシーを含めることができます。各ポリシーは、任意の数の共有アクセス署名で使用できます。

Using a Stored Access Policy

+0

私は1つのコンテナレベルのアクセスポリシーしか持っていません。答えは私が誤解していると思います。つまり、コンテナのポリシー時刻は、URLが生成されたときではなく、ポリシーが作成されたときに設定されます。 – mfanto

+0

お聞きします。リーチだけでなく、これらの2つの行が新しいポリシーを生成している可能性があります。コレクションの数をチェックします。再びリーチ。 – Paparazzi

+0

@Blamこれは基本的に、あなたのBLOBコンテナにある既存のポリシーを上書きします。既存のアクセスポリシーを保持するには、 "SharedAccessPolicies"コレクションにそれらを渡す必要があります。 –

関連する問題