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

mfa*_*nto 8 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);
Run Code Online (Sandbox Code Playgroud)

然后,我创建一个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);
Run Code Online (Sandbox Code Playgroud)

这会生成一个url,并且该url在下一分钟(或实际代码中的7天)内正常工作.一分钟结束后,网址无效,不再有效,正如预期的那样.

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

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

sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow;
sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(1);
Run Code Online (Sandbox Code Playgroud)

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

Gau*_*tri 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();
Run Code Online (Sandbox Code Playgroud)

这对你有用吗?显然,您需要在7天后重新生成URL,但不必对访问策略进行任何更改.

希望这可以帮助.