.NET Core Azure Function中用Azure Keyvault管理local.setting.json数据库连接串
将.NET Core 2.2.4 Azure Function的SQL连接串迁移到Azure Key Vault
步骤1:准备Azure Key Vault及权限配置
- 在Azure门户创建或使用现有Key Vault,将SQL数据库的密码作为机密存入(命名示例:
SQL-DB-Password)。 - 给你的Azure Function应用开启系统托管标识(在函数应用「身份」选项卡操作),然后在Key Vault的「访问策略」中添加该标识,授予「机密读取」权限。
步骤2:本地开发环境配置(local.setting.json)
提供两种适配方案:
方案A:使用Key Vault自动引用(需本地登录Azure账户)
修改local.setting.json,把连接串中的明文密码替换为Key Vault机密引用:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "SQLConnectionString": "Server=tcp:xxxx-sql.database.windows.net,1433;Initial Catalog=abc-db;Persist Security Info=False;User ID=xxxx;Password=@Microsoft.KeyVault(SecretUri=https://你的密钥保管库名称.vault.azure.net/secrets/SQL-DB-Password/);MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" } }
本地运行前,确保已用Azure CLI登录有权限访问该Key Vault的账户:az login
方案B:代码手动读取机密拼接连接串(兼容性更强)
- 安装适配.NET Core 2.2的NuGet包:
Azure.Security.KeyVault.Secrets、Azure.Identity - 修改
local.setting.json,拆分连接串模板与Key Vault地址:
{ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", "FUNCTIONS_WORKER_RUNTIME": "dotnet", "KeyVaultUri": "https://你的密钥保管库名称.vault.azure.net/", "SQLConnectionStringTemplate": "Server=tcp:xxxx-sql.database.windows.net,1433;Initial Catalog=abc-db;Persist Security Info=False;User ID=xxxx;Password={0};MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;" } }
- 在函数类中通过
IConfiguration读取机密并拼接连接串:
using Azure.Identity; using Azure.Security.KeyVault.Secrets; using Microsoft.Extensions.Configuration; using Microsoft.Azure.WebJobs; using Microsoft.Extensions.Logging; public class MySqlFunction { private readonly string _sqlConnectionString; // 通过依赖注入获取IConfiguration public MySqlFunction(IConfiguration configuration) { var vaultUri = configuration["KeyVaultUri"]; var secretClient = new SecretClient(new Uri(vaultUri), new DefaultAzureCredential()); var passwordSecret = secretClient.GetSecret("SQL-DB-Password").Value; var connectionTemplate = configuration["SQLConnectionStringTemplate"]; _sqlConnectionString = string.Format(connectionTemplate, passwordSecret.Value); } [FunctionName("MySqlFunction")] public void Run([TimerTrigger("0 */5 * * * *")]TimerInfo myTimer, ILogger log) { // 使用_sqlConnectionString执行数据库操作 log.LogInformation($"数据库连接串已准备就绪"); } }
步骤3:Azure部署环境配置
- 函数应用启用系统托管标识后,在Azure门户的函数应用「配置」中添加对应设置:
- 若用方案A:直接将
SQLConnectionString设置为带Key Vault引用的完整连接串 - 若用方案B:添加
KeyVaultUri和SQLConnectionStringTemplate两个配置项,值与本地一致
- 若用方案A:直接将
- 确认Key Vault的访问策略已正确授予函数应用标识的机密读取权限
步骤4:验证
本地运行函数测试数据库连接,部署到Azure后触发函数,确认数据库操作正常执行。
内容的提问来源于stack exchange,提问作者os2499
相关产品推荐
相关产品推荐

