2011-02-09 3 views
0

다른 포리스트의 Active Directory 도메인 (W2K8R2 DC)에 연결하려고합니다. 이를 위해 자격 증명을 다음 DirectoryEntry 생성자에 전달합니다.System.DirectoryServices의 호출에서 연결 자격 증명을 유지하는 방법은 무엇입니까?

DirectoryEntry(string path, string username, string password, AuthenticationTypes authenticationType) 

이것은 모두 훌륭합니다. 무엇 내가 어떻게 든 좋아하는 연결을 유지하고 반복적으로 자격 증명을 전달할 필요가 없도록 광고에 대한 모든 내 전화를 통해 그것을 재사용하고 싶습니다. 어떻게 든 가능합니까?

감사합니다!

+0

방금 ​​System.DirectoryServices.AccountManagement에 이와 같은 기능이 있다는 것을 알았습니다. Active Directory에서 임의의 필드에 액세스해야하기 때문에이 기능이 작동하지 않습니다. – Sleepless

답변

4

연결 수준에서 컨트롤을 사용하려면 System.DirectoryServices.Protocol을 사용하는 것이 좋습니다. 다른 LDAP 쿼리를 만들기 위해 LDAP 연결을 다시 사용할 수 있습니다. 그러나 프로그래밍 패러다임은 DirectoryEntry

과 매우 다릅니다. DirectoryEntry을 사용해야하는 경우 사용자 이름과 암호를 어딘가에 저장 한 다음 모든 DirectoryEntry 개체에 전달해야합니다. 내가 할 방법은 GetDirectoryEntry(string dn) 메서드를 작성하고 올바른 사용자 이름과 암호로 나를 위해 DirectoryEntry을 만드는 방법입니다. 이것은 우아 해 보이지 않지만 잘못된 것은 아닙니다. 암호가 일반 텍스트로 메모리에 저장되는 경우 암호를 저장하려면 SecureString을 사용하십시오.

DirectoryEntry은 자체 LDAP 연결 풀을 유지 관리하므로 아무 문제가 없습니다. 동일한 사용자 이름과 암호를 사용하는 DirectoryEntry이 여러 개있는 경우 LDAP 연결을 공유 할 수있을 정도로 스마트합니다. 기본적으로 단일 LDAP 연결을 보유하고 다른 LDAP 쿼리를 수행하는 것과 같습니다. DirectoryEntry 개체 각각에 대해 LDAP 서버로 다시 인증하지 않습니다.

DirectoryEntry의 블랙 박스 기능을 사용하고 싶지 않은 경우 다음의 해결 방법을 사용하면 기분이 나아질 수 있습니다.

static DirectoryEntry GetObject(DirectoryEntry root, string dn) 
{ 
    using (DirectorySearcher searcher = new DirectorySearcher(root)) 
    { 
     searcher.Filter = "(distinguishedName=" + dn + ")"; 
     searcher.SearchScope = SearchScope.Subtree; 
     SearchResult result = searcher.FindOne(); 
     if (result == null) return null; 
     return result.GetDirectoryEntry(); 
    } 
} 

사용자 이름과 암호를 사용하여 루트 개체에 바인딩하면됩니다. 그런 다음 루트 객체를 정적 변수 또는 원하는대로 유지할 수 있습니다. 그런 다음 루트 개체로 설정된 SearchRoot을 사용하여 LDAP 쿼리를 수행하여 다른 DirectoryEntry 개체를 얻습니다. 반환 된 DirectoryEntry은 여전히 ​​루트 사용자 이름과 암호를 사용합니다. 다시 말하지만, 단순히 사용자 이름과 암호를 DirectoryEntry에 전달하는 것보다 더 좋은 방법은 아닙니다. 실제로 우리는 더 많은 LDAP 쿼리를 수행해야하기 때문에 성능이 현저히 떨어집니다. DirectoryEntry

+0

위대한 - 이것은 매우 가능성이 보인다; DirectorySearcher 메서드를 사용하겠습니다. 당신의 탁월한 대답에 대해 대단히 감사합니다! – Sleepless

+0

이것은 아름답습니다. 나는'DirectoryEntry'가 정말로 자신의 LDAP 연결 풀을 유지하고 있는지, 그리고 싱글 톤을 갖는 대신에 AD를 쿼리하려고 할 때마다 새로운'DirectoryEntry'와 연관된'DirectorySearcher'를 정말로 만들어야 하는지를 알아야했습니다. 이것은 내 질문에 답하고 LDAP 연결을 만드는 데 소요되는 오버 헤드가 단 한 번만 발생하고 다른 모든'DirectoryEntry' 인스턴스화는 연결 풀 기능을 사용하고 가능한 경우 LDAP 연결 오버 헤드를 피할 수 있다는 자신감을 얻었습니다. 감사! – bradykey

관련 문제