如何确定Azure Blob存储容器访问的SAS令牌是否已过期?

问题描述

我使用Azure Blob Storage Client Libary v11 for .Net

我编写了一个程序,客户可以用来上传文件。我为客户生成一个带有SAS令牌的URL(有效期为x天),客户可以使用该程序上传文件。这是一个示例网址:

 useEffect(() => {
                handleCollapsibleViewPort();
        },[collapsed]);

        const handleCollapsibleViewPort = () => {
                if(uncollapsedHeight !== 0 && collapsibleRef.current.clientHeight > uncollapsedHeight ) {
                        scrollElementToTop(collapsibleRef.current.getBoundingClientRect().top);
                }
        }

在开始上载之前,如何确定SAS令牌是否仍然有效?

更新

我的网址中没有 se 声明。 这是我生成网址的代码

https://storage.blob.core.windows.net/123456789?sv=2019-07-07&sr=c&si=mypolicy&sig=ASDH845378ddsaSDdase324234234rASDSFR

解决方法

通常SAS令牌包含se字段,您可以根据SAS字段确定se令牌何时到期。

在下面的示例中,SAS令牌的到期时间为2020-09-03T16:17:28Z

?sv = 2019-12-12&ss = bfqt&srt = sco&sp = rwdlacupx&se = 2020-09-03T16:17:28Z&st = 2020-09-02T08:17:28Z&spr = https&sig =

您可以参考此官员document

enter image description here

如果没有像您提供的se令牌那样包含SAS字段,那么我认为无法直接确定它何时到期。

,

我自己找到了解决方案。该blog描述了两个不同的ShardedAccessSignature。我已经修改了代码,以便现在在URL中也拥有se声明。

解决方案:

    protected void GetSharedAccessSignature(
   String containerName,String blobName)
{
    CloudStorageAccount cloudStorageAccount =
       CloudStorageAccount.FromConfigurationSetting(“DataConnectionString”);
    CloudBlobClient cloudBlobClient = cloudStorageAccount.CreateCloudBlobClient();
    CloudBlobContainer cloudBlobContainer =
       new CloudBlobContainer(containerName,cloudBlobClient);
    CloudBlockBlob cloudBlockBlob =
         cloudBlobContainer.GetBlockBlobReference(blobName);
    SharedAccessPolicy sharedAccessPolicy = new SharedAccessPolicy();
    sharedAccessPolicy.Permissions = SharedAccessPermissions.Read;
    sharedAccessPolicy.SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-10);
    sharedAccessPolicy.SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(40);
    String sharedAccessSignature1 =
        cloudBlockBlob.GetSharedAccessSignature(sharedAccessPolicy);
    String sharedAccessSignature2 =
       cloudBlockBlob.GetSharedAccessSignature( new SharedAccessPolicy(),“adele”);
}

sharedAccessSignature1包含se声明。 在我最初的问题代码中,我使用了sharedAccessSignature2。