2012-04-09 2 views
6

내 ASP.NET 웹 서비스를 Active Directory 설정과 통합하는 데 문제가 있으며 사용자 인증에 사용하고 AD 그룹에 회원으로 가입했는지 확인하십시오. 내 사용자 지정 응용 프로그램을 사용할 수있는 권한.Active Directory에서 사용자 그룹 얻기

내 사용자 지정 응용 프로그램에는 고유 한 사용 권한이 있으며 관리자는 사용자 지정 응용 프로그램을 사용할 수있는 Active Directory 그룹을 구성합니다.

나는 양방향 트러스트를 사용하는 다른 신뢰할 수있는 AD 포리스트의 사용자가 로그인을 시도 할 때 문제가 발생합니다. AD 서버에서 자신의 그룹 목록을 가져올 수 없습니다. 내 ASP.NET 웹 서비스 와 통신합니다. ASP.NET 웹 서비스는 트러스트 AD 컨트롤러 (AD Secondary)가 아닌 AD 서버 (AD Main)에만 액세스 할 수 있습니다.

사용자는 (AD 보조) 도메인의 회원이며 (AD 주) 도메인에 대해 해당 사용자를 인증 할 수 있지만 (AD 주) 도메인에서 그룹 목록을 가져올 수 없습니다. 사용자가 (AD 보조) 도메인에 있습니다.

이 코드를 사용해 보았습니다.

StringCollection groupids = new StringCollection(); 
try 
{ 
    DirectoryLibrary dirLib = new DirectoryLibrary(); 
    DirectoryEntry directoryEntry = new DirectoryEntry("LDAP://" + domain,username, password); 
    if (directoryEntry != null) 
    { 
     //Enum the properties so we can see what is in them 
     foreach (string propname in directoryEntry.Properties.PropertyNames) 
     { 
      Debug.WriteLine(propname); 
     } 

     object obGroups = directoryEntry.Invoke("Groups"); 
     foreach (object ob in (IEnumerable)obGroups) 
     { 
     // Create object for each group. 
      DirectoryEntry obGpEntry = new DirectoryEntry(ob); 
      groupids.Add(obGpEntry.NativeGuid); 
     } 
    } 
} 
catch (DirectoryServicesCOMException ex) { throw ex; } 

저는 DirectoryEntry 객체에서 이와 비슷한 것으로 이동하려고했습니다.

List<GroupPrincipal> result = new List<GroupPrincipal>(); 
StringCollection groupids = new StringCollection(); 

PrincipalContext yourDomain = new PrincipalContext(ContextType.Domain, domain, userName, password); 

// find your user 
UserPrincipal user = UserPrincipal.FindByIdentity(yourDomain, userName); 

// if found - grab its groups 
if (user != null) 
{ 
    PrincipalSearchResult<Principal> groups = user.GetGroups(); 

    // iterate over all groups 
    foreach (Principal p in groups) 
    { 
     // make sure to add only group principals 
     if (p is GroupPrincipal) 
     { 
      groupids.Add(p.DisplayName); 
     } 
    } 

} 

하지만 사용자를 얻지 못하고 다른 도메인의 해당 사용자에 대한 그룹 목록을 가져올 수 없습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

나는 [이전했다] 한 (http://serverfault.com/questions/358102/inconsistent-information-in-active AD 회원 가입으로 작은 고통의 세계 - 디렉토리 회원 및 회원 속성). 행운을 빌어 요, 내가 말할 수있는 전부입니다 ... – AakashM

+0

아직 해결책을 찾지 못했지만 ADFS를 설치하려고합니다. –

답변

1

이것은 AD에서 파생 된 특성 memberOf의 유용한 사례 인 것으로 보입니다. DirectoryEntry directoryEntry 개체를 사용하면 사용자가 속한 그룹을 열거 할 수 있습니다.

foreach (object group in directoryEntry.Properties["memberOf"]) 
{ 
    DirectoryEntry obGpEntry = New DirectoryEntry("LDAP://" + (String)group); 
    groupids.Add(obGpEntry.NativeGuid); 
} 

그것은 당신이 산부인과를 접두사가 붙어 첫 번째 코드 세그먼트를 사용할 수도 가능성 "LDAP : //"

+0

시도했는데 주사위가 없었습니다. ( –

+0

오, 기본 도메인과 보조 도메인에 대한 권한을 쿼리하는 모든 개체에 대해 읽으십시오.이 광고 권한 문제는 – Kodra

+0

yah처럼 들리지만 작동하지 않습니다. –

0

난 당신이 원격 AD에 연결하고 원하는 데이터를 얻을 수 있다고 생각.

나는 내가 그것의 많은 AD의

일부 코드에서 복제 한 번 복제, 작성 :이 당신이 필요로 정확히 아니라는 것을 알고

Public Function GetDirectoryEntry() As Object 

    If InStr(1, m_sLdapPath, "DC=") > 0 Then 
     Dim directory_service As New PrincipalContext(ContextType.Domain, m_sDomain, m_sLdapPath) 
     Return directory_service 
    Else 
     Dim directory_service As New PrincipalContext(ContextType.Machine, m_sDomain, m_sLdapPath) 
     Return directory_service 
    End If 

    End Function 

    Public Function GetUserList() As PrincipalSearchResult(Of Principal) 

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext) 
    Dim directory_user As New UserPrincipal(directory_service) 

    Dim directory_userlist As New PrincipalSearcher(directory_user) 
    directory_userlist.QueryFilter = directory_user 
    Return directory_userlist.FindAll 

    End Function 

    Public Function GetGroupList() As PrincipalSearchResult(Of Principal) 

    Dim directory_service As PrincipalContext = CType(GetDirectoryEntry(), PrincipalContext) 
    Dim directory_group As New GroupPrincipal(directory_service) 

    Dim directory_grouplist As New PrincipalSearcher(directory_group) 
    directory_grouplist.QueryFilter = directory_group 
    Return directory_grouplist.FindAll 

    End Function 

을하지만,이 방법을 보여줍니다 연결하고 모든 AD에서 데이터를 가져옵니다. 필자의 경우 사용자 목록, 그루이스트리스트 등을 얻은 다음 해당 컬렉션을 사용합니다. 나는이 문제를 해결하기 위해 조금 도움이되기를 바랍니다

Dim l_oGroupList As Object = oDirectory.GetGroupList() 
For Each l_oGroup In l_oGroupList 
    If l_oGroup.Members.Count > 0 Then 
    If l_oGroup.Members.Contains(directory_service, IdentityType.UserPrincipalName, Username) Then 
    ' he is part of the group 
    End If 
    End If 
Next 

...

관련 문제