使用工作负载身份从AKS容器连接Azure SQL失败求助
1. 数据库外部用户创建方式错误
你手动通过客户端ID转换SID创建用户的方式不正确,对于Azure AD托管标识(包括工作负载身份关联的用户分配标识),应该使用FROM EXTERNAL PROVIDER语法创建数据库外部用户,让Azure SQL自动关联正确的AD标识信息,而非手动指定SID。
修复后的SQL语句:
IF NOT EXISTS (SELECT 1 FROM sys.database_principals WHERE [name] = '{AppUserName}') BEGIN CREATE USER [{AppUserName}] FROM EXTERNAL PROVIDER WITH DEFAULT_SCHEMA=[dbo]; END IF IS_ROLEMEMBER('db_owner','{AppUserName}') = 0 BEGIN ALTER ROLE db_owner ADD MEMBER [{AppUserName}]; END
注意:
{AppUserName}必须是托管标识的显示名称(即Azure AD中该标识的名称),需与Azure Portal中显示的完全一致。
2. SQL客户端驱动版本过低
你使用的Microsoft.Data.SqlClient版本为2.0.20168.4,该版本对AKS工作负载身份(基于OIDC联合令牌的场景)支持不完善,无法正确识别AZURE_FEDERATED_TOKEN_FILE等环境变量,导致尝试获取令牌时触发Identity not found错误。
修复步骤:
升级Microsoft.Data.SqlClient到2.1.0及以上版本(推荐使用最新稳定版),新版本专门优化了对Azure AD工作负载身份的支持。
3. 连接字符串配置错误
当前连接字符串使用Authentication=Active Directory Managed Identity并指定User ID={UserClientId},在工作负载身份场景下,更推荐使用Authentication=Active Directory Default——DefaultAzureCredentials会自动拾取你已配置的环境变量(AZURE_CLIENT_ID、AZURE_FEDERATED_TOKEN_FILE等),无需手动指定User ID。
修复后的连接字符串:
Server=tcp:{DatabaseServerName}.database.windows.net,1433;Initial Catalog={DatabaseName};Authentication=Active Directory Default;Persist Security Info=False;Integrated Security=false;MultipleActiveResultSets=True;Encrypt=True;TrustServerCertificate=False;
验证步骤
- 执行修正后的SQL语句,确保外部用户正确创建并分配
db_owner角色; - 升级应用的
Microsoft.Data.SqlClient依赖版本; - 替换连接字符串后重新部署应用;
- 测试SQL连接,确认
Identity not found错误消失。
内容的提问来源于stack exchange,提问作者Tom Troughton

