如何授予Azure系统托管标识访问传统SQL Server权限
实现方案
首先明确版本边界:传统SQL Server对Azure AD服务主体(含系统托管标识)的原生支持从2022 RTM版本开始,你之前使用的CREATE LOGIN ... FROM EXTERNAL PROVIDER语法并非Azure SQL/MI完全专属,只是低版本SQL Server不支持对应能力,因此执行报错。以下分场景给出可行方案:
方案1:SQL Server 2022及以上版本(完全匹配托管标识无密码访问需求)
该版本原生支持Azure AD托管标识直接登录,不需要额外适配,操作步骤如下:
- 确认当前SQL Server实例已完成Azure AD认证配置,执行语句的账号拥有实例级
ALTER ANY LOGIN权限 - 定位App Service系统托管标识对应的企业应用,复制其客户端ID(避免同名显示名导致的解析错误),执行登录创建语句:
CREATE LOGIN [粘贴你复制的托管标识客户端ID] FROM EXTERNAL PROVIDER WITH DEFAULT_DATABASE = [你的目标业务数据库名]; - 切换到目标业务数据库,创建对应用户并分配最小必要权限:
USE 你的目标业务数据库名; CREATE USER [AppService访问账号] FOR LOGIN [粘贴你复制的托管标识客户端ID]; -- 按需分配权限,以下为普通读写角色示例 ALTER ROLE db_datareader ADD MEMBER [AppService访问账号]; ALTER ROLE db_datawriter ADD MEMBER [AppService访问账号]; - 配置App Service连接字符串,不需要填写账号密码,指定托管标识认证模式即可:
Server=你的SQL Server实例地址;Database=你的目标业务数据库名;Authentication=Active Directory Managed Identity;Encrypt=True;
注意:请将项目使用的Microsoft.Data.SqlClient驱动升级到2.0及以上版本,否则无法识别托管标识认证参数。
方案2:SQL Server 2019及以下版本(无密码间接实现)
2019及更早版本的SQL Server Azure AD认证模块仅接受Azure AD用户账号颁发的令牌,不识别服务主体(含托管标识)令牌,无法直接通过AAD完成托管标识登录。该场景下可通过Key Vault托管凭据的方式实现无密码访问,授权链路完全基于系统托管标识,不需要明文存储账号密码:
- 在SQL Server中创建专用SQL认证账号,仅给该账号分配业务所需的最小数据库权限
- 将包含账号密码的完整连接字符串存入Azure Key Vault作为机密值
- 给App Service的系统托管标识授予对应Key Vault机密的
Get权限 - App Service的连接字符串配置项使用Key Vault引用格式,平台会自动通过系统托管标识拉取机密值完成连接,不需要在配置或代码中硬编码凭据。引用格式如下:
@Microsoft.KeyVault(SecretUri=https://你的Key Vault实例地址/secrets/存储连接字符串的机密名称/)
避坑说明
- 不要尝试通过AAD安全组嵌套的方式给低版本SQL Server授权,低版本SQL Server的AAD认证模块不会解析组内的服务主体成员身份,会直接返回登录失败
- 不要将SQL账号密码明文配置在App Service普通应用配置或代码文件中,会增加凭据泄露风险
内容的提问来源于stack exchange,提问作者Simmetric
相关产品推荐
相关产品推荐

