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

时间:2016-04-12 16:54:47

标签: powershell azure azure-storage-blobs azure-powershell

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

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表格#39 ;已经能够从Azure查询。

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

缺少什么语法/步骤?

2 个答案:

答案 0 :(得分:2)

我认为您在Storage Client Library中发现了一个错误。我将代码从PowerShell跟踪到存储客户端库,这是我发现的。 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

答案 1 :(得分:0)

这是旧的,但现在存储上下文正在与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