2009-10-15 14 views
8

माइक्रोसॉफ्ट का एक सामान्य उद्देश्य KB आलेख (Q316748) है जो DirectoryEntry ऑब्जेक्ट का उपयोग कर सक्रिय निर्देशिका के विरुद्ध प्रमाणीकृत करने का वर्णन करता है।क्या सिस्टम। डायरेक्टरी सर्विसेज। डायरेक्टरी एंटर्री में एक कन्स्ट्रक्टर होता है जो वास्तव में एलडीएपी के साथ "डोमेन उपयोगकर्ता नाम" का उपयोग करता है?

string domainAndUsername = domain + @"\" + username; 
DirectoryEntry entry = new DirectoryEntry(_path, domainAndUsername, pwd); 

यह हाल ही में करने के लिए आया था: उनके उदाहरण में वे मानक NetBIOS प्रारूप ("domain \ username") में डोमेन नाम और उपयोगकर्ता नाम श्रृंखलाबद्ध और गुजर कि निर्देशिका प्रविष्टि निर्माता को पैरामीटर के रूप से एक उपयोगकर्ता नाम मूल्य का उत्पादन हमारा ध्यान है कि उपयोगकर्ता नाम का डोमेन हिस्सा पूरी तरह से अनदेखा किया जा रहा था और कई वातावरण में मैंने इस व्यवहार की पुष्टि की है। उपयोगकर्ता नाम और पासवर्ड वास्तव में उपयोग किए जा रहे हैं, क्योंकि प्रमाणीकरण अमान्य होने पर विफल रहता है, लेकिन डोमेन नाम और प्रमाणीकरण पास के लिए कोई मनमाना मूल्य प्रदान किया जा सकता है। एक नज़र में मैं यह प्रारूप चाहता हूं कि यह प्रारूप WinNT आधारित निर्देशिका पहुंच के लिए काम करता है लेकिन डोमेन भाग को एलडीएपी के लिए अनदेखा किया जाता है।

Google पर एक चेक DirectoryEntry ऑब्जेक्ट को "डोमेन \ उपयोगकर्ता नाम" मान पास करने वाले कई एलडीएपी उदाहरण दिखाता है, इसलिए मैंने या तो मेरे कॉन्फ़िगरेशन में कुछ गड़बड़ कर ली है या KB आलेख द्वारा बहुत से लोग भ्रमित हैं। क्या कोई यह पुष्टि कर सकता है कि यह अपेक्षित व्यवहार है या "डोमेन \ उपयोगकर्ता नाम" मान स्वीकार करने का तरीका सुझाता है और उनके साथ सक्रिय निर्देशिका के विरुद्ध प्रमाणित करता है?

धन्यवाद,

उत्तर

18

संक्षिप्त उत्तर: जब DirectoryEntry निर्माता की path पैरामीटर एक अमान्य डोमेन नाम है DirectoryEntry वस्तु (फॉरेस्ट में अवैध डोमेन के लिए एक असफल खोज के बाद) गिरावट के पीछे के डोमेन हिस्सा छोड़ने के द्वारा प्रयास करेंगे सादा उपयोगकर्ता नाम (sAMAccountName) का उपयोग कर username पैरामीटर और प्रयास कनेक्शन।

विस्तृत उत्तर : तो डोमेन नाम username पैरामीटर में अमान्य है लेकिन उपयोगकर्ता डोमेन path पैरामीटर उपयोगकर्ता प्रमाणीकृत किया जाएगा में निर्दिष्ट में मौजूद है (वापस आने के उपयोग के माध्यम से)। हालांकि, यदि उपयोगकर्ता path पैरामीटर प्रमाणीकरण में निर्दिष्ट किसी की तुलना में फोरेस्ट में किसी अन्य डोमेन में मौजूद है तो केवल तभी सफल होगा जब username पैरामीटर का डोमेन हिस्सा शामिल और सही हो।

  • विशिष्ट नाम (सीएन = प्रयोक्ता नाम, सीएन = उपयोगकर्ता, डीसी = डोमेन, डीसी = स्थानीय)
  • NT:

    वहाँ उपयोगकर्ता नाम पैरामीटर निर्दिष्ट करने जब DirectoryEntry-वस्तुओं से निपटने के चार अलग अलग तरीके हैं खाते का नाम (डोमेन \ उपयोगकर्ता नाम)

  • सादा खाता नाम/sAMAccountName (उपयोगकर्ता नाम)
  • यूज़र प्रिंसिपल नेम (आम तौर पर [email protected])

मुझे एक उदाहरण के साथ वर्णन करते हैं:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using System.DirectoryServices; 

namespace DirectoryTest 
{ 
    class Program 
    { 

    private static Int32 counter = 1; 

    static void Main(string[] args) 
    { 
     TestConnection(); 
    } 

