2010-03-29 9 views
18

मैं वर्तमान में प्रिंसिपल कॉन्टेक्स्ट क्लास का उपयोग कर सक्रिय निर्देशिका सेवाओं के माध्यम से प्रमाणित करने का प्रयास कर रहा हूं। मैं अपने एप्लिकेशन को मुहरबंद और एसएसएल संदर्भों का उपयोग कर डोमेन पर प्रमाणीकृत करना चाहता हूं।सक्रिय निर्देशिका सेवाएं: प्रिंसिपल कॉन्टेक्स्ट - "कंटेनर" ऑब्जेक्ट का डीएन क्या है?

public PrincipalContext(
    ContextType contextType, 
    string name, 
    string container, 
    ContextOptions options 
) 

विशेष रूप से, मैं के रूप में तो निर्माता का उपयोग कर रहा: ऐसा करने के लिए में, मैं the following constructor of PrincipalContext (link to MSDN page) उपयोग करने के लिए

:

PrincipalContext domainContext = new PrincipalContext(
    ContextType.Domain, 
    domain, 
    container, 
    ContextOptions.Sealing | ContextOptions.SecureSocketLayer); 

MSDN "कंटेनर" के बारे में कहते हैं स्टोर पर कंटेनर संदर्भ की जड़ के रूप में उपयोग करने के लिए। सभी प्रश्न इस रूट के तहत किए जाते हैं, और सभी आवेषण इस कंटेनर में किए जाते हैं। डोमेन और एप्लिकेशन डायरेक्टरी संदर्भ प्रकार, यह पैरामीटर एक कंटेनर ऑब्जेक्ट के विशिष्ट नाम (डीएन) है।

कंटेनर ऑब्जेक्ट का डीएन क्या है? मैं कैसे पता लगा सकता हूं कि मेरा कंटेनर ऑब्जेक्ट क्या है? क्या मैं इसके लिए सक्रिय निर्देशिका (या एलडीएपी) सर्वर से पूछताछ कर सकता हूं?

उत्तर

28

ठीक है, मैं इस मुद्दे को यह पता लगाने में कामयाब रहे:

PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,domain); 

domainContext.ValidateCredentials(userName, password, 
    ContextOptions.Negotiate | ContextOptions.SecureSocketLayer); 

ValidateCredentials विधि (के बजाय निर्माता में) में ContextOptions निर्दिष्ट करके, यह एक कंटेनर के लिए एक डी एन निर्दिष्ट करने के लिए होने से बचाने के लिए मुझे अनुमति वस्तु।

अद्यतन:

हालांकि मैं आगे प्रयोग के बाद, मैंने पाया कि कि किसी भी प्रश्न यह PrincipalContext वस्तु से ली गई जगह संयुक्त राष्ट्र एन्क्रिप्टेड लेता स्पष्ट करना चाहिए।

स्पष्ट रूप से, जब कॉन्टेक्स्टऑप्शन मान्यता प्रमाणपत्र में सेट होते हैं, तो वे विकल्प केवल वैध प्रमाणीकरण के उस विशिष्ट कॉल के लिए उपयोग किए जाते हैं। लेकिन यहां यह अजीब हो जाता है ...

तो, मैं चाहता हूं कि एडी सर्वर पर मेरे प्रश्न भी एन्क्रिप्टेड हो जाएं। उदाहरण क्वेरी:

UserPrincipal p = UserPrincipal.FindByIdentity(
    domainContext, IdentityType.SamAccountName, userName); 
var groups = p.GetGroups(); 
foreach (GroupPrincipal g in groups) { /* do something */ } 

ऊपर कोड है कि उपयोगकर्ता के अंतर्गत आता है सभी समूह की एक सूची हो जाता है, लेकिन यह स्पष्ट (एन्क्रिप्ट नहीं किए गए) में होता है। तो बहुत झुकाव के बाद, मैंने पाया कि डीएन को कभी भी सेट करने की जरूरत नहीं है।

PrincipalContext domainContext = new PrincipalContext(ContextType.Domain,domain, 
    null,ContextOptions.Negotiate | ContextOptions.SecureSocketLayer); 

मुझे पता चला कि मैं कंटेनर ऑब्जेक्ट (डीएन) को शून्य में सेट कर सकता हूं। और यह ठीक काम करता है। किसी अज्ञात प्रकार के अपवाद में इसे खाली स्ट्रिंग ("") पर सेट करना, इसलिए ऐसा नहीं लगता कि आप इसे खाली स्ट्रिंग दे सकते हैं।

और यहां अजीब हिस्सा है। आपको लगता है कि PrincipalContext में SecureSocketLayer विकल्प को सेट करने का अर्थ यह होगा कि जब आप VerifyCredentials का उपयोग करते हैं तो आपको इसे स्पष्ट रूप से सेट करने की आवश्यकता नहीं है। लेकिन मैंने पाया कि अगर मैंने इसे VerifyCredentials भाग में सेट नहीं किया है, तो प्रमाणीकरण विफल हो जाएगा, लेकिन प्रश्न (जैसे समूहों के उदाहरण में) अभी भी एन्क्रिप्टेड होता है।

शायद मैं अभी तक एडी प्रमाणीकरण और प्रश्नों को पूरी तरह से समझ नहीं पा रहा हूं, लेकिन यह मेरे लिए अजीब व्यवहार जैसा लगता है।

+1

"अजीब भाग" के लिए आपकी व्याख्या 20 वैध देरी को ठीक करने की कुंजी थी 'वैध प्रमाणीकरण'। धन्यवाद! –

+0

मुझे पता है कि यह बहुत पुराना है लेकिन मैं शोध कर रहा हूं कि साइनिंग पर एसएसएल का उपयोग करना है या नहीं और इस पोस्ट में आया। मेरा मानना ​​है कि आप कन्स्ट्रक्टर में 'शून्य' का उपयोग कर सकते हैं। जब मैं ContextOptions निर्दिष्ट करना चाहता हूं तो मैं ऐसा करता हूं। उदाहरण: 'var pc = new PrincipalContext (ContextType.Domain, Environment.UserDomainName, null, ContextOptions.Sealing);' – famousKaneis

+0

@ निर्बाध: मुझे लगता है कि कोड अंतिम कोड ब्लॉक में दिखाता है। (एफडब्ल्यूआईडब्लू, मुझे मुश्किल से याद है कि यह क्या था, लेकिन जब मैंने इसे समझ लिया तो वास्तव में खुश होना याद रखें।) :) – Pretzel

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

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