到期时间间隔内的不同SAS

时间:2016-10-05 14:19:27

标签: c# azure-storage-blobs

我为我的私有Azure存储blob使用共享访问签名。当我为blob设置了30分钟的到期时间,并且当我第一次调用方法GetSasForBlobUsingAccessPolicy时,我得到了一些带有sas的url,当我第二次在同一个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 );
}

1 个答案:

答案 0 :(得分:1)

  

他们为什么不同?如果它没有过期,是否可以获得同一个?

每次调用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,但除非您使用访问策略,否则无法延长到期时间。

有关详细信息,请参阅Controlling a SAS with a stored access policyEstablishing a Stored Access Policy