如何使用 -SasToken 而不是 -StorageAccountKey 调用 New-AzureStorageContext

How can I call New-AzureStorageContext using -SasToken instead of -StorageAccountKey

使用 Azure Powershell v1.3,我尝试使用引用现有策略的现有共享访问签名令牌创建新的存储上下文。当我用 -SasToken-StorageAccountName 调用 New-AzureStorageContext 时,出现错误:

PS C:\> $ctx = New-AzureStorageContext -SasToken '?sr=c&sv=2015-02-21&si=ReadOnly&sig=<signature omitted>=&api-version=2015-04-05' -StorageAccountName 'mystorageaccount'

New-AzureStorageContext : An item with the same key has already been added.
At line:1 char:8

我觉得我的 SAS 令牌格式有误,或者缺少步骤或参数,但没有关于它应该是什么样子的示例,这是我唯一的 SAS 形式能够从 Azure 查询。

注意我不想使用 New-AzureStorageAccountSASToken(所有示例都使用),因为我已经有一个令牌,只想将它用于只读目的,所以我不需要使用存储帐户密钥。创建一个新的需要我不希望此客户端拥有的权限。

缺少的语法/步骤是什么?

我认为您在存储客户端库中发现了一个错误。我追踪了从 PowerShell 到 Storage Client Library 的代码,这就是我的发现。 PowerShell Cmdlet 代码尝试通过传递此 SAS 令牌来创建 StorageCredentials 对象。

    public StorageCredentials(string sasToken)
    {
        CommonUtility.AssertNotNullOrEmpty("sasToken", sasToken);

        this.SASToken = sasToken;
        this.UpdateQueryBuilder();
    }

    private void UpdateQueryBuilder()
    {
        SasQueryBuilder newQueryBuilder = new SasQueryBuilder(this.SASToken);

        newQueryBuilder.Add(Constants.QueryConstants.ApiVersion, Constants.HeaderConstants.TargetStorageVersion);

        this.queryBuilder = newQueryBuilder;
    }

现在,如果您查看 UpdateQueryBuilder 的代码,它会尝试再次添加 api-version,而不检查它是否已经存在。

我为此在 Github 上创建了一个问题:https://github.com/Azure/azure-storage-net/issues/259

这是一个旧的,但现在存储上下文正在与 SAS 一起工作:

$resourceGroup="YourResourceGroupName"
$storAccName = "YourStorageAccountName"

# get Storage Key
$storKey = (Get-AzureRmStorageAccountKey -ResourceGroupName $resourceGroup -Name $storAccName).Value[0]

# create main Storage Context
$storCont = New-AzureStorageContext -StorageAccountName $storAccName -StorageAccountKey $storKey

# create SAS token
$storSAS = New-AzureStorageAccountSASToken -Service Blob, Queue -ResourceType Service, Container, Object -Permission "rwdalucp" -Context $storCont

# create SAS-based Storage Context
$storContSAS = New-AzureStorageContext -StorageAccountName $storAccName -SasToken $storSAS