PrincipalContext not connecting

本文关键字:connecting not PrincipalContext | 更新日期: 2023-09-27 18:09:43

我正在尝试使用PrincipalContext为我正在开发的web服务。我已经在不同的应用程序中使用web服务器上的表单身份验证,它工作得很好。

我收到的错误是:

System.DirectoryServices.AccountManagement.PrincipalServerDownException: The server could not be contacted. ---> System.DirectoryServices.Protocols.LdapException: The LDAP server is unavailable.
   at System.DirectoryServices.Protocols.LdapConnection.Connect()
   at System.DirectoryServices.Protocols.LdapConnection.SendRequestHelper(DirectoryRequest request, Int32& messageID)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout)
   at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request)
   at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
   --- End of inner exception stack trace ---
   at System.DirectoryServices.AccountManagement.PrincipalContext.ReadServerConfig(String serverName, ServerProperties& properties)
   at System.DirectoryServices.AccountManagement.PrincipalContext.DoServerVerifyAndPropRetrieval()
   at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, ContextOptions options, String userName, String password)
   at System.DirectoryServices.AccountManagement.PrincipalContext..ctor(ContextType contextType, String name, String container, String userName, String password)
   at webService.Service1.ValidUser(String sUserName) in E:'Development'CSharpApps'Desktop'OrgChart'webService'Service1.asmx.cs:line 158

我们的web服务器位于DMZ中,并通过防火墙访问域。我使用端口信息等如下为例。

这可以使用我的开发盒中的ip,但是它在防火墙内。我发送给它的ip信息与我在web表单内部使用的身份验证相同。

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "192.168.1.1:389", "dc=doodlie,dc=com",@"doodlie'admin","doodliesquat");

PrincipalContext not connecting

也许我遗漏了什么,但实际上您不必指定AD服务器,您可以简单地说:

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

它应该在应用程序的当前域中找到它能找到的任何DC。如果是一个具有容错功能的网络,当其中一个出现故障时,另一个应该会恢复。我不确定为什么会有理由击中一个,特别是,像原始问题中的代码一样,除非它在不同的域上。如果是这种情况,您可以尝试将web服务托管在该域中,并使用DNS和转寄器调用/路由到新域中的web服务的新IP,如果需要,或者使用Hosts文件条目,或者仅通过IP引用web服务。

在我的例子中,从url中删除端口号是有效的

无论问题如何,安装这些用于AD管理/故障排除的宝贵工具对我来说都是天赐之物。

如果可能的话,在您的机器/或web服务器上安装远程服务器管理工具(RSAT)(如果允许的话),然后使用Active Directory用户和计算机客户端来确定您的DC的确切URL/ip。如果您无法使用这些工具进行连接,则可能是升级到IT支持/开发运维的起点

除此之外,运行网站应用程序的AD/服务帐户可能没有足够的权限来访问DC。我已经成功了

using (HostingEnvironment.Impersonate())
{
    // code in here. 
}

在IIS中运行网站应用程序的应用程序池应该在具有适当权限的用户帐户下运行。(不一定是网络服务)