ActiveDirectoryMembershipProvider - Невозможно использовать защиту защищенного соединения - PullRequest
3 голосов
/ 10 ноября 2009

Я пытаюсь использовать MembershipProvider ASP.Net, чтобы предоставить доступ только определенным пользователям. Это поддерживается экземпляром ADAM.

Я использую некоторый тест-код, который отлично работает:

public static DataTable getADValuesByParameter(string strFilter, string strLDAPUser, string strLDAPPath, string strLDAPPWD, string strLDAPProperties)
        {
            DataTable functionReturnValue = default(DataTable);
            string[] arrLDAP = null;
            DirectoryEntry rootEntry = new DirectoryEntry();
            DirectorySearcher searcher = new DirectorySearcher();
            SearchResultCollection results = default(SearchResultCollection);
            DataTable dtExchangeUserData = new DataTable();
            arrLDAP = strLDAPProperties.Split(new char[] { ',' });
            rootEntry.Path = strLDAPPath;
            rootEntry.Username = strLDAPUser;
            rootEntry.Password = strLDAPPWD;
            rootEntry.AuthenticationType = AuthenticationTypes.Secure;

            searcher.SearchRoot = rootEntry;
            searcher.SearchScope = SearchScope.Subtree;
            searcher.Filter = strFilter;
            searcher.PropertiesToLoad.AddRange(arrLDAP);

            //var value = rootEntry.NativeObject;

            results = searcher.FindAll();
            Int16 si = default(Int16);
            foreach (SearchResult result in results)
            {
                si = 0;
                object[] arrKeyValue = new object[result.Properties.Count - 1];
                // -2 weil property "adspath" nicht dazu gehört, und .count -1 weil 0 basierendes array
                if ((result != null))
                {
                    System.Collections.IEnumerator myEnumerator = arrLDAP.GetEnumerator();
                    while (myEnumerator.MoveNext())
                    {
                        foreach (string Key in result.Properties.PropertyNames)
                        {
                            if (Key != "adspath")
                            {
                                if (Key.Equals(((string)myEnumerator.Current).ToLower()))
                                {
                                    if (dtExchangeUserData.Columns[Key] == null)
                                        dtExchangeUserData.Columns.Add(Key);
                                    if (Key.Equals("objectguid"))
                                    {
                                        arrKeyValue[si] = new Guid(((byte[])result.Properties[Key][0]));
                                    }
                                    else
                                    {
                                        arrKeyValue[si] = result.Properties[Key][0].ToString();
                                    }
                                    si++;
                                }
                            }
                        }
                    }
                    if (arrKeyValue.Length > 0)
                        dtExchangeUserData.Rows.Add(arrKeyValue);
                }
            }

            functionReturnValue = dtExchangeUserData;
            dtExchangeUserData.Dispose();
            rootEntry.Close();
            rootEntry.Dispose();
            return functionReturnValue;
        }

Здесь я запрашиваю ADAM вручную. Хотя код плохо написан, он работает. Обратите внимание, как я использую «AuthenticationTypes.Secure».

Теперь, когда я пытаюсь сделать то же самое (тот же connectionPath, имя пользователя, пароль и т. Д.) С ActiveDirectoryMembershipProvider, он выдает мне (примерно перевод с немецкого):

ConfigurationErrorsException: невозможно установить безопасное соединение через SSL.

Это происходит, когда я звоню

Membership.ValidateUser()

Вот соответствующие части из файла Web.config:

<connectionStrings>
<add name="ADConnectionString" connectionString="LDAP://server.com/OU=users,DC=test,DC=adam"/>
</connectionStrings>
<authentication mode="Forms" >
      <forms loginUrl="~/Login.aspx/Test/" timeout="2880" />
    </authentication>
    <authorization>
      <deny users ="?" />
    </authorization>

    <!--<identity impersonate="true" />-->

    <trust level="Full" />

    <membership defaultProvider="MyMembershipProvider">
      <providers>
        <add name="MyMembershipProvider"
              type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0,Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"
              connectionStringName="ADConnectionString"
              connectionUsername="[domain]\[user]"
              connectionPassword="[password]"
              connectionProtection="Secure"
              enableSearchMethods="true"
          />
        </providers>
    </membership>

Неважно, использую ли я имитацию или нет (если честно, я все равно не знаю, что она делает). Уровень доверия тоже ничего не меняет.

Когда я вместо этого использую connectionProtection = "None", это дает мне (снова переведено) "Неверное имя пользователя или пароль". Я получаю ту же ошибку при использовании «AuthenticationTypes.None» в ручном примере.

Что я делаю не так?

Спасибо за ваше время ...

...