2013-04-01 6 views
1

У меня есть приложение ASP.NET, разработанное в Visual Studio 2010 с использованием веры 4 .NET Framework, которая использует собственные средства проверки подлинности. Я подключил сайт с помощью поставщика членства в Active Directory.Фильтрация по группе безопасности AD в ASP.NET

Моя строка соединения выглядит следующим образом:

connectionString="LDAP://MYDC-004/DC=company,DC=corp,DC=pvt" 

Это хорошо работает, как страница Войти работает должным образом, и любой пользователь, который существует в AD может войти со своими учетными данными.

Однако я только хотят, чтобы пользователи, которые находятся в одной конкретной группы безопасности, чтобы иметь возможность войти в систему. Я знаю, где группа безопасности (так называемый «GR-DwgDep-Admins») расположен в AD организационных единиц, так что я пришел с этой измененной строкой подключения:

connectionString="LDAP://MYDC-004/CN=GR-DwgDep-Admins,OU=Groups,OU=Division,DC=company,DC=corp,DC=pvt" /> 

при попытке войти в систему (и я определенно в этой группе), то ошибка, я получаю «Пользовательские объекты не могут быть созданы в указанный контейнер ».

Не соответствует ли мой синтаксис? Или я делаю это неправильно, концептуально? Я бы предпочел сделать это с помощью настройки строки подключения, так как существующий элемент управления доступом .NET будет работать с ним как есть.

Я был бы очень признателен за любые предложения, которые есть у кого-либо. Спасибо!

ответ

1

Вам необходимо выполнить итерацию по группам, к которым принадлежит пользователь, и проверить, соответствует ли она группе, которую вы также хотите предоставить.

Сначала вам нужно загрузить у пользователя, тогда вам нужно пройти через коллекцию «memberOf» и проверить, принадлежат ли они указанной группе.

  //Get connectionstring from web.config and initialize directory entry to search for groups user belongs to 
      DirectoryEntry de = new DirectoryEntry(ConfigurationManager.ConnectionStrings["ADConnectionString"].ConnectionString); 

      //Specify that we want to find the groups 
      DirectorySearcher ds = new DirectorySearcher(de, "(objectCategory=group)"); 

      //Filter by user and specify what data to return 
      ds.Filter = String.Format("(&(SAMAccountName={0}))", model.UserName); 
      ds.PropertiesToLoad.Add("sAMAccountName"); 
      ds.PropertiesToLoad.Add("memberOf"); 

      //Loop though all results 
      foreach (SearchResult sr in ds.FindAll()) 
      { 
       //Get the properties available and loop through "memberof" 
       DirectoryEntry desr = sr.GetDirectoryEntry(); 
       ResultPropertyCollection myResultPropColl = sr.Properties; 

       //Get a key 
       foreach (string myKey in myResultPropColl.PropertyNames) 
       { 
        //Check the key that we are using "memberof" 
        if (myKey.ToLower() == "memberof") 
        { 
         //Loop through all items for given key 
         foreach (System.String myCollection in myResultPropColl[myKey]) 
         { 
          //Check if we have a match 
          if (myCollection.Contains("Web - Internal Admin")) 
          { 
           //Success         

           de.Dispose(); 
           desr.Dispose(); 
           //Do something 
          } 
         } 
        } 
       } 
      } 

Для первой строки, я получаю мою строку подключения AD из моего web.config

ConfigurationManager.ConnectionStrings["ADConnectionString"].ConnectionString 

web.config

<add name="ADConnectionString" connectionString="LDAP://ua.local/DC=ua,DC=local" /> 

Я тогда получаю группы и фильтровать по конкретному имени пользователя. Затем я указываю возвращаемые значения для sAMAccountName и memberOf. В этом примере не нужно указывать имя sAMAccountName.

DirectorySearcher ds = new DirectorySearcher(de, "(objectCategory=group)"); 

     //Filter by user and specify what data to return 
     ds.Filter = String.Format("(&(SAMAccountName={0}))", model.UserName); 
     ds.PropertiesToLoad.Add("sAMAccountName"); 
     ds.PropertiesToLoad.Add("memberOf"); 

Остальное довольно прямолинейно понять. Прокрутите результат и проверьте ключ «memberof». Найдя, используйте ключ «memberof» и пропустите его значения и проверьте, соответствует ли он группе, которую вы требуете.

if (myKey.ToLower() == "memberof") 

Проверьте эти ссылки для получения дополнительной информации: Searching for groups

+0

Remy - Я закончил тем, что делал что-то подобное, но мне нравится ваш метод лучше. Я буду экспериментировать с тем, что вы сделали здесь, и отправить обратно с любыми дополнительными вопросами. Благодарим вас за подробный ответ! – Loki70

+0

Я забыл упомянуть об этом, потому что я ищу sAMAccountName, которое является уникальным для домена, исправьте меня, если я ошибаюсь, но мы могли бы пропустить цикл foreach и просто изменить ds.FindAll() на ds.FindOne() и оберните все в финальный оператор try catch. Удачи! – Remy

Смежные вопросы