App Service托管标识连接Azure SQL数据库令牌主体登录失败
解决托管标识连接Azure SQL时的「Login failed for token-identified principal」错误
针对你遇到的问题,以下是精准的排查和修复步骤:
1. 核对包含用户与托管标识的对象ID一致性
创建SQL包含用户时,必须确保绑定的是托管标识的对象ID而非名称。执行SQL查询获取已创建的包含用户SID:
SELECT name, sid FROM sys.database_principals WHERE type = 'E';
然后在Azure门户中找到对应App Service部署槽的系统托管标识,复制其objectId(注意是长字符串,不是名称),将SID转换为字符串后与objectId对比,必须完全匹配(大小写、空格都要一致)。
2. 确认数据库权限的有效性
检查给托管标识对应包含用户的权限是否正确授予且生效:
SELECT dp.name, perm.permission_name, perm.state_desc FROM sys.database_permissions perm JOIN sys.database_principals dp ON perm.grantee_principal_id = dp.principal_id WHERE dp.name = '你的托管标识包含用户名';
确保state_desc为GRANT,且权限覆盖你需要的操作(如db_datareader、db_datawriter)。注意:订阅级Contributor角色不直接赋予SQL数据库权限,必须单独在数据库层面授权。
3. 检查连接字符串格式
appsettings.json中的连接字符串必须符合托管标识认证要求,不能包含用户名和密码:
"ConnectionStrings": { "DefaultConnection": "Server=tcp:<sql-server-name>.database.windows.net,1433;Database=<db-name>;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;Authentication=Active Directory Managed Identity" }
重点确认Authentication参数拼写完全正确,没有遗漏或错误。
4. 本地测试的特殊处理
本地环境无法直接使用App Service的系统托管标识,需改用:
- 用户分配托管标识(在本地代码中指定标识ID)
- 本地开发账号的Azure AD认证(通过Azure CLI登录,使用
DefaultAzureCredential自动获取令牌)
请勿在本地强行使用App Service的系统托管标识,这会导致认证失败。
5. 验证SQL Server AD管理员配置
确保SQL Server的AD管理员是有效的Azure AD用户/组,且该管理员已被添加为数据库包含用户:
SELECT name FROM sys.database_principals WHERE type = 'U' AND name = '<ad-admin-username>';
若结果为空,需重新创建包含用户并授予db_owner或对应权限。
6. 查看SQL审核日志定位具体原因
在Azure门户的SQL服务器中进入「审核日志」,筛选「登录失败」事件,查看错误的子状态码:
- 子状态11:标识存在但无数据库权限
- 子状态12:SQL中未找到对应的包含用户
- 子状态28:令牌无效或已过期
根据子状态码可以快速定位核心问题。
内容的提问来源于stack exchange,提问作者OK1
相关产品推荐
相关产品推荐

