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(美国东部时间)有效?
答案 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个存储的访问策略。每个策略都可以由任意数量的共享访问签名使用。