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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 18:01:18