如何基于Azure AD无密码通过Azure DevOps迁移Azure SQL数据库
Azure SQL仅开启AAD认证对接App Service与DevOps EF迁移实操指南
针对你提出的三个问题,直接给出可落地的配置方案:
a) Azure SQL服务器端必要配置
- 开启AAD认证入口:进入SQL服务器资源的「Azure Active Directory」配置页,指定一个AAD账号或安全组作为服务器AAD管理员,这一步是所有AAD认证操作的前置,完成后才能给AAD身份授予数据库权限。如果要强制禁用SQL账号认证,直接在同个页面打开「仅支持Azure Active Directory身份验证」开关即可。
- 配置数据库内权限映射:用刚才设置的AAD管理员身份登录目标数据库,执行SQL创建对应用户并授权:
- 给DevOps服务连接对应的服务主体授权时,服务主体的显示名必须和Azure AD中App注册的名称完全一致,同租户场景不需要填客户端ID
- 给App Service授权时,提前给App Service开启系统分配托管标识,创建用户时直接填App Service的资源名即可
参考授权SQL如下:
-- 替换括号内的名称为实际的服务主体/托管标识名称 CREATE USER [DevOps迁移服务主体名] FROM EXTERNAL PROVIDER; -- EF迁移需要DDL权限,生产环境可按需收紧,迁移完成后可回收高权限 ALTER ROLE db_ddladmin ADD MEMBER [DevOps迁移服务主体名]; ALTER ROLE db_datareader ADD MEMBER [DevOps迁移服务主体名]; ALTER ROLE db_datawriter ADD MEMBER [DevOps迁移服务主体名]; -- App Service业务账号只需要授予读写权限即可,不需要给DDL权限 CREATE USER [你的App Service名称] FROM EXTERNAL PROVIDER; ALTER ROLE db_datareader ADD MEMBER [你的App Service名称]; ALTER ROLE db_datawriter ADD MEMBER [你的App Service名称];
- 网络放行:确保SQL服务器的防火墙规则放通DevOps代理的出站IP、App Service的出站IP,有条件的话配置专用终结点走内网访问,避免公网连接被拦截。
b) Azure DevOps侧迁移步骤额外配置
- 服务连接选Azure Resource Manager类型,自动创建或手动绑定的服务主体要和你在SQL中授权的服务主体保持一致,不要用用户名密码类型的服务连接。
- 运行efbundle.exe的步骤必须放在Azure CLI任务内,选择对应的服务连接:这个任务会自动在当前执行会话中注入服务主体的认证令牌,不需要你手动传客户端ID、密钥之类的凭据。不要用普通的命令行/PowerShell任务直接跑efbundle,这类任务不会自动注入认证上下文,会直接报认证失败。
- 提前确认流水线运行环境:如果是微软托管代理,直接运行自包含发布的efbundle.exe即可;如果是自托管代理,需要提前安装对应版本的.NET运行时(框架依赖部署场景)和Azure CLI,同时确保项目引用的
Microsoft.Data.SqlClient版本不低于2.0.0,否则不支持新版AAD无密码认证模式。 - 连接字符串存在流水线变量库中,标记为机密值,不要硬编码在YAML或代码里。
c) 无密码AAD认证的正确连接字符串格式
你当前用的Authentication=Active Directory Integrated是错误的,这个模式只适用于已加入AAD/本地域的Windows设备的集成认证,无法识别服务主体、托管标识这类运行时注入的凭据。
正确的无密码连接字符串统一用Active Directory Default认证模式,这个模式会自动按顺序读取当前运行环境的所有可用AAD凭据:包括Azure CLI注入的服务主体令牌、App Service/虚拟机的托管标识令牌、本地开发时VS/Azure CLI的登录凭据,一套配置可以覆盖流水线、生产环境、本地调试三个场景,完全不需要硬编码用户名密码,格式如下:
Server=tcp:abcd.database.windows.net,1433;Initial Catalog=abcd-db;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Default;
注意不要在连接字符串里加User ID、Password字段,所有凭据都会由认证模块自动从上下文获取,真正实现无密码访问。
内容的提问来源于stack exchange,提问作者Kostas Konstantinidis
相关产品推荐
相关产品推荐

