在MVC2应用程序中使用GC端口上的ActiveDirectyoryMembershipProvider进行ldap身份验证失败

时间:2013-02-14 19:47:55

标签: asp.net-mvc-2 active-directory activedirectorymembership

我正在使用C#ASP.NET开发一个MVC2应用程序。

在我的应用程序中,我使用ActiveDirectoryMembershipProvider进行用户身份验证。以下是我的web.config文件中的代码段。

如果我在连接字符串中使用全局编录端口3268,则会收到错误“Active Directory不支持GC端口上的LDAP连接”。我在这个错误消息上谷歌,但无法找到合适的解决方案。许多人建议使用端口389,有些人建议使用代码更改。但我希望能够使用GC端口允许连接到不同森林的用户,因为它更清洁。

一些观察结果:

  • 相同的连接字符串(端口3268)可以完美地用于我公司的其他应用程序。
  • 当我将连接字符串更改为指向端口389时,它工作正常,即属于本地域的人能够登录。但是来自其他域的人不能。
  • 我在我的AcconuntModel和AccountController中添加了断点。连接字符串指向端口3268,Membership.Provider抛出“ConfigurationErrorsException”。

如果有人可以帮我解决这个问题,那将非常有帮助。

的web.config:

 <add name="ADConnectionString" connectionString="LDAP://myADServer.abc.ad:389/DC=abc,DC=ad" /> 

<membership defaultProvider="MyADMembershipProvider">
      <providers>
        <clear />
        <add connectionStringName="ADConnectionString" maxInvalidPasswordAttempts="1000" connectionUsername="ldapuser@abc.ad" connectionPassword="password" connectionProtection="None" enableSearchMethods="True" name="MyADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider,System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
        <add name="MySqlMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider,MySql.Web,Version=6.5.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d" connectionStringName="MySqlMembershipConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" autogenerateschema="true" />
      </providers>
    </membership>

    <!-- Added for custom provider -->
    <roleManager enabled="true" cacheRolesInCookie="true" defaultProvider="DDMS_Custom_RoleProvider">
      <providers>
        <clear />
        <add applicationName="/" connectionStringName="ddms_dataEntities2" name="DDMS_Custom_RoleProvider" type="DDMS_sourcecode.Utilities.DDMS_Custom_RoleProvider, DDMS_sourcecode" />
        <add connectionStringName="ApplicationServices" applicationName="/" autogenerateschema="true" name="MySqlRoleProvider" type="MySql.Web.Security.MySQLRoleProvider,MySql.Web,Version=6.5.4.0,Culture=neutral,PublicKeyToken=c5687fc88969c44d" />
      </providers>
    </roleManager>

1 个答案:

答案 0 :(得分:0)

如果您需要搜索全局目录,为什么不尝试这种方式

using (DirectoryEntry searchRoot = new DirectoryEntry("GC://DC=yourdomain,DC=com"))
using (DirectorySearcher ds = new DirectorySearcher(searchRoot))
{
    ds.Filter = "(sAMAccountName=userID1)";
    ds.SearchScope = SearchScope.Subtree;
    using (SearchResultCollection src = ds.FindAll())
    {
        foreach (SearchResult sr in src)
        {
            uxFred.Content = sr.Path;
        }
    }
}