PrincipalContext没有连接

问题描述 投票:12回答:3

我正在尝试将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

我们的网络服务器位于DMZ中,并通过防火墙访问域。我正在使用下面的端口信息等作为示例。

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

 PrincipalContext ctx = new PrincipalContext(ContextType.Domain, "192.168.1.1:389", "dc=doodlie,dc=com",@"doodlie\admin","doodliesquat");
c# asmx activedirectorymembership
3个回答
0
投票

在我的情况下从URL工作中删除端口号


0
投票

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

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

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


0
投票

无论出现什么问题,安装一些这些用于AD管理/故障排除的宝贵工具对我来说都是上帝送的。

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.