【问题标题】:Programatically adding Secrets to Key Vault in C#在 C# 中以编程方式将机密添加到 Key Vault
【发布时间】:2018-06-15 13:45:45
【问题描述】:

我正在尝试将我正在运行的服务的一些输出放在 Azure 的 Key Vault 中。我的服务的输出将是用户凭据,这就是我要为此目的使用 Key Vault 的原因。

到目前为止,我已经尝试过 KeyVaultClient 的 SetSecretAsync 方法,但它对我不起作用,我没有收到任何错误消息,但是我也没有看到在我的目标 KeyVault 中创建了新的机密。我找不到 KeyVaultClient Add Secret 方法,因为它不存在,我在这里使用正确的对象/方法吗?

这里讨论的方法是 AddResult。

这是我的代码:

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

【问题讨论】:

  • 它不适合我是什么意思?
  • 目标 == 标题(向 Key Vault 添加密钥)结果 == 未添加任何密钥,也没有错误消息。
  • Secret中machineIPandPort为名称,序列化结果为Value。
  • 您不应该等待SetSecretAsync 的电话(或.Result,如果您真的很着急的话)?对我来说效果很好。
  • 我该怎么做?只需将 SetSecretAsync 的输出保存到变量并等待它?像 var res = await client.SetSecretAsync 然后在 AddResult 上更改我的返回类型?

标签: c# azure azure-keyvault


【解决方案1】:

耐心等待(等待创建)。

// 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}");

结果:

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

你真正应该做的是重写AddResult()

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

    return true;
}

也许将其包装在try-catch 中,并从that's where the meaningful HTTP response body will be 开始阅读InnerException。例如,针对我无权访问的 Key Vault 发出请求会导致:

而且因为这是云,你要和other mission critical traffic展开激烈的竞争,事情会失败。

【讨论】:

  • 效果很好,谢谢。我想问题是我不得不等待结果......你认为他们会记录的东西。谢谢 EvilSnobu
  • 您实际上教会了我很多关于异步工作原理的知识,以及获得结果而不是实现异步的小技巧...谢谢先生!
  • 但是你不应该那样做,你应该实现正确的 async/await。但你知道.. 生命短暂:)
  • 哈哈,我觉得这有点儿笨拙,,,但我很欣赏快速获胜 =) 再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-19
  • 1970-01-01
  • 2020-12-19
  • 2020-04-21
  • 2020-01-31
  • 2019-07-28
  • 2020-03-30
相关资源
最近更新 更多