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

时间:2021-07-26 06:02:12

标签: azure-active-directory adfs adal azure-sql

我已经使用 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, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, 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, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString connectionOptions, SqlCredential credential, TimeoutTimer timeout) 在 System.Data.SqlClient.SqlInternalConnectionTds.OpenLoginEnlist(TimeoutTimer timeout, SqlConnectionString connectionOptions, SqlCredential credential, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance) 在 System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, 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 请帮我解决这个问题。

1 个答案:

答案 0 :(得分: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

谢谢,