ADFS 2016配置AD LDS登录失败(对象不存在)求助
排查ADFS 2016 + AD LDS登录失败的核心方向
老哥,我太懂你这种按官方文档一步步走却卡壳的憋屈了——毕竟用AD LDS绕开内部AD存客户账户的需求本身就藏着不少细节坑,你已经把自己能想到的方法都试了,那咱们从几个核心方向入手排查:
先揪属性存储与声明映射的问题
- 检查AD LDS属性存储的连接合法性:你用PowerShell创建声明提供程序信任时,得确认AD LDS属性存储的连接串是对的。跑个
Get-AdfsAttributeStore看看返回结果里的ConnectionString是不是正确指向你的AD LDS实例(比如LDAP://localhost:389/DC=yourldsdomain,DC=local),另外一定要确认ADFS的服务账户有读取AD LDS用户属性的权限——很多时候就是权限没给够导致读不到用户数据。 - 验证UPN/Email的声明规则是否准确:既然你只用到这两个属性,得确保声明规则是正确从AD LDS里提取它们的。执行
Get-AdfsClaimRuleSet -TargetName "你的AD LDS声明提供程序信任名称",检查输出的规则是不是类似这样:
重点盯两个地方:一是c:[Type == "http://schemas.microsoft.com/ws/2008/06/identity/claims/windowsaccountname", Issuer == "AD AUTHORITY"] => issue(store = "你的AD LDS属性存储名", types = ("http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn"), query = ";userPrincipalName;{0}", param = c.Value);query里的属性名是不是AD LDS中实际存在的(比如别把userPrincipalName拼错),二是param有没有正确对应到输入声明。 - 确认AD LDS用户的属性完整性:打开ADSI Edit连接到你的AD LDS实例,找到测试用的用户对象,检查
userPrincipalName和mail属性是不是已经填对了,而且UPN的后缀要在ADFS的可信UPN后缀列表里(去ADFS管理控制台的「服务」→「信任关系」→「添加可信UPN后缀」里核对)。
再查身份验证流程的卡点
- 确认AD LDS的身份验证方式适配:ADFS和AD LDS之间的身份验证方式要匹配。如果用Windows身份验证,得确保ADFS服务账户能和AD LDS实例建立Kerberos/NTLM连接;如果是表单验证,要检查AD LDS用户的密码是否正确、账户有没有被锁定。
- 开启ADFS调试日志抓细节:默认的事件日志信息太浅,你可以开个详细调试日志:
重现登录失败后,去「事件查看器」→「应用程序和服务日志」→「AD FS」→「Debug」里找具体报错,比如是属性读取失败,还是声明规则匹配不上,这些细节能直接定位问题。Set-AdfsProperties -EnableDebugLog $true -DebugLogLevel Verbose
最后核对声明提供程序信任的基础配置
- 检查信任的启用状态与标识符:跑
Get-AdfsClaimsProviderTrust看看你的AD LDS信任的Enabled属性是不是True,Identifier有没有和其他信任冲突——有时候不小心配置了重复的标识符也会导致登录失败。 - 手动测试AD LDS的LDAP连接:用PowerShell模拟ADFS的身份去读AD LDS用户属性,确认连接和权限没问题:
如果这个测试都失败,那问题肯定出在AD LDS的连接或权限上,先把这个搞定再看ADFS的配置。# 创建LDAP连接 $ldapConn = New-Object System.DirectoryServices.Protocols.LdapConnection("localhost:389") # 用ADFS服务账户身份绑定 $ldapConn.Credential = [System.Net.NetworkCredential]"ADFS服务账户名","密码","域名" $ldapConn.Bind() # 搜索测试用户的UPN和Email $searchReq = New-Object System.DirectoryServices.Protocols.SearchRequest("DC=yourldsdomain,DC=local", "(userPrincipalName=test@yourdomain.com)", "Subtree", "userPrincipalName", "mail") $searchResp = $ldapConn.SendRequest($searchReq) # 输出属性结果 $searchResp.Entries[0].Attributes
你可以先从这些方向一步步排查,尤其是把事件日志里的具体报错对应到上面的点,应该能很快找到问题所在。
内容的提问来源于stack exchange,提问作者Junaid
相关产品推荐
相关产品推荐

