2016-04-12 10 views
1

Mit Azure Powershell v1.3 versuche ich, einen neuen Speicherkontext mithilfe eines vorhandenen Tokens für gemeinsame Zugriffssignaturen zu erstellen, das auf eine vorhandene Richtlinie verweist. Als ich New-AzureStorageContext mit -SasToken und -StorageAccountName nennen bekomme ich einen Fehler:Wie kann ich New-AzureStorageContext mithilfe von -SasToken anstelle von -StorageAccountKey aufrufen

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 

Ich fühle mich wie ich das Format der SAS-Token falsch bin immer, oder einen Schritt oder Parameter bin fehlt, aber es gibt keine Beispiele auf, was Es sollte so aussehen, und dies ist das einzige SAS-Formular, das ich von Azure abfragen konnte.

Hinweis Ich möchte nicht New-AzureStorageAccountSASToken (die alle Beispiele verwenden) verwenden, da ich bereits ein Token habe und es nur für Lesezwecke verwenden möchte, sodass ich die Speicherkontoschlüssel nicht verwenden muss . Das Erstellen eines neuen benötigt Berechtigungen, die dieser Client nicht haben soll.

Was ist die fehlende Syntax/Schritt?

+1

mir nicht 100% sicher bin, aber ich denke, das in Powershell-Cmdlets wie ein Fehler aussieht. Wenn mein SAS-Token den Parameter 'API-Version' hat, erhalte ich denselben Fehler, den Sie erhalten. Wenn ich es entferne, ist der Fehler weg. Ich habe den SAS Token mit und ohne 'api-Version' benutzt und es hat gut funktioniert. –

+0

Eigentlich ist es ein Fehler in der Speicher-Client-Bibliothek! –

Antwort

2

Ich denke, Sie haben einen Fehler in Storage Client Library entdeckt. Ich habe den Code von PowerShell zur Storage Client Library verfolgt und hier ist, was ich gefunden habe. PowerShell Cmdlet-Code versucht, ein StorageCredentials Objekt zu erstellen, indem dieses SAS-Token übergibt.

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; 
    } 

Nun, wenn Sie für UpdateQueryBuilder den Code anschauen, versucht es api-version erneut hinzuzufügen, ohne zu überprüfen, ob diese bereits vorhanden ist.

Ich habe ein Problem auf Github dafür erstellt: https://github.com/Azure/azure-storage-net/issues/259.

+0

Danke! Möglichkeit, das Problem weiter zu stellen. Das könnte das schnellste Follow-up von MS sein, das ich je gesehen habe. – codekaizen

0

Es ist alt, aber jetzt Speicher Kontext arbeitet mit 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