到期时间间隔内的不同 SAS
Different SAS inside expiry time interval
我对我的私有 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 );
}
Why are they differ? Is it possible to get same one if it is not expired?
每次调用GetSharedAccessSignature 方法时,您将获得不同的SAS。每个都会有不同的开始时间和到期时间,因为你在不同的时间调用了方法,但它们可能具有相同的权限和其他 SAS 参数。
您可以为 blob 生成任意数量的共享访问签名。每个都是唯一的,除非调用非常连续以至于每个调用的时钟时间都相同(这不太可能)。
SAS 不会以任何方式与 blob 一起存储。它只是一个生成的令牌,包括 SAS 参数(到期、权限、资源等)和签名。签名部分用于验证使用 SAS 发出的有效请求。
因此,在SAS 有效的时间间隔内调用GetSharedAccessSignature 是不可能生成相同的SAS 的。您将始终获得新的 SAS。但是它们有效的时间间隔可以重叠,正如您在使用它时所发现的那样。
Is it possible to extend expiry time if sas is expired and get the same sas?
如果您需要延长 SAS 上的到期时间,您可以在 blob 容器上创建存储访问策略,并在那里修改到期时间。但是,您需要在 SAS 过期 之前 修改过期时间。如果它过期,您将需要创建一个新的 SAS。
根据文档,这里是存储访问策略的定义:
存储访问策略是在资源容器(blob 容器、table、队列或文件共享)上定义的,可用于管理一个或多个共享访问签名的约束。当您将 SAS 与存储访问策略相关联时,SAS 会继承为存储访问策略定义的约束 - 开始时间、到期时间和权限。
并且:
要修改存储访问策略的参数,可以调用资源类型的访问控制列表操作(例如,CloudBlobContainer.SetPermissions)来替换现有策略,指定新的开始时间、过期时间,或一组权限。例如,如果您现有的策略授予对资源的读写权限,您可以将其修改为仅授予对所有未来请求的读取权限。在这种情况下,新策略的签名标识符(由 ID 字段指定)将与您要替换的策略的签名标识符相同。
您可以拥有没有访问策略的 SAS,但除非您使用访问策略,否则无法延长到期时间。
有关详细信息,请参阅 Controlling a SAS with a stored access policy and Establishing a Stored Access Policy。
我对我的私有 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 );
}
Why are they differ? Is it possible to get same one if it is not expired?
每次调用GetSharedAccessSignature 方法时,您将获得不同的SAS。每个都会有不同的开始时间和到期时间,因为你在不同的时间调用了方法,但它们可能具有相同的权限和其他 SAS 参数。
您可以为 blob 生成任意数量的共享访问签名。每个都是唯一的,除非调用非常连续以至于每个调用的时钟时间都相同(这不太可能)。
SAS 不会以任何方式与 blob 一起存储。它只是一个生成的令牌,包括 SAS 参数(到期、权限、资源等)和签名。签名部分用于验证使用 SAS 发出的有效请求。
因此,在SAS 有效的时间间隔内调用GetSharedAccessSignature 是不可能生成相同的SAS 的。您将始终获得新的 SAS。但是它们有效的时间间隔可以重叠,正如您在使用它时所发现的那样。
Is it possible to extend expiry time if sas is expired and get the same sas?
如果您需要延长 SAS 上的到期时间,您可以在 blob 容器上创建存储访问策略,并在那里修改到期时间。但是,您需要在 SAS 过期 之前 修改过期时间。如果它过期,您将需要创建一个新的 SAS。
根据文档,这里是存储访问策略的定义:
存储访问策略是在资源容器(blob 容器、table、队列或文件共享)上定义的,可用于管理一个或多个共享访问签名的约束。当您将 SAS 与存储访问策略相关联时,SAS 会继承为存储访问策略定义的约束 - 开始时间、到期时间和权限。
并且:
要修改存储访问策略的参数,可以调用资源类型的访问控制列表操作(例如,CloudBlobContainer.SetPermissions)来替换现有策略,指定新的开始时间、过期时间,或一组权限。例如,如果您现有的策略授予对资源的读写权限,您可以将其修改为仅授予对所有未来请求的读取权限。在这种情况下,新策略的签名标识符(由 ID 字段指定)将与您要替换的策略的签名标识符相同。
您可以拥有没有访问策略的 SAS,但除非您使用访问策略,否则无法延长到期时间。
有关详细信息,请参阅 Controlling a SAS with a stored access policy and Establishing a Stored Access Policy。