मैं डोमेन नियंत्रक के खिलाफ क्रेडेंशियल्स के एक सेट को मान्य करना चाहता हूं। उदाहरण के लिए:
Username: STACKOVERFLOW\joel
Password: splotchy
विधि 1. प्रतिरूपण के साथ क्वेरी सक्रिय निर्देशिका
बहुत से लोग कुछ के लिए सक्रिय निर्देशिका को क्वेरी करने का सुझाव देते हैं। यदि एक अपवाद को फेंक दिया जाता है, तो आप जानते हैं कि क्रेडेंशियल्स मान्य नहीं हैं - जैसा कि इस स्टैकओवरफ़्लो प्रश्न में सुझाया गया है ।
हालाँकि इस दृष्टिकोण में कुछ गंभीर कमियाँ हैं :
आप न केवल एक डोमेन खाते को प्रमाणित कर रहे हैं, बल्कि एक अंतर्निहित प्राधिकरण जांच भी कर रहे हैं। यही है, आप एक प्रतिरूपण टोकन का उपयोग करके विज्ञापन से गुण पढ़ रहे हैं। क्या होगा यदि अन्यथा मान्य खाते में AD से पढ़ने का कोई अधिकार नहीं है? डिफ़ॉल्ट रूप से सभी उपयोगकर्ताओं ने पहुंच पढ़ ली है, लेकिन प्रतिबंधित नीतियों (और या समूहों) तक पहुंच की अनुमति को अक्षम करने के लिए डोमेन नीतियां निर्धारित की जा सकती हैं।
AD के खिलाफ बाइंडिंग एक गंभीर ओवरहेड है, AD स्कीमा कैश को क्लाइंट (ADSI कैश इन डायरेक्ट्री सर्विसेज द्वारा उपयोग किए जाने वाले ADSI कैश) पर लोड किया जाना है। यह नेटवर्क, और AD सर्वर, संसाधन खपत दोनों है - और उपयोगकर्ता खाते को प्रमाणित करने जैसे सरल ऑपरेशन के लिए बहुत महंगा है।
आप एक गैर-असाधारण मामले के लिए एक अपवाद विफलता पर भरोसा कर रहे हैं, और यह मानकर कि अमान्य उपयोगकर्ता नाम और पासवर्ड है। अन्य समस्याएं (उदाहरण के लिए नेटवर्क विफलता, AD कनेक्टिविटी विफलता, मेमोरी आवंटन त्रुटि, आदि) को फिर प्रमाणीकरण विफलता के रूप में गलत रूप से समझा जाता है।
विधि 2. LogonUser Win32 एपीआई
अन्य लोगों ने LogonUser()
एपीआई फ़ंक्शन का उपयोग करने का सुझाव दिया है । यह अच्छा लगता है, लेकिन दुर्भाग्य से कॉलिंग उपयोगकर्ता को कभी-कभी केवल ऑपरेटिंग सिस्टम को दी गई अनुमति की आवश्यकता होती है:
LogonUser को कॉल करने वाली प्रक्रिया को SE_TCB_NAME विशेषाधिकार की आवश्यकता होती है। यदि कॉलिंग प्रक्रिया में यह विशेषाधिकार नहीं है, तो LogonUser विफल हो जाता है और GetLastError ERROR_PRIVILEGE_NOT_HELD लौटा देता है।
कुछ मामलों में, लॉगऑनसर को कॉल करने वाली प्रक्रिया में SE_CHANGE_NOTIFY_NAME विशेषाधिकार भी होना चाहिए; अन्यथा, LogonUser विफल हो जाता है और GetLastError ERROR_ACCESS_DENIED देता है। यह विशेषाधिकार स्थानीय सिस्टम खाते या खातों के लिए आवश्यक नहीं है जो व्यवस्थापक समूह के सदस्य हैं। डिफ़ॉल्ट रूप से, SE_CHANGE_NOTIFY_NAME सभी उपयोगकर्ताओं के लिए सक्षम है, लेकिन कुछ व्यवस्थापक इसे सभी के लिए अक्षम कर सकते हैं।
" अधिनियम ऑपरेटिंग सिस्टम के एक भाग के रूप में अधिनियम " को सौंपना विशेषाधिकार कुछ ऐसा नहीं है जिसे आप विली-निली करना चाहते हैं - जैसा कि Microsoft ज्ञानकोष लेख में बताते हैं :
... लॉगऑनसर को कॉल करने वाली प्रक्रिया में SE_TCB_NAME विशेषाधिकार होना चाहिए (उपयोगकर्ता प्रबंधक में, यह " ऑपरेटिंग सिस्टम के भाग के रूप में अधिनियम " सही है)। SE_TCB_NAME विशेषाधिकार बहुत शक्तिशाली है और इसे किसी भी मनमाने उपयोगकर्ता को नहीं दिया जाना चाहिए ताकि वे एक ऐसा एप्लिकेशन चला सकें जिसे क्रेडेंशियल्स को मान्य करने की आवश्यकता हो।
इसके अतिरिक्त, LogonUser()
खाली पासवर्ड निर्दिष्ट किए जाने पर कॉल विफल हो जाएगी।
डोमेन क्रेडेंशियल्स के एक सेट को प्रमाणित करने का उचित तरीका क्या है?
मैं ऐसा प्रबंधित कोड से कॉल कर रहे हैं, लेकिन यह आ सामान्य विंडोज सवाल है। यह माना जा सकता है कि ग्राहकों के पास .NET फ्रेमवर्क 2.0 स्थापित है।