如何配置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 DefaultAuthentication参数加额外引号(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
相关产品推荐
相关产品推荐

