在C#中从Azure中的keyVault中获取机密

时间:2018-10-01 05:19:51

标签: c# azure azure-keyvault

我有以下代码,该代码可从KeyVault检索秘密。

var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(GetToken));
var sec = await kv.GetSecretAsync(ConfigurationManager.AppSettings["SomeURI"]);
secretValue = sec.Value ;

GetToken方法:

async Task<string> GetToken(string authority, string resource, string scope)
{
    var authContext = new AuthenticationContext(authority);
    ClientCredential clientCred = new ClientCredential(ConfigurationManager.AppSettings["ClientId"],ConfigurationManager.AppSettings["ClientSecret"]);
    AuthenticationResult result = await authContext.AcquireTokenAsync(resource, clientCred);    
    if (result == null)
        throw new InvalidOperationException("Failed to obtain the token");    
    return result.AccessToken;
}

在GetToken方法中,我从Appconfig中获取ClientIdClientSecret

我觉得将这些值保留在Appconfig中并使用它们并不安全。有没有一种方法可以从配置文件中删除并从其他任何地方获取。或者有没有可能解决我的问题的好方法。

任何回应都非常感谢!

PS:Mine是用C#开发的Windows服务

1 个答案:

答案 0 :(得分:1)

  

有没有一种方法可以从配置文件中删除并从其他任何地方获取。或者有没有可能解决我的问题?

根据我的理解,您可以将相关信息存储到数据库中。然后,您可以使用windows Authentication访问数据库以获取相关信息。

使用托管身份的另一种方法是通过Microsoft.Azure.Services.AppAuthentication

var azureServiceTokenProvider = new AzureServiceTokenProvider();
var kv = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));

通过这种方式,您无需存储相关信息,但是在运行服务之前,需要先使用azure cli登录到azure。 AzureServiceTokenProvider类将令牌缓存在内存中。有关更多详细信息,请参阅authenticate to custom services