失效时间间隔内SAS不同

本文关键字:SAS 不同 时间 失效 | 更新日期: 2023-09-27 18:11:53

我对我的私有Azure存储blob使用共享访问签名。当我为blob设置30分钟的过期时间,当我第一次调用方法GetSasForBlobUsingAccessPolicy时,我得到一些url与sas,当我在同一blob上第二次调用相同的方法时(30分钟间隔内),我得到不同的sas,两者都是有效的。为什么它们不同?如果没有过期,有可能得到相同的吗?如果sas过期,是否可以延长有效期并获得相同的sas?

以下是我的相关方法:

public void SetBlobContainer( string containerName )
{
    string connectionString = string.Format( @"..." );
    string sharedAccessPolicyName = "my-policy";
    CloudStorageAccount storageAccount = CloudStorageAccount.Parse( connectionString );
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference( containerName );
    container.CreateIfNotExists();
    _blobContainer = container;
    if ( !_blobContainer.GetPermissions().SharedAccessPolicies.ContainsKey( sharedAccessPolicyName ) )
    {
        CreateSharedAccessPolicy( sharedAccessPolicyName );
    }
}
public string GetSasForBlob( CloudBlockBlob cloudBlockBlob )
{
    string sasToken = cloudBlockBlob.GetSharedAccessSignature( new SharedAccessBlobPolicy()
    {
        SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes( 30 ),
    }, "my-policy" );
    return string.Format( CultureInfo.InvariantCulture, "{0}{1}", cloudBlockBlob.Uri, sasToken );
}

失效时间间隔内SAS不同

为什么它们不同?如果没有过期,有可能得到相同的吗?

每次调用GetSharedAccessSignature方法时,您将获得不同的SAS。每个都有不同的开始时间和到期时间,因为您在不同的时间调用了该方法,但是它们可能具有相同的权限和其他SAS参数。

您可以为blob生成任意数量的共享访问签名。每个调用都是唯一的,除非调用的连续时间非常接近,以至于每个调用的时钟时间相同(这是不可能的)。

SAS不以任何方式与blob一起存储。它只是一个生成的令牌,其中包含SAS参数(过期、权限、资源等)和签名。签名部分用于验证使用SAS发出的请求,当它有效时。

因此,在SAS有效的时间间隔内通过调用GetSharedAccessSignature来生成相同的SAS是不可能的。你总会得到一个新的SAS。但是,正如您在使用它时发现的那样,它们有效的间隔可以重叠。

如果sas过期,是否可以延长有效期并获得相同的sas?

如果需要延长SAS的过期时间,可以在blob容器上创建存储访问策略,并在那里修改过期时间。但是,您需要在 SAS过期之前修改过期时间。如果它过期了,你需要创建一个新的SAS。

以下是文档中存储访问策略的定义:

存储访问策略是在资源容器(blob容器、表、队列或文件共享)上定义的,可用于管理一个或多个共享访问签名的约束。当SAS与存储访问策略关联时,SAS将继承存储访问策略定义的约束(开始时间、过期时间和权限)。

:

如果要修改存储访问策略的参数,可以调用资源类型的访问控制列表操作(例如CloudBlobContainer.SetPermissions)来替换现有策略,指定新的开始时间、到期时间或一组权限。例如,如果现有策略授予资源读和写权限,则可以将其修改为仅授予所有未来请求的读权限。在这种情况下,新策略的带签名标识符(由ID字段指定)将与您要替换的策略的带签名标识符相同。

您可以有一个没有访问策略的SAS,但是除非使用访问策略,否则不可能延长过期时间。

详情请参见使用存储访问策略控制SAS和建立存储访问策略。