如何为.NET Core 5 Worker Service配置无密码Azure SQL连接字符串
无密码连接Azure SQL适配.NET Core 5 Worker Service方案
1. 为部署VM配置托管身份
托管身份完全支持部署在Azure VM上的服务使用,针对多VM部署场景可选择两种配置方案:
- 系统分配托管身份:进入每台目标VM的Azure门户「标识」页面,开启系统分配托管身份,保存后记录生成的客户端ID,该身份与VM生命周期绑定。
- 用户分配托管身份:(推荐多VM部署场景使用,仅需一次授权即可被所有关联该身份的VM复用,降低运维成本) 先在Azure AD中创建独立的用户分配托管身份资源,再将该身份关联到所有需要部署服务的VM上,记录该身份的客户端ID即可。
2. 为托管身份授予SQL数据库权限
使用具备SQL管理员权限的账号登录目标Azure SQL数据库,执行以下命令完成授权:
-- 创建托管身份对应的数据库用户 CREATE USER [你的托管身份名称] FROM EXTERNAL PROVIDER; -- 按需授予对应权限,示例为读写权限 ALTER ROLE db_datareader ADD MEMBER [你的托管身份名称]; ALTER ROLE db_datawriter ADD MEMBER [你的托管身份名称];
3. 构造连接字符串与代码适配
首先将项目依赖的Microsoft.Data.SqlClient NuGet包升级到3.0及以上版本,直接使用以下无账号密码的连接字符串即可:
Server=tcp:<你的SQL服务器名>.database.windows.net,1433;Initial Catalog=<你的数据库名>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Default;
配置完成后无需额外编写令牌获取逻辑,驱动会自动从VM的托管身份端点获取、刷新有效访问令牌,代码中直接正常使用SqlConnection或者EF Core即可。
如果无法升级SqlClient版本,可以手动获取令牌注入连接:
using Azure.Identity; using Microsoft.Data.SqlClient; // 连接字符串无需包含账号密码、Authentication参数 var connectionString = "Server=tcp:<你的SQL服务器名>.database.windows.net,1433;Initial Catalog=<你的数据库名>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;"; await using var conn = new SqlConnection(connectionString); // 自动读取VM的托管身份获取访问令牌 conn.AccessToken = await new DefaultAzureCredential().GetTokenAsync(new TokenRequestContext(new[] { "https://database.windows.net/.default" })); // 后续正常打开连接执行SQL操作即可 await conn.OpenAsync();
4. 本地调试适配
本地开发时,只要你登录Visual Studio/VS Code/Azure CLI使用的Azure账号已经被授予该SQL数据库的对应权限,上述连接字符串和代码无需修改即可正常运行,不需要本地配置任何账号密码。
内容的提问来源于stack exchange,提问作者Learner
相关产品推荐
相关产品推荐

