【问题标题】:Different SAS inside expiry time interval到期时间间隔内的不同 SAS
【发布时间】:2017-02-14 01:08:52
【问题描述】:

我为我的私有 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 );
}

【问题讨论】:

    标签: c# azure-blob-storage


    【解决方案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 policy 和Establishing a Stored Access Policy 了解更多信息。

    【讨论】:

      猜你喜欢
      • 2014-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-14
      • 1970-01-01
      • 2019-05-13
      • 1970-01-01
      • 2021-10-23
      相关资源
      最近更新 更多