C# 到期时间间隔内的不同SAS

C# 到期时间间隔内的不同SAS,c#,azure-storage-blobs,C#,Azure Storage Blobs,我对我的私有Azure存储Blob使用共享访问签名。当我为blob设置30分钟的到期时间,当我第一次调用方法GetSasForBlobUsingAccessPolicy时,我通过sas获得一些url,当我第二次(在30分钟间隔内)在同一blob上调用相同的方法时,我得到不同的sas,两者都是有效的。为什么它们不同?如果没有过期,有可能得到同样的吗?如果sas过期并获得相同的sas,是否可以延长过期时间 以下是我的相关方法: public void SetBlobContainer( string

我对我的私有Azure存储Blob使用共享访问签名。当我为blob设置30分钟的到期时间,当我第一次调用方法GetSasForBlobUsingAccessPolicy时,我通过sas获得一些url,当我第二次(在30分钟间隔内)在同一blob上调用相同的方法时,我得到不同的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 );
}
为什么它们不同?如果没有过期,有可能得到同样的吗

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

有关更多信息,请参阅和