2017-10-18 6 views
2

J'essaye de mettre une sortie d'un service que je cours dans un coffre-fort de clés dans Azure. La sortie de mon service sera des informations d'identification de l'utilisateur, c'est pourquoi je veux utiliser Key Vault à cette fin. Jusqu'à présent, j'ai essayé la méthode SetSecretAsync de KeyVaultClient, mais cela ne fonctionne pas pour moi, je ne reçois aucun message d'erreur mais je ne vois pas non plus un nouveau secret créé dans mon KeyVault ciblé. Je n'ai pas été en mesure de trouver une méthode KeyVaultClient Add Secret car elle n'existe pas, est-ce que j'utilise le bon objet/méthode ici?Ajout de Secrets à Key Vault en C par programmation #

La méthode en question est AddResult.

Voici mon code:

private static AzureKeyVault instance; 
    private static KeyVaultClient client; 
    private AzureKeyVault() 
    { 
     //initialize the azure key vault 
     var vaultAddress = ConfigurationManager.AppSettings["VaultUri"]; 
     client = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetAccessToken)); 


    } 
    public static async Task<string> GetAccessToken(string authority, string resource, string scope) 
    { 
     var clientId = ConfigurationManager.AppSettings["ClientID"]; 
     var clientSecret = ConfigurationManager.AppSettings["ClientSecret"]; 
     ClientCredential clientCredential = new ClientCredential(clientId, clientSecret); 

     var context = new AuthenticationContext(authority, TokenCache.DefaultShared); 
     var result = await context.AcquireTokenAsync(resource, clientCredential); 

     return result.AccessToken; 
    } 


    public static AzureKeyVault GetInstance 
    { 
     get 
     { 
      if (instance == null) 
      { 
       instance = new AzureKeyVault(); 
      } 
      return instance; 
     } 
    } 

    public void AddResult(string machineIPAndPort, BruteForceResult result) 
    { 
     client.SetSecretAsync("https://vaultURI(redacted).vault.azure.net/", machineIPAndPort, JsonConvert.SerializeObject(result)); 
    } 
+0

Qu'est-ce que ça ne signifie pas pour moi? – evilSnobu

+0

Objectif == Titre (Ajouter un secret au coffre-fort) Résultat == Aucun secret ajouté et aucun message d'erreur. –

+0

Dans le secret, la machineIPandPort serait le nom, et le résultat sérialisé serait la valeur. –

Répondre

3

preuve de patience (attendre la création).

// Let's create a secret and read it back 

string vaultBaseUrl = "https://alice.vault.azure.net"; 
string secret = "from-NET-SDK"; 

// Await SetSecretAsync 
KeyVaultClient keyclient = new KeyVaultClient(GetToken); 
var result = keyclient.SetSecretAsync(vaultBaseUrl, secret, "Sup3eS3c5et").Result; 

// Print indented JSON response 
string prettyResult = JsonConvert.SerializeObject(result, Formatting.Indented); 
Console.WriteLine($"SetSecretAsync completed: {prettyResult}\n"); 

// Read back secret 
string secretUrl = $"{vaultBaseUrl}/secrets/{secret}"; 
var secretWeJustWroteTo = keyclient.GetSecretAsync(secretUrl).Result; 
Console.WriteLine($"secret: {secretWeJustWroteTo.Id} = {secretWeJustWroteTo.Value}"); 

Résultat:

SetSecretAsync completed: 

{ 
    "SecretIdentifier":{ 
     "BaseIdentifier":"https://alice.vault.azure.net:443/secrets/from-NET-SDK", 
     "Identifier":"https://alice.vault.azure.net:443/secrets/from-NET-SDK/59793...", 
     "Name":"from-NET-SDK", 
     "Vault":"https://alice.vault.azure.net:443", 
     "VaultWithoutScheme":"alice.vault.azure.net", 
     "Version":"597930b70565447d8ba9ba525a206a9e" 
    }, 
    "value":"Sup3eS3c5et", 
    "id":"https://alice.vault.azure.net/secrets/from-NET-SDK/59...", 
    "contentType":null, 
    "attributes":{ 
     "recoveryLevel":"Purgeable", 
     "enabled":true, 
     "nbf":null, 
     "exp":null, 
     "created":1508354384, 
     "updated":1508354384 
    }, 
    "tags":null, 
    "kid":null, 
    "managed":null 
} 

secret: https://alice.vault.azure.net/secrets/from-NET-SDK/59793... = Sup3eS3c5et 

Ce que vous devez vraiment faire est de récrire AddResult():

public bool AddResult(string machineIPAndPort, BruteForceResult result) 
{ 
    await result = client.SetSecretAsync("https://vaultURI(redacted).vault.azure.net/", 
     machineIPAndPort, JsonConvert.SerializeObject(result)); 

    return true; 
} 

Et peut-être envelopper que dans un try-catch et lire le InnerException depuis that's where the meaningful HTTP response body will be. Par exemple, en faisant la demande contre un coffre-fort Key je n'ai pas accès aux résultats dans:

InnerException

Et aussi parce que c'est le nuage, vous êtes dans une concurrence féroce avec other mission critical traffic, les choses échouera .

+0

Cela a fonctionné à merveille, merci. Je suppose que le problème était que je devais attendre le résultat ... quelque chose que vous penseriez qu'ils documenteraient. Merci EvilSnobu –

+0

Vous m'avez beaucoup appris sur la façon dont async fonctionne et peu de choses sur l'obtention des résultats au lieu d'impliquer async ... Merci monsieur! –

+0

Mais vous ne devriez pas faire cela, vous devez implémenter async/wait. Mais vous savez .. la vie est courte :) – evilSnobu