从.Net应用程序访问Azure密钥库-获取DefaultAzureCredential身份验证失败

从.Net应用程序访问Azure密钥库-获取DefaultAzureCredential身份验证失败,azure,asp.net-core,azure-keyvault,Azure,Asp.net Core,Azure Keyvault,我正在尝试将我的.Net Core 3.1应用程序连接到Azure密钥库。我遵循了教程,发现以下错误: Microsoft.Extensions.Configuration.AzureAppConfiguration.KeyVault引用异常: 'DefaultAzureCredential身份验证失败。。错误代码:, 密钥:身份验证:Twitter:ConsumerRapiKey 内部例外是: MsalServiceException:AADSTS70002:客户端不存在或未为使用者启用 Cr

我正在尝试将我的.Net Core 3.1应用程序连接到Azure密钥库。我遵循了教程,发现以下错误:

Microsoft.Extensions.Configuration.AzureAppConfiguration.KeyVault引用异常: 'DefaultAzureCredential身份验证失败。。错误代码:, 密钥:身份验证:Twitter:ConsumerRapiKey

内部例外是:

MsalServiceException:AADSTS70002:客户端不存在或未为使用者启用

CreateHostBuilder方法如下所示:

public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder
                    .ConfigureAppConfiguration((hostingContext, config) =>
                    {
                        var settings = config.Build();

                        config.AddAzureAppConfiguration(options =>
                        {
                            options.Connect(settings["ConnectionStrings:AppConfig"])
                                .ConfigureKeyVault(kv =>
                                {
                                    kv.SetCredential(new DefaultAzureCredential());
                                });
                        });
                    })
                    .UseStartup<Startup>();
            });
公共静态IHostBuilder CreateHostBuilder(字符串[]args)=>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder=>
{
韦伯造船厂
.ConfigureAppConfiguration((hostingContext,config)=>
{
var settings=config.Build();
config.AddAzureAppConfiguration(选项=>
{
options.Connect(设置[“ConnectionString:AppConfig”])
.ConfigureKeyVault(kv=>
{
kv.SetCredential(新的DefaultAzureCredential());
});
});
})
.UseStartup();
});
我在网上几乎找不到关于使用多个凭证的参考(我不是)

有谁能给我一个前进的方向:一些可能导致它的线索吗

编辑

以下似乎有效:

var defaultAzureCredentialsOptions = new DefaultAzureCredentialOptions()
{                                
    SharedTokenCacheTenantId = <tenant id>,
    SharedTokenCacheUsername = <my azure username>,
    ExcludeInteractiveBrowserCredential = false,
    ExcludeEnvironmentCredential = false,
    InteractiveBrowserTenantId = <tenant id>
};

config.AddAzureAppConfiguration(options =>
{                                
    options.Connect(settings["ConnectionStrings:AppConfig"])
        .ConfigureKeyVault(kv =>
        {
            kv.SetCredential(new DefaultAzureCredential(defaultAzureCredentialsOptions));
        });
});
var DefaultAzureCredentialOptions=new DefaultAzureCredentialOptions()
{                                
SharedTokencachetenatid=,
SharedTokenCacheUsername=,
ExcludeInteractiveBrowserCredential=false,
ExcludeEnvironmentCredential=false,
InteractiveBrowserTenantId=
};
config.AddAzureAppConfiguration(选项=>
{                                
options.Connect(设置[“ConnectionString:AppConfig”])
.ConfigureKeyVault(kv=>
{
kv.SetCredential(新的DefaultAzureCredentials(DefaultAzureCredentials选项));
});
});

虽然这确实有效(就目前而言),但我现在有了租户ID和我的用户名硬编码;当我启动站点时,会弹出一个弹出窗口,要求我登录。

默认AzureCredential会检查许多凭据,例如托管标识,建议Azure服务使用更安全的标识(无共享访问令牌)

但是,您可以使用为应用程序或甚至在本地开发期间设置的环境变量,即:

  • AZURE\u租户\u ID:租户ID
  • AZURE_CLIENT_ID:服务主体ID,必须已被授予必要的权限,如
    list
    get
    ,以便在示例中使用它们
  • AZURE_客户端_机密:服务主体机密(密码),仅在创建后才显示给您

如果您使用Azure.Identity的新预览版本,它还支持Azure CLI、Visual Studio和其他用于开发环境的凭据。例如,如果您使用Azure CLI,一旦
az登录
DefaultAzureCredential
将正常工作。

它可能是在Visual Studio中获取您已通过身份验证的帐户以访问密钥库,但是该帐户是Azure AD中不存在的个人Microsoft帐户。您可以尝试将您的Azure AD租户id指定为SharedTokenCacheTrantid(IIRC)以及选项对象中的其他租户id。@juunas-您可能有问题。如果我指定SharedTokenCacheTID和SharedTokenCacheUsername,我将从密钥库中获得一个禁止的错误。虽然我已经在访问策略刀片服务器中为我的用户名授予了所有可用权限,但我仍然收到一条禁止的消息好吧,这很奇怪:\@juunas按照你的建议,我已经让它正常工作了(请参见编辑)。我的猜测是,我缺少一些配置或设置(显然,我不应该将我的租户id和用户名硬编码到系统中),哦,弹出窗口非常奇怪。是否在DefaultAzureCredential的选项中禁用了交互凭据?添加服务主体在本地起作用。我试着安装Azure.Identity的预览版-没有任何区别。所以,我有一个关于部署的相关问题。部署的版本不起作用-我假设是因为环境变量AZURE\u CLIENT\u ID等。。没有设定;但这些确实需要加密(即在KeyVault中)?它们需要在应用程序配置中得到保护,但不能通过Key Vault进行加密,因为它们是访问Key Vault所必需的。如果您的平台已经支持在静止时加密机密(例如Azure管道或GitHub操作),那么这些环境变量值最好作为机密保存;然而,为什么不使用这些平台的秘密呢?但是对于你的托管应用程序来说,通常添加那些必需的环境变量是很常见的——希望很少有可信的人能够访问/更改你的应用程序的设置。在某个阶段,你需要把城堡的钥匙存放在钥匙库外面,我开始怀疑使用它有什么好处。似乎无论您在哪里存储密钥,都可以存储其余的值:-)(对不起,这显然偏离了问题)。如果您正在存储允许您访问KeyVault的详细信息,则KeyVault的安全性仅与其密钥相同。那么,为什么不把所有东西都存储在你想存储钥匙库秘密的任何地方呢:根据定义,它的安全性同样高。我只想强调一下@PaulMichaels的观点。如果您使用KeyVault存储配置机密,并且