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

如何在ASP.NET Core应用中实现AlwaysEncrypted AzureKeyVaultProvider 3.0.0

问题原因

v3.0.0+版本的Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider重构了身份验证实现,不再支持旧版的KeyVaultClient.AuthenticationCallback入参,改用了Azure官方统一的Azure.Core.TokenCredential身份验证体系,所以原来的传回调方法的写法会报类型转换错误。

前置操作

先升级/安装必要的NuGet包:

  • Microsoft.Data.SqlClient.AlwaysEncrypted.AzureKeyVaultProvider 3.0.0+
  • Azure.Identity (提供统一的Azure身份验证实现)
  • Azure.Extensions.AspNetCore.Configuration.Secrets (新版本的Key Vault配置集成包,替代已弃用的Microsoft.Extensions.Configuration.AzureKeyVault)

卸载已弃用的Microsoft.Azure.KeyVault相关包,避免类型冲突。

适配后的Program.cs代码

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            var keyVaultEndpoint = GetKeyVaultEndpoint();
            if (!string.IsNullOrEmpty(keyVaultEndpoint))
            {
                // 用Azure.Identity的统一凭据类,替代旧的AzureServiceTokenProvider和KeyVaultClient
                var credential = new DefaultAzureCredential();
                // 若需指定托管标识ClientId,可使用以下写法
                // var credential = new DefaultAzureCredential(new DefaultAzureCredentialOptions { ManagedIdentityClientId = "你的托管标识ID" });
                
                // 新版本的Key Vault配置集成写法
                config.AddAzureKeyVault(new Uri(keyVaultEndpoint), credential);
                
                // 初始化Always Encrypted的AKV提供器,直接传入TokenCredential实例即可
                var akvProvider = new SqlColumnEncryptionAzureKeyVaultProvider(credential);
                
                // 注册提供器的逻辑保持不变
                SqlConnection.RegisterColumnEncryptionKeyStoreProviders(
                    customProviders: new Dictionary<string, SqlColumnEncryptionKeyStoreProvider>(
                        capacity: 1, 
                        comparer: StringComparer.OrdinalIgnoreCase)
                {
                    { SqlColumnEncryptionAzureKeyVaultProvider.ProviderName, akvProvider }
                });
            }
        })
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        });

private static string GetKeyVaultEndpoint() => "https://.........azure.net/";

注意事项

  • 原有数据库列加密配置、连接字符串的Column Encryption Setting=enabled配置无需改动
  • EF Core Code First的相关逻辑完全兼容,不需要额外修改
  • DefaultAzureCredential会自动适配运行环境的身份凭据:本地开发时自动读取Visual Studio/ Azure CLI/环境变量中的登录账号,生产环境自动读取托管标识、应用服务配置的凭据,无需额外适配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 21:36:05