    private static void TestConnection() 
    { 
     String domainOne = "LDAP://DC=domain,DC=one"; 
     String domainOneName = "DOMAINONE"; 
     String domainOneUser = "onetest"; 
     String domainOnePass = "testingONE!"; 

     String domainTwo = "LDAP://DC=domain,DC=two"; 
     String domainTwoName = "DOMAINTWO"; 
     String domainTwoUser = "twotest"; 
     String domainTwoPass = "testingTWO!"; 

     String invalidDomain = "INVALIDDOMAIN"; 

     // 1) This works because it's the correct NT Account Name in the same domain: 
     Connect(domainOne, domainOneName + "\\" + domainOneUser, domainOnePass); 

     // 2) This works because username can be supplied without the domain part 
     // (plain username = sAMAccountName): 
     Connect(domainOne, domainOneUser, domainOnePass); 

     // 3) This works because there's a fall back in DirectoryEntry to drop the domain part 
     // and attempt connection using the plain username (sAMAccountName) in (in this case) 
     // the forrest root domain: 
     Connect(domainOne, invalidDomain + "\\" + domainOneUser, domainOnePass); 

     // 4) This works because the forrest is searched for a domain matching domainTwoName: 
     Connect(domainOne, domainTwoName + "\\" + domainTwoUser, domainTwoPass); 

     // 5) This fails because domainTwoUser is not in the forrest root (domainOne) 
     // and because no domain was specified other domains are not searched: 
     Connect(domainOne, domainTwoUser, domainTwoPass); 

     // 6) This fails as well because the fallback of dropping the domain name and using 
     // the plain username fails (there's no domainTwoUser in domainOne): 
     Connect(domainOne, invalidDomain + "\\" + domainTwoUser, domainTwoPass); 

     // 7) This fails because there's no domainTwoUser in domainOneName: 
     Connect(domainOne, domainOneName + "\\" + domainTwoUser, domainTwoPass); 

     // 8) This works because there's a domainTwoUser in domainTwoName: 
     Connect(domainTwo, domainTwoName + "\\" + domainTwoUser, domainTwoPass); 

     // 9) This works because of the fallback to using plain username when connecting 
     // to domainTwo with an invalid domain name but using domainTwoUser/Pass: 
     Connect(domainTwo, invalidDomain + "\\" + domainTwoUser, domainTwoPass); 
    } 

    private static void Connect(String path, String username, String password) 
    { 
     Console.WriteLine(
     "{0}) Path: {1} User: {2} Pass: {3}", 
     counter, path, username, password); 
     DirectoryEntry de = new DirectoryEntry(path, username, password); 
     try 
     { 
     de.RefreshCache(); 
     Console.WriteLine("{0} = {1}", username, "Autenticated"); 
     } 
     catch (Exception ex) 
     { 
     Console.WriteLine("{0} ({1})", ex.Message, username); 
     } 
     Console.WriteLine(); 
     counter++; 
    } 
    } 
} 

domain.one ऊपर के उदाहरण में फॉरेस्ट रूट डोमेन है और domain.two domain.one रूप में एक ही फॉरेस्ट (लेकिन एक अलग पेड़ स्वाभाविक रूप से) में है। प्रमाणीकरण हमेशा असफल हो जायेगी डोमेन में नहीं में उपयोगकर्ता है कि हम से कनेक्ट कर रहे है, तो और कोई है, या अवैध डोमेन नाम username पैरामीटर में निर्दिष्ट किया जाता है:

तो अपने सवाल का जवाब देने।

+0

धन्यवाद आदमी, यह एक अद्भुत विस्तृत उत्तर है और मैं स्पष्टता की सराहना करता हूं –

+0

आपने "उपयोगकर्ता प्रिंसिपल नेम" केस का उल्लेख किया है ([email protected] प्रारूप की तरह), लेकिन इसके लिए टेस्ट केस नहीं है। क्या यह वैसे ही व्यवहार करेगा, इसलिए "@ domain.local", जब अमान्य होगा, मामलों में फॉलबैक का कारण होगा 3) और 9)? – dlatikay

0

मैं जो DirectoryEntry(_path, domainAndUsername, pwd); निर्माता का उपयोग करता है दो आवेदनों है और मैं किसी भी प्रमाणीकरण समस्या नहीं है। प्रत्येक एप्लिकेशन एक अलग ग्राहक पर स्थापित होता है, दोनों बहुत (बहुत) बड़े डोमेन संरचनाओं के साथ।

+0

हम्म, और क्रेडेंशियल्स का डोमेन नाम भाग उपयोग किया जाता है और आप एलडीएपी के माध्यम से कनेक्ट हो रहे हैं? मेरे पास प्रमाणीकरण समस्याएं बिल्कुल नहीं हैं, क्योंकि यह सभी मामलों में सफलतापूर्वक प्रमाणीकृत है, लेकिन यह डोमेन नाम भाग को अनदेखा करता है। यदि आप किसी अमान्य डोमेन से उपसर्ग करते हैं तो ऑथ विफल हो जाता है? –

+0

मैं अभी इसका परीक्षण नहीं कर सकता, लेकिन मैं कल करूँगा और परिणाम पोस्ट करूंगा –

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