9

AzureBlobと共有アクセス署名の有効期限が切れると問題が発生します。BLOBへのアクセスを1時間(7日)より長く許可する必要があるため、名前付きコンテナーポリシーを使用していますが、残念ながら、7日が経過すると新しいURLを生成できないようです。

「デフォルト」ポリシーを作成するための次のコードがあります。このコードでは、テストを容易にするために、有効期限を今から1分に設定していることに注意してください。

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

次に、次のようにSharedAccessSignatureURLを作成します。

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

これによりURLが生成され、URLは次の1分間(または実際のコードでは7日間)正常に機能します。1分が経過すると、URLは無効になり、期待どおりに機能しなくなります。

しかし、その有効期限が過ぎたら、コードを再度実行して新しいURLを生成します。残念ながら、同じURLが生成されますが、それでも無効です。

コンテナポリシーの開始/終了時間は絶対ですか。つまり、今すぐそのポリシーを設定したときです。

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

そのポリシーを使用しているものは、今日の午前10時10分(EDT)から午前10時11分(EDT)までのみ有効ですか?

4

3 に答える 3

11

できることの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を再生成する必要がありますが、アクセスポリシーを変更する必要はありません。

お役に立てれば。

于 2012-07-18T14:59:45.510 に答える
0

有効期限が1分になると、SAS生成ボックスとWindowsAzureストレージの間でクロックスキューの影響が発生する可能性があります。より長い間隔を使用する必要があります。私は、共有アクセス署名のひどい深さについて投稿しました。これはあなたが役立つと思うかもしれません。

于 2012-07-18T14:43:41.320 に答える
0

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

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

保存されたアクセスポリシーの使用

于 2012-07-18T15:03:02.607 に答える