从Azure应用服务访问Azure Key Vault时身份验证失败,尽管已设置访问策略
我正在尝试对Azure密钥保管库进行身份验证。唯一能成功的身份验证方法,是嵌入在Visual Studio工具设置中的那一个。这是应用服务用来访问密钥保管库的代码。
public X509Certificate2 GetCertFromKeyVault()
{
var client = new CertificateClient(new Uri("https://keyvaultname.vault.azure.net/"), new DefaultAzureCredential());
var cert = client.DownloadCertificate("certname").Value;
return cert;
}
下面是一张展示密钥保管库访问策略的图片。应用程序身份和复合身份都引用了应用服务的托管身份。用户是我和另外一个人。应用服务的托管身份是系统分配的,而不是用户分配的,不确定这是否相关。
另外,如果相关的话,在排除Visual Studio设置方法后,我的凭据也会在认证时失败,然而我可以在Azure的密钥保管库UI中直接查看和编辑。
你知道为什么我的认证会失败吗?我为了让它工作已经头痛不已。
解决方案
你的个人凭据只有通过Visual Studio才能成功,因为它是认证链中第一个能解析出你身份的方法 (EnvironmentCredential → ManagedIdentityCredential → VisualStudioCredential → AzureCliCredential, etc.)。这是预期之中的,因为你的Azure AD身份需要被包含在密钥保管库的访问策略中,并具备相应权限。 凭据提供程序链
在排除Visual Studio的情况下,你应该改用其他方法 (e.g. Azure CLI)
az login
然后确保在该链中启用AzureCliCredential,或直接使用它。
var client = new CertificateClient(new Uri("..."), new AzureCliCredential());
我通常会针对不同环境明确使用哪些凭据,而不是依赖完整的 DefaultAzureCredential 链
public X509Certificate2 GetCertFromKeyVault()
{
var isProduction = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") != "Development";
TokenCredential credential = isProduction
? new ManagedIdentityCredential() // App Service uses system-assigned MI
: new VisualStudioCredential(); // Local dev uses your VS credentials
var client = new CertificateClient(
new Uri("https://keyvaultname.vault.azure.net/"),
credential);
return client.DownloadCertificate("certname").Value;
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。