) Azure存储 - 生成SAS令牌(门户 vs PowerShell)

3
在我们的CI/CD流水线中,我正在尝试自动创建SAS令牌来供其他系统使用的容器。每个SAS令牌“指向”一个共享访问策略。
我的第一个想法是将其添加到我们的PowerShell发布后脚本中,以便我们可以随着扩展将新容器(包括SAS令牌和共享访问策略)的创建添加到脚本中。一切都正常工作,并且我成功生成了策略和SAS令牌,但是我遇到了一件与通过Azure门户生成SAS令牌时不同的事情。我希望有人能解释这种差异。 PowerShell脚本(在VSTS的部署管道中运行)
Select-AzureRmSubscription -SubscriptionId $useSubscription
Set-AzureRmContext -SubscriptionId $useSubscription

$accountKeys = Get-AzureRmStorageAccountKey -ResourceGroupName $useResourceGroupName -Name $storageAccountName
$storageContext = New-AzureStorageContext -StorageAccountName $storageAccountName -StorageAccountKey $accountKeys[0].Value 
$expiryTime = (get-date).AddYears(1)
$permission = "rwl"

New-AzureStorageContainerStoredAccessPolicy -Context $storageContext -Container "test-container" -Policy "testPolicy" -ExpiryTime $expiryTime -Permission $permission

$sasToken = New-AzureStorageContainerSASToken  -Name "test-container" -Policy "testPolicy" -Context $storageContext
$sasToken = $sasToken.substring(1)

Write-Host "SAS token (ref shared access policy): $sasToken"

$sasToken2 = New-AzureStorageContainerSASToken -Context $storageContext -Container tibp-userprofiles -Permission rwl
Write-Host 'SAS token: ' $($sasToken2)

当前输出为:

SAS token (ref shared access policy): sv=2015-04-05&sr=c&si=tibpsaptest2&sig=rkzN3ocRZUrz5ub2IcVPKGIARvw3%2B2rh1G3yKmnSXhA%3D
SAS token:  ?sv=2015-04-05&sr=c&sig=9kMVFE7U61P1ikK27ylXqXiIkSaj71OImdM88RrtJfs%3D&se=2017-05-22T08%3A40%3A39Z&sp=rwl

我的问题是为什么使用Powershell cmdlet设置sv的时间为2015-04-05,而不是最新版本2016-05-31?如果我生成一个干净的SAS令牌(不受共享访问策略支持),那么我的sv会得到相同的结果。
如果我使用Azure门户(使用相同的存储帐户和容器)生成SAS令牌,则会将sv设置为最新版本(2016-05-31)。 Azure门户的输出:
?sv=2016-05-31&ss=b&srt=sco&sp=rwl&se=2017-05-22T17:36:58Z&st=2017-05-22T09:36:58Z&spr=https&sig=UTibTnwmwYl3k3iIYj63VbYItL5eV4K4t6PEZ7ihi3E%3D

使用VSTS运行CI/CD管道,我使用标准的Azure PowerShell任务来运行脚本。

VSTS中的Azure PowerShell版本

1个回答

3
您可以使用以下cmdlet生成SAS令牌,其结果与Portal相同。
$now=get-date

New-AzureStorageContainerSASToken -Name <container name> -Context $storageContext -Permission rwl -StartTime $now.AddHours(-1) -ExpiryTime $now.AddMonths(1)

我的测试结果如下

?sv=2015-04-05&sr=c&sig=tMG2TwiAGXkDqwFbj7%2BRjI52qXUKU9NDI%2BmkxMY%2BjtM%3D&st=2017-05-22T00%3A41%3A50Z&se=2017-06-22T01%3A41%3A50Z&sp=rwl

你可以检查它们是否相同,除了API版本?sv=2015-04-05。有关SAS的更多信息,请参阅link
更新:
我知道原因了,Azure门户使用最新的API版本生成SAS令牌,但是你本地的Azure PowerShell没有使用最新版本。
你可以使用以下命令检查你的Azure PowerShell版本。
Get-Module -ListAvailable -Name Azure -Refresh

在最新版本(目前为4.01)中使用最新的API版本。您可以从link下载mis安装程序。
PS C:\Users\v-shshui> New-AzureStorageContainerSASToken -Name vhds -Context $storageContext -Permission rwl -StartTime $now.AddHours(-1) -ExpiryTime $now.AddMonths(1)
?sv=2016-05-31&sr=c&sig=zdrwTEEmvTn6rjoJPVWOdQYzggrvygTHGoBsOBYgzuI%3D&st=2017-05-22T07%3A56%3A21Z&se=2017-06-22T08%3A56%3A21Z&sp=rwl

当我使用你的脚本时,我得到了相同的结果。我建议你应该改变你的脚本。 - Shui shengbao
我在使用你的脚本后没有看到任何结果上的差异。我已经编辑了我的问题以澄清这个问题。目标是生成一个由共享访问策略支持并使用sv 2016-05-31的SAS令牌。 - soderstromOlov
@soderstromOlov 你好,我知道原因,你可以检查一下你的Azure PowerShell版本。当你使用最新的PowerShell版本(4.01)时,你可以生成最新API版本的SAS令牌。 - Shui shengbao
感谢@Walter - MSFT的反馈!在本地使用版本4运行脚本确实生成了所需的令牌。但是...在VSTS部署任务期间进行快速检查后,我发现它使用Azure PowerShell ver 3.5,因此给我提供了旧的存储服务版本。有什么解决办法吗?还是我必须在目标机器上运行Powershell任务以获取最新版本的Azure PS? - soderstromOlov
@soderstromOlov 不,API版本被封装在PowerShell cmdlet中,我们无法更改它。您应该使用最新版本。 - Shui shengbao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接