You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何授予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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 23:30:38