2016-04-12 2 views
1

Используя Azure Powershell v1.3, я пытаюсь создать новый контекст хранения, используя существующий токен подписки общего доступа, который ссылается на существующую политику. Когда я называю New-AzureStorageContext с -SasToken и -StorageAccountName я получаю сообщение об ошибке:Как я могу вызвать New-AzureStorageContext, используя -SasToken вместо -StorageAccountKey

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 (что все примеры используют), поскольку у меня уже есть токен и просто хочу использовать его для целей только для чтения, поэтому мне не нужно использовать ключи учетной записи хранилища , Для создания нового потребуется разрешение, которое я не хочу иметь этого клиента.

Каков недостающий синтаксис/шаг?

+1

Я не 100% уверен, но я думаю, что это выглядит как ошибка в PowerShell командлетов. Если мой токен SAS имеет параметр api-version', я получаю ту же ошибку, что и вы. Если я удалю его, ошибка исчезнет. Я использовал токен SAS с «api-версией» и без него, и он работал отлично. –

+0

На самом деле это ошибка в библиотеке клиентов хранилища! –

ответ

2

Я думаю, что вы обнаружили ошибку в библиотеке клиентов хранилища. Я проследил код от PowerShell до Библиотеки клиентов хранилища, и вот что я нашел. Код командлета PowerShell пытается создать объект StorageCredentials, передав этот токен SAS.

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.

+0

Спасибо! Путь к отправке вопроса. Это может быть самым быстрым наблюдением MS, которое я когда-либо видел. – codekaizen

0

Это старый один, но теперь Storage Контекстное работает с 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