从Azure应用服务访问Azure Key Vault时身份验证失败,尽管已设置访问策略

后端开发 2026-07-10

我正在尝试对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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章