sql 托管实例身份验证在使用 AAD 集成方法时失败

问题描述

我已经使用 Azure Active Directory 和联合 (AD FS) 方法设置了混合标识。我创建了 sql 托管实例并添加一个用户作为 Active Directory 管理员。现在,我尝试从使用 AAD 集成方法用户身份登录的加入域的 VM 连接到此 sql 托管实例。连接失败,错误如下:

====================================

无法连接到 {},3342。

====================================

发生了一个或多个错误。 (mscorlib)


程序位置:

在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 在 System.Threading.Tasks.Task.Wait(Int32 毫秒超时,CancellationToken 取消令牌) 在 System.Data.sqlClient.sqlInternalConnectionTds.GetFedAuthToken(sqlFedAuthInfo fedAuthInfo) 在 System.Data.sqlClient.sqlInternalConnectionTds.OnFedAuthInfo(sqlFedAuthInfo fedAuthInfo) 在 System.Data.sqlClient.TdsParser.TryRun(RunBehavior runBehavior,sqlCommand cmdHandler,sqlDataReader dataStream,BulkcopySimpleResultSet bulkcopyHandler,TdsParserStateObject stateObj,Boolean& dataReady) 在 System.Data.sqlClient.TdsParser.Run(RunBehavior runBehavior,TdsParserStateObject stateObj) 在 System.Data.sqlClient.sqlInternalConnectionTds.CompleteLogin(Boolean enlistOK) 在 System.Data.sqlClient.sqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo,String newPassword,securestring newSecurePassword,Boolean ignoreSniOpenTimeout,TimeoutTimer timeout,Boolean withFailover,Boolean isFirstTransparentAttempt,Boolean disableTnir) 在 System.Data.sqlClient.sqlInternalConnectionTds.LoginNoFailover(ServerInfo serverInfo,Boolean redirectedUserInstance,sqlConnectionString connectionoptions,sqlCredential credential,TimeoutTimer timeout) 在 System.Data.sqlClient.sqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout,Boolean redirectedUserInstance) 在 System.Data.sqlClient.sqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity,Object providerInfo,sqlConnectionString userConnectionoptions,SessionData reconnectSessionData,DbConnectionPool,BooleanAuthenticationProvider StringManagerTransactToken ) 在 System.Data.sqlClient.sqlConnectionFactory.CreateConnection(DbConnectionoptions options,DbConnectionPoolKey poolKey,Object poolGroupProviderInfo,DbConnectionPool pool,DbConnection owningConnection,DbConnectionoptions userOptions) 在 System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection,DbConnectionPoolGroup poolGroup,DbConnectionoptions userOptions) 在 System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection,taskcompletionsource1 retry,DbConnectionoptions userOptions,DbConnectionInternal oldConnection,DbConnectionInternal& connection) at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection,DbConnectionFactory connectionFactory,taskcompletionsource1 retry,DbConnectionoptions userOptions) 在 System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection 外连接,DbConnectionFactory connectionFactory,taskcompletionsource1 retry,DbConnectionoptions userOptions) at System.Data.sqlClient.sqlConnection.TryOpenInner(taskcompletionsource1 重试) 在 System.Data.sqlClient.sqlConnection.TryOpen(taskcompletionsource`1 重试) 在 System.Data.sqlClient.sqlConnection.open() 在 Microsoft.sqlServer.Management.sqlStudio.Explorer.ObjectExplorerService.ValidateConnection(UIConnectionInfo ci,IServerType server) 在 Microsoft.sqlServer.Management.UI.ConnectionDlg.Connector.ConnectionThreadUser()

====================================

发生了一个或多个错误。 (mscorlib)


程序位置:

在 System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions) 在 System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification) at System.Threading.Tasks.Task1.get_Result() 在 System.Data.sqlClient.sqlInternalConnectionTds.c__displayClass134_1.b__0() 在 System.Threading.Tasks.Task`1.InnerInvoke() 在 System.Threading.Tasks.Task.Execute()

====================================

未能解析 XML Blob。 原因:XML 文档必须有一个顶级元素。 行:0,位置:0 文本:(null) (System.Data)


程序位置:

at ADALNativeWrapper.ADALGetAccesstoken(String username,IntPtr password,String stsURL,String servicePrincipalName,ValueType correlationId,String clientId,Boolean* fWindowsIntegrated,Int64& fileTime) 在 System.Data.sqlClient.ActiveDirectoryNativeAuthenticationProvider.c__displayClass2_0.b__0() 在 System.Threading.Tasks.Task`1.InnerInvoke() 在 System.Threading.Tasks.Task.Execute()

SSMS 版本(最新):15.0.18384.0 请帮我解决这个问题。

解决方法

根据您收到的错误信息,请检查联合本地域是否配置为 SSO 以进行直通身份验证和密码哈希身份验证。此外,请检查您尝试连接到数据库的 VM 上是否安装了最新版本的 SQL Server Management Studio 或 SQL Server Data Tools。

接下来,确认您要连接到数据库的应用程序是否设置了服务主体 API 权限。需要为应用程序添加“Directory.Read.All”应用程序 API 权限,并将分配的 Azure AD 管理员设置为同意。应为 Azure AD 管理员凭据设置“SQL 托管实例参与者”角色的服务主体。

对于 Azure Active Directory – 集成身份验证方法,在连接到数据库之前,请确保在 SSMS 数据库连接对话框的“选项”部分(右下角)中输入数据库名称。此外,请检查连接字符串中的“Active Directory Integrated”和“Integrated Security=True”等参数以确保连接成功。

请参考以下链接供您参考:-

https://docs.microsoft.com/en-us/azure/azure-sql/database/authentication-aad-configure?tabs=azure-powershell

https://azure.microsoft.com/en-gb/blog/windows-azure-now-supports-federation-with-windows-server-active-directory/

https://docs.microsoft.com/en-us/azure/azure-sql/database/authentication-aad-overview

谢谢,