从远程计算机到AD-LDS的简单绑定失败

时间:2015-05-12 14:48:55

标签: c# .net directoryservices account-management adlds

我使用API​​ System.DirectoryServices.AccountManagement绑定到AD-LDS实例。我正在使用与AD-LDS实例中本地存在的用户的简单绑定。当我在托管AD-LDS的服务器上运行客户端时,它可以工作,但是当我在远程计算机上运行客户端时,它不起作用。

这是我用来绑定和搜索用户的代码:

var c = new PrincipalContext(ContextType.ApplicationDirectory, "fullhostname:50001", "CN=Users,DC=app,DC=local", ContextOptions.SimpleBind, "CN=joe,CN=Users,DC=app,DC=local", "abc");
var u = UserPrincipal.FindByIdentity(c, IdentityType.Name, "john");

这是我在远程计算机上运行时抛出的异常:

System.DirectoryServices.AccountManagement.PrincipalServerDownException: The server is not operational.
---> System.Runtime.InteropServices.COMException: The server is not operational.
   at System.DirectoryServices.DirectoryEntry.Bind(Boolean throwIfFail)
   at System.DirectoryServices.DirectoryEntry.Bind()
   at System.DirectoryServices.DirectoryEntry.get_AdsObject()
   at System.DirectoryServices.DirectoryEntry.get_Options()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
   --- End of inner exception stack trace ---
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoLDAPDirectoryInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoApplicationDirectoryInit()
   at System.DirectoryServices.AccountManagement.PrincipalContext.Initialize()
   at System.DirectoryServices.AccountManagement.PrincipalContext.get_ConnectedServer()
   at MyApplication.DiagnosticsController.TryAdLdsSettings(AdLdsData data) in C:\code\MyApplication\DiagnosticsController.cs:line 166

如果我改为使用System.DirectoryServices API,它也可以从远程计算机上运行:

var obj = new DirectoryEntry("LDAP://fullhostname:50001/CN=Users,DC=app,DC=local", "CN=joe,CN=Users,DC=app,DC=local",
                "abc", AuthenticationTypes.None);
obj.RefreshCache();

这样可行,但我需要使用System.DirectoryServices.AccountManagement API。

任何人都知道出了什么问题?

2 个答案:

答案 0 :(得分:0)

我能够在域上进行此操作,只需进行一些小的更改,我希望这些提示有所帮助。

  1. 创建PrincipalContext时,倒数第二个参数"CN=joe,CN=Users,DC=app,DC=local"应该是完全限定的用户名,而不是LDAP路径;这通常看起来像COMPUTER-NAME\\joe(无论您的计算机名称是什么),或者您是否在我的域名DOMAIN-NAME\\joe。 (如果fullhostname不是您的本地工作站,那么您可能在域中,或者您可能需要指定fullhostname \ joe来请求对主机服务器而不是您的本地服务器进行身份验证,因为您的本地凭据可能已赢得&#39 ; t在主机服务器上工作。)

  2. 要在域上进行测试,我必须将第一个参数从ContextType.ApplicationDirectory更改为ContextType.Domain;听起来你不在域名中,所以你可能需要ContextType.ApplicationDirectory,但错误信息让我觉得Active Directory服务没有运行。

  3. 由于:50001足够高,无法阻止,因此请确保您没有阻止请求的防火墙软件,无论是从您的计算机发出,还是来自" fullhostname"机;当然,请确保您的活动目录服务实际上在50001上可用,而不是其他一些身份验证协议。

答案 1 :(得分:0)

我最终改写了PrincipalContextUserIdentity的用法,直接使用DirectoryEntry。我花了几个小时才找到适合我需要的方便UserIdentity功能的重新实现,但是这样做之后一切正常。

对我来说,为什么问题首先发生,这真是个谜。我唯一的猜测是,在我的特定配置中使用我特定版本的AD LDS,底层库中存在一个错误。直接在DirectoryEntry中重写所有内容,使所有内容与我知道如何完全相似,修复问题。