Azure Active Directory集成式身份验证连接SQL托管实例IIS应用失败排查及解决
问题回顾
你已经完成了以下配置:
- 在Azure虚拟机上部署了ADFS服务,同时创建了SQL托管实例
- 域已完成联合配置,并且可以通过SSMS使用Azure AD集成式身份验证成功连接SQL托管实例
但当IIS应用使用以下连接字符串尝试连接时出现错误:
string ConnectionString = @"Data Source=XXXXXXXXX; Authentication=Active Directory Integrated; Initial Catalog=testdb;"
错误信息如下:
消息 -> 发生一个或多个错误。
内部异常 -> System.AggregateException: 发生一个或多个错误。 ---> AdalException: MSIS7069: 指定的请求失败。
在 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.Task1.InnerInvoke() 在 System.Threading.Tasks.Task.Execute() --- 内部异常堆栈跟踪结束 --- 在 System.Threading.Tasks.Task1.GetResultCore(Boolean waitCompletionNotification)
在 System.Data.SqlClient.SqlInternalConnectionTds.<>c__DisplayClass134_1.b__0()
在 System.Threading.Tasks.Task1.InnerInvoke() 在 System.Threading.Tasks.Task.Execute() ---> (内部异常 #0) AdalException: MSIS7069: 指定的请求失败。 在 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.Task1.InnerInvoke()
在 System.Threading.Tasks.Task.Execute()<---
同时ADFS服务器的Admin日志中记录了事件ID 111的错误:
日志名称: AD FS/Admin
来源: AD FS
日期: 2021年7月29日 12:26:45
事件ID: 111
任务类别: 无
级别: 错误
关键字: AD FS
用户: Domain\testuser
计算机: 我们的ADFS服务器名称(因数据敏感未提及确切名称)
描述: 联合服务处理WS-Trust请求时遇到错误。
请求类型: http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue
附加数据
异常详细信息: Microsoft.IdentityServer.Service.SecurityTokenService.ADAccountValidationException: MSIS3173: Active Directory账户验证失败。 ---> Microsoft.IdentityServer.ClaimsPolicy.Engine.AttributeStore.Ldap.AttributeStoreDSGetDCFailedException: 引发了“Microsoft.IdentityServer.ClaimsPolicy.Engine.AttributeStore.Ldap.AttributeStoreDSGetDCFailedException”类型的异常。
关于联合域的疑问解答(编辑1)
针对你问的客户端机器域的问题:客户端使用的域不需要是Azure AD的主域,只要该域在Azure AD的自定义域列表中且已完成联合配置即可。域内的合法用户就能通过Azure AD集成认证访问相关资源。
最终解决方案(编辑2)
你找到的解决方案完全正确,问题的核心在于IIS应用池的身份配置:
- 默认的
ApplicationPoolIdentity是本地虚拟账户,它不属于你的联合域,无法完成ADFS的域身份验证流程,导致获取AccessToken失败,进而引发MSIS7069错误。 - 将应用池的身份改为有SQL托管实例访问权限的域用户后,应用就能以该域用户的身份完成Azure AD集成认证,成功连接到SQL托管实例。
快速操作指引:
- 打开IIS管理器,定位到目标应用对应的应用池
- 右键点击应用池,选择「高级设置」
- 在「进程模型」区域找到「标识」选项,点击右侧的「...」按钮
- 选择「自定义账户」,点击「设置」,输入有权限的域用户账户和密码
- 重启应用池和对应的网站,再次测试连接即可
内容的提问来源于stack exchange,提问作者shubham singh

