使用用户分配托管标识从Azure App Service连接Azure SQL遇问题求助
问题场景
已完成以下操作但Azure App Service连接SQL时报错:
- 创建用户分配的托管标识
- 将标识分配给Azure App Service
- 在Azure SQL中添加该标识用户并分配角色
- 添加
AZURE_CLIENT_ID应用设置,值为标识的客户端ID - 连接字符串添加
Authentication=Active Directory Managed Identity;User ID=<client id of the identity>;
报错信息:
Received a non-retryable error. Identity Response Code: BadRequest, Response: {"statusCode":400,"message":"No User Assigned or Delegated Managed Identity found for specified ClientId/ResourceId/PrincipalId."}
注:Azure虚拟机使用相同代码可正常连接,系统分配的托管标识也能正常连接。
排查与解决步骤
确认用户分配标识的绑定状态
进入App Service的「标识」→「用户分配」页面,确认目标标识的状态为「已分配」。若刚完成分配,可能存在部署延迟,等待5-10分钟后重试,或手动重启App Service触发配置刷新。校验
AZURE_CLIENT_ID配置准确性
检查App Service「配置」→「应用程序设置」中的AZURE_CLIENT_ID值,确保与用户分配标识的客户端ID完全一致(无多余空格、大小写错误)。同时确认没有其他环境变量或启动命令覆盖该配置。修正连接字符串参数
确保连接字符串中的User ID值是用户分配标识的客户端ID,而非对象ID或资源ID(三者容易混淆,必须使用客户端ID)。另外,连接字符串中不要包含Password参数,托管身份认证无需密码。检查标识与App Service的权限状态
登录Azure AD确认用户分配标识未被删除或禁用;排查App Service所在订阅/资源组的RBAC策略,确保没有阻止App Service访问该托管标识的规则(系统分配标识可用的话,此问题概率较低)。验证SDK/驱动版本
对比虚拟机与App Service使用的数据库驱动/SDK版本,确保使用支持用户分配托管身份的最新稳定版(例如.NET的Microsoft.Data.SqlClient需4.0及以上版本)。部分场景下需显式指定客户端ID,以.NET为例:var clientId = Environment.GetEnvironmentVariable("AZURE_CLIENT_ID"); var credential = new ManagedIdentityCredential(clientId); var token = credential.GetToken(new TokenRequestContext(new[] { "https://database.windows.net/.default" })).Token; var connectionString = "Server=tcp:your-sql-server.database.windows.net,1433;Database=your-db;"; using var conn = new SqlConnection(connectionString); conn.AccessToken = token; conn.Open();强制重启App Service
配置变更后偶尔会存在缓存延迟,手动重启App Service确保所有设置生效。
内容的提问来源于stack exchange,提问作者ml123

