2012-04-09 16 views
6

मुझे सक्रिय निर्देशिका सेटअप के साथ मेरी एएसपी.NET वेब सेवा को एकीकृत करने और इसे प्रमाणीकरण उपयोगकर्ताओं के साथ उपयोग करने और एडी समूहों के साथ जांच करने में कोई समस्या है, वे सदस्य हैं और यदि उनके पास है मेरे कस्टम एप्लिकेशन का उपयोग करने के लिए अनुमतियाँ।सक्रिय निर्देशिका में उपयोगकर्ता के समूह प्राप्त करना

मेरे कस्टम एप्लिकेशन की अपनी अनुमतियां हैं, और व्यवस्थापक सक्रिय निर्देशिका समूहों को कॉन्फ़िगर करते हैं जो कस्टम एप्लिकेशन का उपयोग करने की अनुमति देते हैं।

मेरा मुद्दा यह है कि जब मैं एक अलग ट्रस्टेड एडी वन से उपयोगकर्ता को दो अलग-अलग ट्रस्ट के साथ लॉगिन करता हूं, तो लॉगिन करने का प्रयास करता हूं, मुझे एडी सर्वर से अपने एएसपी.NET वेब सेवाओं से अपने समूहों की सूची नहीं मिल सकती के साथ संवाद करता है। एएसपी.नेट वेब सेवा के पास केवल एडी सर्वर (एडी मेन) तक पहुंच है, न कि ट्रस्ट एडी नियंत्रक (एडी माध्यमिक)।

उपयोगकर्ता (एडी माध्यमिक) डोमेन का सदस्य है, और मैं उस उपयोगकर्ता को (एडी मुख्य) डोमेन के विरुद्ध प्रमाणित कर सकता हूं, लेकिन मुझे (एडी मुख्य) डोमेन से समूह की सूची नहीं मिल सकती है जब मुझे उपयोगकर्ता (एडी माध्यमिक) डोमेन में है।

मैंने इस कोड को आजमाया है।

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; } 

मैंने निर्देशिकाऐंट्री ऑब्जेक्ट से इस तरह कुछ करने की कोशिश की है।

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 -directory-सदस्यों और सदस्य-ऑफ-द गुण) विज्ञापन समूह सदस्यता के साथ दर्द की एक छोटी सी दुनिया। गुड लक, सभी मैं कह सकता हूँ ... – AakashM

+0

हम अभी तक एक समाधान नहीं मिला है, लेकिन यह लगता है कि हम स्थापित करने के लिए ADFS –

उत्तर

1

यह विज्ञापन व्युत्पन्न विशेषता 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

हाँ, है कि या तो काम नहीं किया की तरह लगता है :( –

0

मुझे लगता है कि आप रिमोट ई से कनेक्ट और डेटा आप चाहते हैं पाने के लिए किया है।

मैं एक प्रतिकृति एक बार, मैं जहां कई ई के

कुछ कोड से दोहराने इससे बाहर लिखा था:

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 

मैं जानता हूँ कि यह वास्तव में आप क्या जरूरत नहीं है, लेकिन यह दिखाता है कि कैसे कनेक्ट करने के लिए और किसी भी एडी से डेटा प्राप्त करें। मेरे मामले में मैं एक उपयोगकर्ता सूची, grouplist या जो कुछ भी मिलता है और फिर उन संग्रह के साथ काम करते हैं।

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 

मुझे आशा है कि इस समस्या को हल करने के लिए एक सा मदद करता है ...

संबंधित मुद्दे