SAS 令牌值在使用 Azure CLI 命令创建时与通过 Azure powershell 命令创建时的预期行为不同

SAS token values differ in expected behavior when created using Azure CLI commands vs when created via Azure powershell commands

我正在生成一个 SAS 令牌以访问我的 ARM 部署中的链接模板。我将 SAS 令牌作为参数覆盖传递给 az 部署命令。结果是我的模板部署失败并出现错误“无法从‘https://myLinkedTemplateURL?SASToken

下载部署内容”

首先,我获取存储在密钥库中的 storageAccountKey:

$storeKey = az keyvault secret show --name "myStorageSecretName" --vault-name "myKeyVaultName" --query value
$storeKey  = $storeKey.Replace('"','')

然后,这是我生成 SAS 令牌的两种方法:

  1. 通过此方法生成的SAS令牌部署成功

    $context = New-AzureStorageContext -StorageAccountName 'myStorageAccountName' -StorageAccountKey $storeKey $tokenval = New-AzureStorageContainerSASToken -Container builds -Permission rwdl -Context $context

  2. 通过此方法生成的 SAS 令牌部署失败

    $tokenval = az 存储容器生成-sas --account-key $storeKey --account-name "myStorageAccountName" --name "testcontainer" --permissions acdlrw --expiry (Get-Date ).AddMinutes(30).ToString("yyyy-MM-dTH:mZ")

另外,我观察到第二种方法生成的SASToken长度比第一种方法短。

谁能帮忙解释一下以上两种方法有什么区别,为什么一个失败而另一个成功?

$tokenval = az storage container generate-sas --account-key $storeKey --account-name "myStorageAccountName" --name "testcontainer" --permissions acdlrw --expiry (Get-Date).AddMinutes(30).ToString("yyyy-MM-dTH:mZ")

如评论中所述,问题实际上与 SAS 到期日有关。您正在获取本地日期并将其格式化为 ISO 8601 格式,而您需要获取 UTC 格式的 date/time 值并对其进行格式化。

请尝试类似的操作:

$tokenval = az storage container generate-sas --account-key $storeKey --account-name "myStorageAccountName" --name "testcontainer" --permissions acdlrw --expiry (Get-Date).ToUniversalTime().AddMinutes(30).ToString("yyyy-MM-dTH:mZ")
我认为问题在于您如何定义权限 (`acdlrw`)。根据 [`文档`][1],权限必须按特定顺序指定。从这个 link: > 可以组合权限以允许客户端执行多个 > 具有相同签名的操作。 **构建 SAS 时,您 > 必须按照它们在 table 中出现的顺序包含权限 > 对于资源类型**。 基于此,您可以按以下顺序尝试使用权限 - `racwdl`?