Проверка подлинности ldap с использованием ActiveDirectyoryMembershipProvider на порте GC не выполняется в приложении MVC2

Я разрабатываю приложение MVC2 с использованием C# ASP.NET.

В моем приложении я использую ActiveDirectoryMembershipProvider для аутентификации пользователя. Ниже приведен фрагмент моего файла web.config.

Если я использую порт глобального каталога 3268 в строке подключения, я получаю сообщение об ошибке "Соединения LDAP через порт GC не поддерживаются в Active Directory". Я сделал Google на это сообщение об ошибке и не смог найти подходящего решения. Многие люди предлагают использовать порт 389, некоторые предлагают изменения кода. Но я хочу иметь возможность использовать порт GC, чтобы позволить пользователям подключаться к разным лесам, потому что он более чистый.

Некоторые наблюдения:

  • Та же строка подключения (с портом 3268) отлично работает для других приложений в моей компании i.
  • Когда я изменяю строку подключения, чтобы она указала на порт 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 ответ

Если вам нужен глобальный каталог, то почему бы вам не попробовать его таким образом?

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;
        }
    }
}
Другие вопросы по тегам