Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用应用程序客户端机密访问azure密钥vault机密_C#_Azure_Azure Active Directory_Azure Keyvault - Fatal编程技术网

C# 使用应用程序客户端机密访问azure密钥vault机密

C# 使用应用程序客户端机密访问azure密钥vault机密,c#,azure,azure-active-directory,azure-keyvault,C#,Azure,Azure Active Directory,Azure Keyvault,问题陈述:在web/console c#应用程序中以编程方式检索和使用存储在azure key vault中的敏感值(例如数据库连接字符串) 我知道您可以在AAD中注册一个应用程序,并使用其客户端id和客户端密码以编程方式生成一个可用于调用/访问azure key vault secrets的广告令牌 我感到困惑的是,客户机密码本身是一个敏感的“密码”,您希望将其存储在密钥库中。一旦有人知道客户机密,他们就可以访问密钥库中的所有机密。那么,创建一个新的秘密(客户端秘密)来存储和访问原始秘密有什么

问题陈述:在web/console c#应用程序中以编程方式检索和使用存储在azure key vault中的敏感值(例如数据库连接字符串)

我知道您可以在AAD中注册一个应用程序,并使用其客户端id和客户端密码以编程方式生成一个可用于调用/访问azure key vault secrets的广告令牌

我感到困惑的是,客户机密码本身是一个敏感的“密码”,您希望将其存储在密钥库中。一旦有人知道客户机密,他们就可以访问密钥库中的所有机密。那么,创建一个新的秘密(客户端秘密)来存储和访问原始秘密有什么意义呢?(有人能解释一下背后的逻辑吗?谢谢!

这就是引导的问题。 您如何在不使用机密的情况下访问机密存储

如果你在Azure中运行你的应用程序,答案很简单。 使用

如果未在Azure中运行,则交互式应用程序可以代表当前用户访问密钥库。 这确实要求用户有权访问密钥Vault机密


另一种方法是使用证书而不是客户端密码。

如果你在Azure上托管你的应用程序,你可以使用托管身份在服务之间执行身份验证。 一旦Azure配置完成,您需要在应用程序中添加以下内容:它只需要存储Azure KeyVault URI-作为env变量会更好

以下代码将Azure KeyVault与AppConfiguration一起使用,因此本地
appsettings.json
文件为空:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureAppConfiguration((hostingContext, configBuilder) =>
            {
                if (hostingContext.HostingEnvironment.IsDevelopment()) return;

                AddAzureKeyVault(configBuilder);

                var configRoot = configBuilder.Build();
                AddAzureAppConfiguration(configBuilder, configRoot);
            });

        webBuilder.UseStartup<Startup>();
    });

private static void AddAzureKeyVault(IConfigurationBuilder configBuilder)
{
    var azureServiceTokenProvider = new AzureServiceTokenProvider();
    var keyVaultClient = new KeyVaultClient(new KeyVaultClient.AuthenticationCallback(azureServiceTokenProvider.KeyVaultTokenCallback));
    var keyVaultName = Environment.GetEnvironmentVariable("KEY_VAULT_NAME");

    configBuilder.AddAzureKeyVault(
        $"https://{keyVaultName}.vault.azure.net/",
        keyVaultClient,
        new DefaultKeyVaultSecretManager());
}

private static void AddAzureAppConfiguration(IConfigurationBuilder configBuilder, IConfigurationRoot configRoot)
{
    var appConfigName = configRoot["AppConfiguration-Name"];
    configBuilder.AddAzureAppConfiguration(appConfigName);
}
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
webBuilder.ConfigureAppConfiguration((hostingContext,configBuilder)=>
{
if(hostingContext.HostingEnvironment.IsDevelopment())返回;
AddAzureKeyVault(configBuilder);
var configRoot=configBuilder.Build();
AddAzureAppConfiguration(configBuilder、configRoot);
});
webBuilder.UseStartup();
});
专用静态void AddAzureKeyVault(IConfigurationBuilder configBuilder)
{
var azureServiceTokenProvider=新azureServiceTokenProvider();
var keyVaultClient=newkeyvaultclient(newkeyvaultclient.AuthenticationCallback(azureservicetokeprovider.KeyVaultTokenCallback));
var keyVaultName=Environment.GetEnvironmentVariable(“KEY_VAULT_NAME”);
configBuilder.AddAzureKeyVault(
$“https://{keyVaultName}.vault.azure.net/”,
KeyVault客户端,
新的DefaultKeyVaultSecretManager());
}
专用静态void AddAzureAppConfiguration(IConfigurationBuilder configBuilder、IConfigurationRoot configRoot)
{
var appConfigName=configRoot[“AppConfiguration Name”];
configBuilder.AddAzureAppConfiguration(appConfigName);
}

谢谢。我的应用程序是一个在用户计算机上本地运行的Windows应用程序。你能详细说明一下“交互式应用程序”是什么意思吗?它是某种用户模拟吗?如果你有选项2和选项3的链接,我将不胜感激。好的,当它是“公共客户端应用程序”时,一个在用户设备上运行的应用程序,您无法对该应用程序进行身份验证。您只能对用户进行身份验证。还请注意,使用该应用程序的用户可以访问密钥库数据,这就是为什么以他们的身份访问密钥库是有意义的。如果他们已经可以访问这些机密,则访问这些机密没有问题这里还有一个.NET示例应用:。正如@juunas所说,客户端证书将是一个很好的方法。使用密钥库创建客户端证书(自签名即可)。将证书与服务主体(注册应用程序)关联这允许它使用该证书登录。然后,您可以在本地计算机上安装证书,并允许代码以其登录方法发送证书。我将您的响应标记为答案。最后,您能否澄清-我知道存在这些解决方法,那么自ey似乎存在引导问题?如果您无法使用托管身份,并且您正在信任的环境中运行应用程序,例如后端服务器应用程序或在服务器上运行的计划作业,则该方法可以在这种情况下起作用。至少在这种情况下,Key Vault为您提供了一个集中的配置存储。它不像secu那样安全尽管可以,但只要这个秘密仍然是秘密,一切都会好起来的。