Azure密钥保管库配置-间歇式”;“未经授权”;响应

Azure密钥保管库配置-间歇式”;“未经授权”;响应,azure,azure-active-directory,azure-keyvault,Azure,Azure Active Directory,Azure Keyvault,我有以下代码在启动时将Azure Key Vault机密加载到工作进程的配置中。该进程在Azure中配置并与证书关联,该证书也安装在进程运行的计算机上 此代码在大多数情况下都能正常工作,这是一个令人恼火的问题。每天有几次,在调用Build()时,连接到密钥保管库失败,并显示未经授权的消息,并关闭整个应用程序。然后,它莫名其妙地重新启动。我相信这可能与Azure Active Directory令牌过期有关,但我不知道该怎么办,因为下面的代码几乎与文档一字不差。此过程是长期运行且无人参与的,因此随

我有以下代码在启动时将Azure Key Vault机密加载到工作进程的配置中。该进程在Azure中配置并与证书关联,该证书也安装在进程运行的计算机上

此代码在大多数情况下都能正常工作,这是一个令人恼火的问题。每天有几次,在调用
Build()
时,连接到密钥保管库失败,并显示
未经授权的消息,并关闭整个应用程序。然后,它莫名其妙地重新启动。我相信这可能与Azure Active Directory令牌过期有关,但我不知道该怎么办,因为下面的代码几乎与文档一字不差。此过程是长期运行且无人参与的,因此随机故障是不可接受的

我尝试添加逻辑,在失败时等待几秒钟,然后重试,但似乎没有帮助。使用身份验证的证书方法是安全团队的一项硬要求

using (var certStore = new X509Store(certLocation, StoreLocation.CurrentUser))
{
    try
    {
        certStore.Open(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
        var certSearch = certStore.Certificates.Find(X509FindType.FindByThumbprint, thumbprint, false);

        // We expect a single result
        if (certSearch.Count == 1)
        {
            var result = certSearch.OfType<X509Certificate2>().Single();

            //Add the key vault as a config provider
            builder.AddAzureKeyVault($"https://{config[keyVaultName]}.vault.azure.net/",
                                     config[applicationId],
                                     result);

            //This will fail if Keyvault is not configured properly
            builder.Build();                                    
        }
    }
    finally
    {
         certStore.Close();
    }
}
使用(var certStore=new X509Store(certLocation,StoreLocation.CurrentUser))
{
尝试
{
打开(OpenFlags.ReadOnly | OpenFlags.OpenExistingOnly);
var certSearch=certStore.Certificates.Find(X509FindType.FindByThumbprint,指纹,false);
//我们期待一个单一的结果
如果(certSearch.Count==1)
{
var result=certSearch.OfType().Single();
//将密钥库添加为配置提供程序
builder.AddAzureKeyVault($”https://{config[keyVaultName]}.vault.azure.net/“,
配置[applicationId],
结果);
//如果未正确配置Keyvault,此操作将失败
builder.Build();
}
}
最后
{
certStore.Close();
}
}

不太相关,但也许您可以管理身份,而不是使用证书?您在本期中指的是什么文档?这看起来不像我见过的任何密钥库代码。@请参阅关于使用x509证书的部分:几件事:1)如上所述,MSI在Azure环境中更可取。我认为,在Azure环境中使用证书与MSI相比,实际上安全性较低,因为获取令牌的过程是通过网络进行的,而在MSI场景中,令牌是直接交付给该过程的。2) 为了弄清这个具体问题,您需要按照文章中的描述设置日志记录:当应用程序无法使用提供程序加载配置时,会向ASP.NET核心日志记录写入一条错误消息。文档中有一个指向它的链接。@但有此问题的进程不会在Azure中运行,因此MSI不是一个选项。它是一个连接到Azure中密钥库的本地服务。这就是使用证书的原因。日志记录只返回一条消息,上面写着“401:Unauthorized”-看起来底层HttpClient某处有问题