Azure密钥保管库:未找到密码错误

时间:2017-11-19 21:36:15

标签: powershell azure ssl azure-web-sites azure-keyvault

我创建了Key Vault并输入了一个秘密。当我使用.NET在本地运行我的服务时,我能够通过密钥库检索秘密。这就是我的所作所为: 1)创建了SSL证书 2)使用该SSL证书创建AD应用程序 3)为上述申请制定了服务原则 4)获得对此应用程序的完整密钥库访问权限 5)我将VaultURI,ServicePrincipal.Application ID和证书指纹放在Web.config文件中 6)我还将该证书的* .pfx上传到我的云服务

当我在本地运行我的服务时,我能够检索到这个秘密。我甚至试过通过powershell检索秘密,我已经成功了。当我将代码部署到Azure时,我无法检索到这个秘密。

它说:

Type : Microsoft.Azure.KeyVault.Models.KeyVaultErrorException, Microsoft.Azure.KeyVault, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 Message : Secret not found: QSAccounts7126 Source : Microsoft.Azure.KeyVault Help link : 

我花了3天时间查看它并重新测试每一种可能的情况,并且没有弄清楚出了什么问题。有人可以帮助确定问题或指导我进入正确的调试路径吗? 我甚至尝试在Azure中以调试模式发布云服务,并且由于某些原因也无法正常工作。

非常感谢您提供的任何帮助。

private async Task<string> getSecretConnection(string connectionName)
        {
            var kvName = ConfigurationManager.AppSettings["vaultName"];
            var kvClientId = ConfigurationManager.AppSettings["clientId"];
            var kvClientThumbprint = ConfigurationManager.AppSettings["clientThumbprint"];
            using (keyVaultHelper = new AzureKeyVaultHelper(kvClientId, kvClientThumbprint, kvName))
            {
                var bundle = await keyVaultHelper.GetAzureKeyVaultSecretAsync(connectionName);
                return bundle;
            }
public async Task<string> GetAzureKeyVaultSecretAsync(string secretName)
        {
            var bundle = await this.KvClient.GetSecretAsync(KeyVaultUrl, secretName);
            return bundle.Value;
        }

这是为身份验证运行的代码:

private async Task<string> getAccessTokenFromSPNAsync(string authority, string resource, string scope)
        {
            //clientID and clientSecret are obtained by registering 
            //the application in Azure AD

            var certificate = CertificateHelper.FindCertificateByThumbprint(this.ClientThumbprint);
            var assertionCert = new ClientAssertionCertificate(this.ClientId, certificate); //needed for authentication
            var clientCredential = new ClientCredential(this.ClientId, this.ClientThumbprint);

            var authContext = new AuthenticationContext(authority, TokenCache.DefaultShared);
            AuthenticationResult result = await authContext.AcquireTokenAsync(resource, assertionCert);

            if (result == null)
            {
                throw new InvalidOperationException("Failed to obtain the token from Azure AD using certificate");
            }

            return result.AccessToken;
        }

2 个答案:

答案 0 :(得分:1)

  

有人可以帮助确定问题或指导我进入正确的调试路径吗?

您似乎需要在Azure WebApp设置中添加 WEBSITE_LOAD_CERTIFICATES ,才能将证书加载到您的Web应用程序个人证书存储区。有关详细信息,请参阅此blog。我们也可以remote debug the WebApp获取更多详细信息错误信息。

  

添加名为 WEBSITE_LOAD_CERTIFICATES 的应用设置,并将其值设置为证书的指纹,这将使您的Web应用程序可以访问该设置。您可以使用逗号分隔的多个指纹值,也可以将此值设置为“*”(不带引号),在这种情况下,所有证书都将加载到您的Web应用程序个人证书商店。

答案 1 :(得分:0)

我不确定您的代码是否正确。

例如ClientCredential的构造函数采用客户端ID和客户端密钥,您的代码传入客户端ID和证书指纹。

有关示例代码,请参阅Microsoft文章Use Azure Key Vault from a Web Application。我使用了本文中的代码,并在部署到Azure时按预期工作。