You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 7 Web API如何通过ClientId与Thumbprint认证Azure Key Vault请求

问题

我有一个.NET 7 Web API应用,当前使用AddAzureKeyVault方法将Azure Key Vault配置添加到IConfigurationBuilder实例中,采用DefaultAzureCredential进行认证。现在希望修改该方法,使用ClientId和Thumbprint来完成Azure Key Vault请求的认证,替代默认凭据类型。

现有代码如下:

AddAzureKeyVaultConfiguration扩展方法

public static IConfigurationBuilder AddAzureKeyVaultConfiguration(this IConfigurationBuilder configurationBuilder, IWebHostEnvironment hostingEnvironment)
{
    if (!hostingEnvironment.IsEnvironment("Localhost"))
    {
        var builtConfig = configurationBuilder.Build();
        var keyVaultEndpoint = $"https://{builtConfig["KeyVaultConfigOption:Name"]}.vault.azure.net/";

        configurationBuilder.AddAzureKeyVault(
            new Uri(keyVaultEndpoint),
            new DefaultAzureCredential(new DefaultAzureCredentialOptions
            {
                ExcludeEnvironmentCredential = true,
                ExcludeInteractiveBrowserCredential = true,
                ExcludeAzurePowerShellCredential = true,
                ExcludeSharedTokenCacheCredential = true,
                ExcludeVisualStudioCodeCredential = true,
                ExcludeVisualStudioCredential = true,
                ExcludeAzureCliCredential = false,
                ExcludeManagedIdentityCredential = false,
            })

            );
    }

    return configurationBuilder;
}

Program.cs

var builder = WebApplication.CreateBuilder(args);
{
    // Environment configuration
    var configuration = builder.Configuration;
    var env = builder.Environment;

    configuration.AddAppConfiguration(env);

    // Add azure key vault configuration
    builder.Configuration.AddAzureKeyVaultConfiguration(env);

    builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<Program>());
    builder.Services.AddHttpClient();

    builder.Services.AddApplication();
    builder.Services.AddInfrastructure(builder.Configuration);

    builder.Services.AddHelpers();

    builder.Services.AddControllers()
       // Configures the JSON serialization options for controllers.
       .AddJsonOptions(options =>
        {
            options.JsonSerializerOptions.PropertyNamingPolicy = null;
        });

    builder.Services.Configure<ApiBehaviorOptions>(options =>
    {
        options.SuppressModelStateInvalidFilter = true;
    });

}

var app = builder.Build();
{
    app.UseHttpsRedirection();

    // Authentication & Authorization
    app.UseAuthentication();
    app.UseAuthorization();
    app.MapControllers();

    app.UseRouting();
    app.UseSwaggerWithVersioning();
}

if (app.Environment.IsDevelopment())
{
    //DEV configurations
}

app.Run();

appsettings.json

"KeyVaultConfigOption": {
    "Name": "{KeyValultName}",
    "Url": "https://{KeyVaultName}.vault.azure.net",
    "Thumbprint": "",
    "ClientId": ""
  }
解决方案

要实现用ClientId和证书Thumbprint认证Azure Key Vault,需要用ClientCertificateCredential替代DefaultAzureCredential,具体修改步骤如下:

1. 确认依赖包

确保项目已安装以下NuGet包:

Azure.Security.KeyVault.Secrets
Azure.Identity

2. 更新扩展方法

替换原有的认证逻辑,改用证书凭据:

using Azure.Identity;
using System.Security.Cryptography.X509Certificates;

public static IConfigurationBuilder AddAzureKeyVaultConfiguration(this IConfigurationBuilder configurationBuilder, IWebHostEnvironment hostingEnvironment)
{
    if (!hostingEnvironment.IsEnvironment("Localhost"))
    {
        var builtConfig = configurationBuilder.Build();
        // 从配置读取必要参数
        var keyVaultEndpoint = builtConfig["KeyVaultConfigOption:Url"];
        var clientId = builtConfig["KeyVaultConfigOption:ClientId"];
        var certificateThumbprint = builtConfig["KeyVaultConfigOption:Thumbprint"];
        var tenantId = builtConfig["AzureAd:TenantId"];

        // 从本地证书存储加载对应Thumbprint的证书
        var certificate = LoadCertificateByThumbprint(certificateThumbprint);

        // 初始化证书凭据
        var credential = new ClientCertificateCredential(
            tenantId: tenantId,
            clientId: clientId,
            certificate: certificate
        );

        // 添加Key Vault配置源
        configurationBuilder.AddAzureKeyVault(new Uri(keyVaultEndpoint), credential);
    }

    return configurationBuilder;
}

// 辅助方法:根据Thumbprint查找本地证书
private static X509Certificate2 LoadCertificateByThumbprint(string thumbprint)
{
    using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    store.Open(OpenFlags.ReadOnly);
    
    // 查找证书(忽略有效性校验,根据实际需求调整validOnly参数)
    var certificates = store.Certificates.Find(
        X509FindType.FindByThumbprint, 
        thumbprint, 
        validOnly: false
    );

    if (certificates.Count == 0)
    {
        throw new InvalidOperationException($"未找到Thumbprint为{thumbprint}的证书");
    }

    return certificates[0];
}

3. 补充配置项

在appsettings.json中添加租户ID配置:

"AzureAd": {
    "TenantId": "{你的Azure AD租户ID}"
},
"KeyVaultConfigOption": {
    "Name": "{KeyValultName}",
    "Url": "https://{KeyVaultName}.vault.azure.net",
    "Thumbprint": "{证书的Thumbprint值}",
    "ClientId": "{Azure AD应用注册的ClientId}"
}

注意事项

  • 证书必须是包含私钥的PFX格式,并且已安装在应用运行环境的证书存储中(本地开发用CurrentUser,服务器部署可能需要LocalMachine)
  • Azure AD应用注册需绑定该证书,且应用拥有Key Vault的访问权限(如Secrets Reader)
  • 如果部署到Azure App Service,可通过门户上传证书,并设置WEBSITE_LOAD_CERTIFICATES环境变量让应用访问证书

内容的提问来源于stack exchange,提问作者Rakesh Kumar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:25:41