9

我在 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 url:

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 在下一分钟(或实际代码中的 7 天)内正常工作。一分钟结束后,该 url 无效并且不再像预期的那样工作。

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

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

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

使用该政策的任何内容仅在今天上午 10:10 (EDT) 至上午 10:11 (EDT) 有效?

4

3 回答 3

11

您可以做的一件事是创建没有过期日期的访问策略。您在创建签名 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 生成盒和 Windows Azure 存储之间的时钟偏差效应。您应该使用更长的间隔。我发表了一篇深入探讨共享访问签名的帖子,您可能会觉得有帮助

于 2012-07-18T14:43:41.320 回答
0

您可能会达到容器级别访问策略的最大值。

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

使用存储访问策略

于 2012-07-18T15:03:02.607 回答