문제

Active Directory를 사용하여 Windows 인증에 대해 실행중인 웹 응용 프로그램이 있습니다. Active Directory 항목에서 개인 정보를 가져 오는 새로운 요구 사항이 있습니다. 이 정보에 액세스하는 가장 쉬운 방법은 무엇입니까?

도움이 되었습니까?

해결책

DirectoryEntry를 통해 사용자에게 직접 액세스하는 것이 가장 간단한 접근 방식처럼 보입니다. 다음은 첫 번째 광고 관련 프로젝트에서 배운 광고 관련 Tidbits입니다.

  • URI에서 LDAP를 소문자로 작성하십시오. 그렇지 않으면 미스터리 오류가 발생합니다. 나는이 우울한 문제에 대해 하루를 보냈다 ...
  • 단일 값 속성을 지우려면 NULL이 아닌 빈 문자열로 설정하십시오. NULL은 예외를 유발합니다.
  • 다중 값 속성을 지우려면 directoryEntry.property.clear () 방법.
  • Active Directory 스키마 참조는 어떤 데이터 유형 A 값이 될지, 그리고 다중 값인지 단일 값인지 여부를 말합니다.
  • DirectoryEntry에서 수동으로 CroshmentCache ()를 사용할 필요는 없지만 사용하여 캐시 할 속성을 지정하는 경우 향후 다른 속성을 자동으로 부과하지 않을 것임을 알고 있습니다.
  • comexception은 System.DirectoryServices에서 클래스를 사용할 때마다 절대적으로 던질 수 있습니다. 그 시도 블록을 주시하십시오. 안전하다고 가정하지 마십시오.

경로를 모르는 경우 (로그인하지 않은 경우) 경로를 모르는 경우 DirectorySearcher를 사용하여 사용자의 디렉토리 항목을 가져와야 할 것입니다. 그것을 사용하는 것은 상당히 쉽지만 LDAP 구문의 단점을 조심해야합니다. 즉, 비 ASCII (및 기타?) 문자를 인코딩해야합니다. 사용하는 검색 문자열은 아마도 다음과 같습니다. (& (samaccountname = 뭐든지) (class = user)). 이것은 내 머리 꼭대기에서 벗어나 약간 부정확 할 수 있습니다.

그만큼 Active Directory 스키마 참조 유용 할 것입니다. 스키마를 수정하고 확장 할 수 있음을 이해하십시오 (예 : Exchange 설치는 사용자에게 사서함 정보를 추가합니다).

Ad Explorer 디버깅 및 저수준 AD 데이터 관리에 사용할 수있는 유용한 도구입니다. 설정하려는 속성을 알고 있지만 광고 관리 도구에서 올바른 대화 상자를 찾을 수 없을 때 유용하다는 것을 알았습니다.

다른 팁

다음 스 니펫이 스타터로 유용 할 수 있습니다.

public static bool IsUserInGroup(string lanid, string group)
{
    DirectoryEntry entry = new DirectoryEntry("LDAP://" + LDAPPATH);
    if(entry != null)
    {
        entry.Username=@"LDAPUSER";
        entry.Password="LDAPPASSWORD";
        DirectorySearcher srch = new DirectorySearcher(entry);
        srch.Filter = String.Format("(&(objectClass=person)(sAMAccountName={0}))", lanid);
        srch.PropertiesToLoad.Add("memberOf");

        SearchResult result = srch.FindOne();
        if(result != null)
        {
            if(result.Properties.Contains("memberOf"))
            {
                string lookfor = String.Format("cn={0},", group.ToLower());
                foreach(string memberOf in result.Properties["memberOf"])
                {
                    if(memberOf.ToLower().StartsWith(lookfor))
                        return true;
                }
            }
        }
        return false;
    }
    throw new Exception(String.Format("Could not get Directory lanid:{0}, group{1}",   lanid, group));
}

System.DirectoryServices 네임 스페이스를 살펴보십시오.

System.DirectoryServices 네임 스페이스

표준 LDAP 라이브러리를 사용하여 Active Directory 서버에서 정보를 검색했지만 LDAP 서버의 스키마를 통해 필요한 데이터를 사용할 수 있는지 확인해야합니다. 일반적으로 InetorganizationalPerson에 저장된 정보와 그들이 속한 그룹과 관련된 대부분의 정보를 얻을 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top