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

使用Azure SQL Server服务主体登录失败问题求助

Azure SQL Server服务主体登录失败排查求助

我使用以下连接字符串连接Azure SQL Server时遇到登录失败错误,请求协助排查:

Data Source=servername.database.windows.net;Encrypt=True;Initial Catalog=dbname; Authentication=Active Directory Service Principal; User Id=userid; Password=password;

已执行操作

  • 在Azure SQL Server中添加了对应的服务主体
  • 在目标数据库执行了以下SQL语句:
    -- 目标数据库中执行
    CREATE USER [MyServicePrincipleName] FROM EXTERNAL PROVIDER;
    GRANT CONNECT TO [MyServicePrincipleName];
    EXEC sp_addrolemember N'db_datareader', N'MyServicePrincipleName';
    EXEC sp_addrolemember N'db_datawriter', N'MyServicePrincipleName';
    ALTER ROLE db_datareader ADD MEMBER [MyServicePrincipleName];
    ALTER ROLE db_datawriter ADD MEMBER [MyServicePrincipleName];
    GRANT EXECUTE TO [MyServicePrincipleName];
    GRANT UNMASK TO [MyServicePrincipleName];
    

报错信息

System.Data.Entity.Core.EntityException
HResult=0x80131501
Message=底层提供程序在Open操作时失败。
Source=EntityFramework
StackTrace:
at System.Data.Entity.Core.EntityClient.EntityConnection.Open()
at System.Data.Entity.Core.Objects.ObjectContext.EnsureConnection(Boolean shouldMonitorTransactions)
at System.Data.Entity.Core.Objects.ObjectContext.ExecuteInTransaction[T](Func1 func, IDbExecutionStrategy executionStrategy, Boolean startLocalTransaction, Boolean releaseConnectionOnSuccess)
at System.Data.Entity.Core.Objects.ObjectQuery1.<>c__DisplayClass41_0.b__0()
at System.Data.Entity.SqlServer.DefaultSqlExecutionStrategy.Execute[TResult](Func1 operation)
at System.Data.Entity.Core.Objects.ObjectQuery1.GetResults(Nullable1 forMergeOption)
at System.Data.Entity.Core.Objects.ObjectQuery1.<System.Collections.Generic.IEnumerable.GetEnumerator>b__31_0()
at System.Data.Entity.Internal.LazyEnumerator`1.MoveNext()
此异常最初在此调用堆栈处引发:
[外部代码]

内部异常1:
SqlException: 用户 '<token-identified principal>' 登录失败。

排查建议

  • 确认User ID格式正确:连接字符串中的User Id必须填写服务主体的客户端ID(Application ID),而非服务主体的显示名称MyServicePrincipleName,这是最常见的错误点。
  • 检查防火墙规则:确保运行代码的主机IP已加入Azure SQL Server的防火墙允许列表,或者开启Azure门户中SQL Server的“允许Azure服务和资源访问此服务器”选项。
  • 验证数据库用户映射:在目标数据库执行以下SQL,确认服务主体对应的外部用户存在:
    SELECT name, type_desc 
    FROM sys.database_principals 
    WHERE name = 'MyServicePrincipleName';
    
    需确保结果中存在该用户,且type_desc为EXTERNAL_USER。
  • 检查服务主体权限范围:在Azure门户中确认服务主体被授予了针对目标SQL Server或数据库的权限(如Azure SQL Database Contributor角色),仅数据库内的角色不足以完成登录认证。
  • 测试基础连接:使用sqlcmd工具直接测试连接,排除EF层面的问题:
    sqlcmd -S servername.database.windows.net -d dbname -U <服务主体客户端ID> -P <服务主体密钥> -G
    
  • 验证驱动与EF版本:旧版本的Entity Framework(如EF 6.x早期版本)或SQL Server驱动可能不支持Active Directory Service Principal认证方式,建议升级到EF 6.4及以上版本,或更换为EF Core。
  • 检查服务主体密钥有效性:确认服务主体的客户端密钥未过期、未被撤销,若存在疑问,重新生成密钥并更新连接字符串中的Password值。

内容的提问来源于stack exchange,提问作者Vigneash Selvaraj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 03:56:08