2013-04-01 2 views
1

네이티브 인증 컨트롤을 사용하는 .NET Framework 버전 4를 사용하여 Visual Studio 2010에서 개발 한 ASP.NET 응용 프로그램이 있습니다. Active Directory 멤버 자격 공급자를 사용하여 사이트를 연결했습니다.ASP.NET의 AD 보안 그룹에 의한 필터링

내 연결 문자열은 다음과 같습니다 : 로그인 페이지가 제대로 작동하고 AD에 존재하는 모든 사용자가 자신의 자격 증명으로 로그인 할 수있는이 잘 작동

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

.

그러나, 나는 에만. 내가 ("GR-DwgDep - 관리자"라고 함) 보안 그룹의 위치 알고 하나의 특정 보안 그룹에 사용자가 로그인 할 수 있도록하려면

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

나는 (내가이 그룹에 확실히입니다) 로그인을 시도, 내가 오류가 사용자 개체를 만들 수 없습니다 "입니다 : AD 조직 구성 단위에, 그래서 나는이 수정 된 연결 문자열 함께했다 지정된 컨테이너. "

구문이 올바르지 않습니까? 아니면 개념적으로 잘못하고있는 것입니까? 이 방법은 기존 .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 
          } 
         } 
        } 
       } 
      } 

, 내 Web.config의에서 내 AD 연결 문자열을 얻고있다

ConfigurationManager.ConnectionStrings["ADConnectionString"].ConnectionString 

의 Web.config

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

그때 그룹을 얻고 그것을 필터링하고 특정 사용자 이름으로. 그런 다음 sAMAccountName 및 memberOf에 대한 반환 값을 지정합니다. 이 예제에서는 sAMAccountName을 가져 오는 것이 nesecary가 아닙니다.

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

레미 - 나는 비슷한 일을하고 결국,하지만 난 당신의 방법은 더 좋아. 내가 여기서 한 일을 실험하고 추가 질문이 있으면 답장 해 드리겠습니다. 자세한 답변을 부탁드립니다. – Loki70

+0

도메인에 대해 고유 한 sAMAccountName으로 검색 중이기 때문에 언급을 깜박했는데 내가 틀렸다면 수정 해 주겠지 만 foreach 루프를 건너 뛰고 ds.FindAll()을 ds로 변경할 수 있습니다.FindOne()을 호출하고 try catch 마지막 문으로 모든 것을 래핑하십시오. 행운을 빕니다! – Remy

관련 문제