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

应用服务计划Azure函数通过托管身份连接Azure SQL的权限疑问

问题分析与解决方案

核心原因

你的问题源于两个关键差异点:

  1. App Service身份验证(Easy Auth)的身份上下文干扰
    当你给应用服务计划的函数应用启用了基于应用注册appr-func-test-01的身份验证后,函数运行时的身份逻辑发生了变化:
  • 你调用函数时同时传入了函数密钥和appr-func-test-01的Bearer令牌,Easy Auth会验证该令牌,并将函数内部的运行身份切换为appr-func-test-01这个应用注册的服务主体。
  • 此时使用Authentication=Active Directory Managed Identity连接数据库时,默认会采用当前请求的已认证身份(即appr-func-test-01),而非函数应用的系统分配托管身份func-test-01。而你仅将func-test-01加入了服务器的AAD所有者组,appr-func-test-01既没有对应的数据库用户,也没有数据库访问权限,因此连接失败。
  1. Azure RBAC权限与SQL Server AAD权限的混淆
    你提到的“将托管身份加入服务器的AAD所有者组”属于Azure RBAC层面的资源管理权限,仅允许该身份对SQL Server资源执行Azure层面的操作(如创建数据库、修改服务器配置),但不会自动赋予其访问SQL Server内部数据库的权限。

而消费计划的函数应用未启用Easy Auth,函数内部使用托管身份连接数据库时,默认调用的是函数应用的系统分配托管身份func-test-01——如果该身份被设置为SQL Server的AAD管理员(而非仅Azure RBAC所有者),则无需创建数据库用户即可访问所有数据库(以dbo身份登录),这也是消费计划场景能正常工作的原因。

解决方案

针对批量数据库无需单独创建用户的需求,可按以下两种方式处理:

方式1:强制函数使用系统分配托管身份连接数据库

修改数据库连接逻辑,明确指定使用函数应用的系统分配托管身份,不受Easy Auth的身份上下文影响。以.NET为例:

  • 显式指定系统分配托管身份的客户端ID(可从Azure门户函数应用的“身份”面板获取),获取数据库访问令牌:
var tokenProvider = new AzureServiceTokenProvider("RunAs=App;AppId=<系统分配MI的客户端ID>");
var accessToken = await tokenProvider.GetAccessTokenAsync("https://database.windows.net/");
// 用令牌构建连接字符串
var connectionString = $"Server={data.ServerName}.database.windows.net,1433;Database={data.DatabaseName};UID=AnyString;PWD={accessToken};Authentication=Active Directory Password;";

这样无论Easy Auth的身份是什么,数据库连接都会使用函数的系统分配MI。

方式2:将目标身份设置为SQL Server的AAD管理员

通过组权限批量管理数据库访问:

  1. 创建一个Azure AD安全组;
  2. 将函数应用的系统分配托管身份func-test-01(或appr-func-test-01应用注册)添加到该组;
  3. 在Azure门户的SQL Server“Active Directory管理员”设置中,将该安全组设置为服务器的AAD管理员;
  4. 此时组内的所有主体无需在数据库中创建用户,即可访问所有数据库并拥有dbo权限。

注意:SQL Server的AAD管理员权限较高,需谨慎分配。


内容的提问来源于stack exchange,提问作者testef

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 04:57:41