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

如何配置Azure App Service Web App的UMSI访问Azure SQL DB?

解决UMSI访问Azure SQL数据库的400错误问题

核心排查方向

你的错误SqlException: ManagedIdentityCredential authentication failed: Service request failed. Status: 400 (Bad Request)通常指向身份验证请求格式错误、权限配置不完整,或者SQL Server端的AD认证未正确启用。以下是逐步解决步骤:

1. 确认SQL Server的Azure AD管理员已配置

Azure SQL数据库的AD身份验证依赖于SQL Server层面的AD管理员,未配置的话,任何AD身份(包括UMSI)都无法通过认证:

  • 进入Azure门户的SQL Server资源页面
  • 左侧菜单选择Azure Active Directory,点击设置管理员,指定一个Azure AD用户/组作为管理员(后续TSQL操作需要用这个管理员账号连接数据库)

2. 重新验证数据库用户的创建与权限分配

即使你已执行过创建用户操作,仍需确认语句准确性:
用AD管理员账号连接到目标数据库,执行以下TSQL:

-- 检查UMSI是否已存在于数据库主体中
SELECT name, type_desc FROM sys.database_principals WHERE name = '你的UMSI显示名称';

-- 若不存在,重新创建用户(使用UMSI的显示名称或Object ID均可)
CREATE USER [你的UMSI显示名称] FROM EXTERNAL PROVIDER;

-- 分配应用所需权限
ALTER ROLE db_datareader ADD MEMBER [你的UMSI显示名称];
ALTER ROLE db_datawriter ADD MEMBER [你的UMSI显示名称];
ALTER ROLE db_ddladmin ADD MEMBER [你的UMSI显示名称];

注意:UMSI的显示名称可在App Service的身份标识页面找到,需与TSQL中的名称完全一致

3. 修正连接字符串格式

你的连接字符串存在引号使用问题:

  • 在App Service的应用设置中,连接字符串应直接填写:
    Server=tcp:sqlserveraddress.database.windows.net,1433;Initial Catalog=SQLDBName;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Default
    
    无需给Authentication参数加额外引号(App Service的连接字符串存储不是JSON格式,无需转义)
  • 若在appsettings.json中配置,才需要转义双引号:
    "ConnectionStrings": {
      "DefaultConnection": "Server=tcp:sqlserveraddress.database.windows.net,1433;Initial Catalog=SQLDBName;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=\"Active Directory Default\""
    }
    

4. 检查SQL Server防火墙设置

确保Azure服务能访问SQL Server:

  • 进入SQL Server的防火墙和虚拟网络页面
  • 勾选允许Azure服务和资源访问此服务器选项并保存

5. 验证UMSI的令牌获取能力

用Azure CLI测试UMSI是否能获取SQL数据库的访问令牌:

# 查看Web App的UMSI信息
az webapp identity show --name <你的WebApp名称> --resource-group <资源组名称>

# 获取SQL资源的访问令牌
az account get-access-token --resource https://database.windows.net/

拿到令牌后,用sqlcmd测试连接:

sqlcmd -S sqlserveraddress.database.windows.net -d SQLDBName -G -C

提示输入密码时粘贴刚才获取的令牌,若能成功连接,说明UMSI权限无问题,问题出在应用端配置。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:44:52