2011-09-07 7 views
9

मुझे PrincipalContext.ValidateCredentials का उपयोग करके यहां कुछ अजीब व्यवहार दिखाई दे रहा है। सेट-अप माता-पिता/बाल सेटअप में दो सक्रिय निर्देशिका डोमेन हैं (इसलिए हमारे पास प्राथमिक डोमेन company.com और उप-डोमेन development.company.com) है।मान्य प्रमाणीकरण अज्ञात उपयोगकर्ता के लिए सच है?

जब मैं प्राथमिक डोमेन के खिलाफ प्रमाण-पत्र मान्य करता हूं, ValidateCredentials अपेक्षित व्यवहार करता है, अच्छे उपयोगकर्ता/पास जोड़े के लिए सत्य लौटाता है, और किसी और चीज़ के लिए झूठा होता है।

हालांकि अगर मैं उप-डोमेन में किसी उपयोगकर्ता को मान्य करता हूं, तो ValidateCredentials दोनों अच्छे उपयोगकर्ता नाम/पासवर्ड और अमान्य उपयोगकर्ताओं के लिए सत्य लौटाता है। यदि मैं एक अवैध उपयोगकर्ता के साथ एक वैध उपयोगकर्ता प्रदान करता हूं, तो यह सही ढंग से गलत लौटाता है।

अब मैं UserPrincipal.FindByIdentity() पहले करने से इस समय चारों ओर काम कर रहा हूँ और उपयोगकर्ता मौजूद है, तो बुला ValidateCredentials - लेकिन मैं समझने के लिए क्या हो रहा है करना चाहते हैं।

एक और वैकल्पिक हल मैं MSDN entry for ValidateCredentials states रूप domain\username के रूप में के माध्यम से उपयोगकर्ता नाम पारित करके है देखा है:

इस समारोह के प्रत्येक संस्करण में, userName स्ट्रिंग में से एक में विभिन्न स्वरूपों की एक किस्म हो सकता है । स्वीकार्य प्रारूपों की पूरी सूची के लिए, ADS_NAME_TYPE_ENUM दस्तावेज़ देखें।

... जिसमें से उपयोगकर्ता नाम का यह रूप सूचीबद्ध है। लेकिन इस का कारण बनता है ValidateCredentials हमेशा सच लौटने के लिए, कोई फर्क नहीं पड़ता उपयोगकर्ता नाम और पासवर्ड के किसी भी संयोजन मैं में पारित

उचित कोड है:

bool authenticated = false; 

// Various options tried for ContextOptions, [etc] inc. explicit username/password to bind to AD with -- no luck. 
using (PrincipalContext pc = new PrincipalContext(ContextType.Domain, domain, null, ContextOptions.Negotiate, null, null)) 
{ 
    log(pc.ConnectedServer + " => " + pc.UserName + " => " + pc.Name + " => " + pc.Container); 
    using (var user = UserPrincipal.FindByIdentity(pc, IdentityType.SamAccountName, username)) 
    { 
     if (user != null) 
     { 
      log(user.DistinguishedName + "; " + user.DisplayName); 
      authenticated = pc.ValidateCredentials(username, password); 
     } else { 
      log("User not found"); 
      // Debug only -- is FindByIdentity() needed. This should always return 
      // false, but doesn't. 
      authenticated = pc.ValidateCredentials(username, password); 
     } 
    } 
} 
return authenticated; 

कोई और सभी (समझदार) सुझावों का स्वागत करते हैं - मैं कर रहा हूँ। इस पर मेरे सिर खरोंच कर रहा है क्योंकि यह सिर्फ सभी उम्मीदों के खिलाफ चला जाता है।

मुझे यह जोड़ना चाहिए: यह मेरी मशीन पर खुद के रूप में चल रहा है, जिनमें से दोनों प्राथमिक डोमेन के सदस्य हैं। हालांकि मैंने इसे उसी मशीन के साथ उप-डोमेन (runas /user:subdomain\user cmd) के उपयोगकर्ता के रूप में अपनी मशीन पर कमांड प्रॉम्प्ट में चलाने का भी प्रयास किया है।

+0

मेरे पास दो डोमेन हैं। मैं वैध प्रमाण-पत्रों को कॉल करने के लिए अपने डोमेन के लिए आईपी पता का उपयोग कर सकता हूं, और यदि मैं डोमेन से उपयोगकर्ताओं के लिए उपयोगकर्ता नाम या पासवर्ड पास करता हूं तो यह सफल होता है। मुझे आश्चर्य है कि मुझे इस अतिरिक्त जानकारी की आपूर्ति करने की ज़रूरत नहीं है, और थोड़ा उलझन में है, तो मैं यह कैसे पता लगाऊंगा कि मैं सही डोमेन से सही उपयोगकर्ता को मान्य कर रहा हूं। (क्या प्रत्येक के लिए एक जेस्मिथ कहना संभव नहीं होगा?) – Greg

उत्तर

16

बाद googling (नहीं है कि मैं में और पूरे दिन गूगल से बाहर किया गया है इस वैसे भी खोजने की कोशिश) के कुछ राशि, मैं found the answer है।

बस रखें, यदि डोमेन में अतिथि खाता सक्षम है, तो वैध प्रमाणीकरण किसी अज्ञात उपयोगकर्ता के लिए TRUE वापस कर देगा। मैंने develop.company.com में अतिथि उपयोगकर्ता की स्थिति की जांच की है, और सुनिश्चित करें कि खाता सक्षम है। यदि मेरे पास अतिथि खाता अक्षम है, तो वैध प्रमाणीकरण सही रूप से गलत लौटाता है।

यह एक काफी मौलिक गॉचा है, यकीन नहीं है कि मैं इस व्यवहार पर उत्सुक हूं ... करुणा यह स्पष्ट रूप से एमएसडीएन पर उल्लेख नहीं है।

+0

वाह ... यह एक आसान मिस है जो एक बड़ा सुरक्षा छेद हो सकता था। जवाब के लिए धन्यवाद! –

+2

एडी एपीआई को इतना मस्तिष्क क्यों होना चाहिए? –

+0

5 साल पहले और मामला अभी भी वही है। 'प्रिंसिपल कॉन्टेक्स्ट। वैलिडेट क्रेडेंशियल ("ब्लाह", "ब्लाह", कॉन्टेक्स्टऑप्शन। वार्तालाप)' सत्य 'वापस करने के लिए चौंक गया था। – trailmax

0

यह this से संबंधित हो सकता है:

ValidateCredentials

विधि सर्वर निर्माता में निर्दिष्ट को बांधता है। यदि उपयोगकर्ता नाम और पासवर्ड पैरामीटर शून्य हैं, तो कन्स्ट्रक्टर में निर्दिष्ट प्रमाण-पत्र मान्य हैं। यदि कोई क्रेडेंशियल कन्स्ट्रक्टर में निर्दिष्ट नहीं किया गया था, और उपयोगकर्ता नाम और पासवर्ड पैरामीटर शून्य हैं, तो यह विधि वर्तमान प्रिंसिपल के लिए डिफ़ॉल्ट प्रमाण-पत्र मान्य करती है।

+0

नहीं ... जैसा कि यह निकला, डोमेन-स्तरीय अतिथि खाता सक्षम था; अगर मैं इसे अक्षम करता हूं, तो वैध प्रमाणीकरण सही काम करता है। (और जैसा कि सामान्य है, अधिकांश दिन जवाब खोजने का प्रयास करने के बाद, इसे पोस्ट करने के 20 मिनट बाद मुझे जवाब मिल गया)। –

+0

हाँ हमेशा मामले :) – TheCodeKing

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