我创建了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;
}
答案 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时按预期工作。