Azure Function通过用户分配托管身份连接Azure VM上的SQL Server时Azure AD身份验证语句不支持的问题
Azure Function通过用户分配托管身份连接Azure VM上的SQL Server时Azure AD身份验证语句不支持的问题
你碰到的这个情况完全是当前Azure VM托管SQL Server的一个明确限制——用于Azure AD身份验证的CREATE USER/CREATE LOGIN [your-managed-identity] FROM EXTERNAL PROVIDER语法,仅在Azure SQL数据库和Azure SQL托管实例中生效,并不适用于部署在Azure VM上的SQL Server。
这背后的原因是Azure VM上的SQL Server和Azure SQL系列服务(Azure SQL DB/MI)的Azure AD集成逻辑不同:Azure SQL是完全托管的平台服务,和Azure AD的集成深度更高,原生支持通过外部提供者直接映射托管身份;而Azure VM上的SQL Server本质属于IaaS部署模式,更贴近传统本地SQL Server的架构,目前还没有支持这种直接创建身份映射的方式。
针对你的业务场景,这里提供几个可行的替代方案:
- 使用SQL Server本地账户认证:如果业务允许,可以在Azure VM上的SQL Server中创建普通SQL登录名和用户,让Azure Function通过该账户的凭据连接数据库。不过这种方式需要手动维护凭据,安全性不如托管身份。
- 借助Azure AD令牌实现连接:你可以让Azure Function通过用户分配的托管身份获取Azure AD访问令牌,再用这个令牌连接Azure VM上的SQL Server。具体操作步骤大致如下:
- 在Azure AD中创建一个安全组,将你的用户分配托管身份加入该组。
- 在Azure VM上的SQL Server中,执行
CREATE LOGIN [Azure AD安全组名称] FROM WINDOWS语句创建登录名(Azure VM上的SQL Server的Azure AD认证支持通过Windows身份验证映射Azure AD组)。 - 在目标数据库中创建对应用户并分配权限:
CREATE USER [Azure AD安全组名称] FOR LOGIN [Azure AD安全组名称],再按需授予数据库权限(比如GRANT SELECT ON [目标表名] TO [Azure AD安全组名称])。 - 在Azure Function中,通过托管身份获取针对SQL Server的访问令牌,使用该令牌建立数据库连接。
需要注意的是,采用Azure AD令牌连接时,要确保Azure VM上的SQL Server已经完成Azure AD身份验证的配置,同时VM的网络环境允许Azure Function访问SQL Server的默认端口1433。
备注:内容来源于stack exchange,提问作者Manish
相关产品推荐
相关产品推荐

