如何在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.AzureKeyVaultProvider3.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
相关产品推荐
相关产品推荐

