使用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
相关产品推荐
相关产品推荐

