首页 > 解决方案 > 在 c# 中从 Azure 中的 keyVault 获取机密

问题描述

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

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

获取令牌方法:

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 中 获取ClientIdand 。ClientSecret

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

任何回应都非常感谢!

PS:我的是用c#开发的windows服务

标签: c#azureazure-keyvault

解决方案


有没有办法可以从配置文件中删除并从其他任何地方获取。或者我的问题有什么好的解决方案。

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

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

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

这样就不需要存储相关信息了,但是需要先使用azure cli登录到azure再运行服务。该类AzureServiceTokenProvider将令牌缓存在内存中。有关更多详细信息,请参阅对自定义服务进行身份验证


推荐阅读