Azure blob容器共享访问签名到期

时间:2012-07-18 14:14:22

标签: azure azure-storage-blobs

Azure Blob和共享访问签名过期时遇到问题。我需要授予对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);

然后我创建一个SharedAccessSignature网址,其中包含以下内容:

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

这会生成一个网址,该网址可以在下一分钟(或实际代码中的7天)正常工作。一分钟结束后,网址无效,不再正常工作。

但是一旦过期,我再次运行代码以生成新的URL。不幸的是,它会生成相同的网址,但仍然无效。

容器策略的开始/结束时间是绝对的,这意味着当我立即设置该策略时:

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

使用该政策的任何内容仅在美国东部时间上午10点10分至今天上午10:11(美国东部时间)有效?

3 个答案:

答案 0 :(得分:10)

您可以做的一件事是创建您的访问策略而没有到期日期。您在创建签名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 :(得分:0)

到期时间为1分钟,您可能会在SAS生成框和Windows Azure存储之间产生时钟偏差效应。你应该使用更长的间隔。我做了一个post进入共享访问签名的血腥深处,你可能会觉得有帮助。

答案 2 :(得分:0)

您可能在容器级访问策略上达到最大值。

存储的访问策略包含最多64个字符长的名称,该名称在容器中是唯一的。此名称显示在共享访问签名上的signedidentifier字段中,该字段链接到存储的访问策略。容器最多可包含5个存储的访问策略。每个策略都可以由任意数量的共享访问签名使用。

Using a Stored Access Policy

相关问题