【问题标题】:PrincipalContext not connectingPrincipalContext 未连接
【发布时间】:2011-11-26 05:35:29
【问题描述】:

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


【解决方案1】:

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

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

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

【讨论】:

    【解决方案2】:

    在我的情况下,从 url 中删除端口号是可行的

    【讨论】:

      【解决方案3】:

      无论出现什么问题,安装其中一些用于 AD 管理/故障排除的宝贵工具对我来说都是天赐良机。

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2016-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-02
        • 1970-01-01
        • 2013-11-04
        相关资源
        最近更新 更多