2012-03-15 11 views
6

मैं डोमेन नियंत्रक के खिलाफ प्रमाण-पत्रों का एक सेट मान्य करना चाहता हूं। उदाहरण:डोमेन प्रमाण-पत्र (मूल कोड से) को कैसे सत्यापित करें?

Username: joel 
Password: splotchy 
Domain: STACKOVERFLOW 

.NET 3.5 और नए you can use PrincipalContext.ValidateCredentials(username, password) में।

अन्यथा आप परेशानी में हैं।

ss = AcceptSecurityContext(
     @pAS._hcred,   //[in]CredHandle structure 
     phContext,    //[in,out]CtxtHandle structure 
     @InBuffDesc,   //[in]SecBufferDesc structure 
     0,      //[in]context requirement flags 
     SECURITY_NATIVE_DREP, //[in]target data representation 
     @pAS._hctxt,   //[in,out]CtxtHandle strcture 
     @OutBuffDesc,   //[in,out]SecBufferDesc structure 
     ContextAttributes,  //[out]Context attribute flags 
     @Lifetime);   //[out]Timestamp struture 
छोड़कर समारोह के साथ विफल हो कि

:

Microsoft Knowledge Base आलेख How to validate user credentials on Microsoft operating systems में कोड के बाद, मैं बिंदु जहां AcceptSecurityContext कॉल करने के लिए मिलता है

SEC_E_NO_AUTHENTICATING_AUTHORITY (0x80090311)

फ़ंक्शन विफल हुआ। प्रमाणीकरण के लिए कोई प्राधिकारी से संपर्क नहीं किया जा सका। यह निम्न स्थितियों के कारण हो सकता है:

  • प्रमाणीकरण पार्टी का डोमेन नाम गलत है।
  • डोमेन अनुपलब्ध है।
  • ट्रस्ट रिलेशनशिप विफल रहा है।

यह एक उपयोगी त्रुटि हो जाएगा, सिवाय इसके कि मैं का उपयोग कर .NET 3.5 से एक ही क्रेडेंशियल्स को सत्यापित कर सकते हैं:

using (PrincipalContext context = new PrincipalContext(ContextType.Domain, domain)) 
{ 
    valid = context.ValidateCredentials(username, password);     
} 

हो रहा हो सकता क्या कि क्रेडेंशियल्स का एक सेट को मान्य करने के लिए अनुमति देता है नेट , जबकि देशी कोड नहीं कर सकता?


अद्यतन: LogonUser भी विफल रहता है: मैं दोनों को प्राथमिकता दी Negotiate प्रदाता की कोशिश की है, साथ ही:

LogonUser("[email protected]", null, "splotchy", 
     LOGON32_LOGON_NETWORK, LOGON32_PROVIDER_WINNT50, out token); 

1311 - There are currently no logon servers available to service the logon request 

अद्यतन दो साथ वें ई विंडोज NT4 विरासत "NTLM" प्रदाता

String package = "Negotiate"; //"NTLM" 

QuerySecurityPackageInfo(package, [out] packageInfo); 
... 
AcquireCredentialsHandle(
     null,     //[in] principle 
     package,    //[in] package 
     SECPKG_CRED_OUTBOUND, //[in] credential use 
     null,     //[in] LogonID 
     pAuthIdentity,  //[in] authData 
     null,     //[in] GetKeyFn, not used and should be null 
     null,     //[in] GetKeyArgument, not used and should be null 
     credHandle,   //[out] CredHandle structure 
     expires);    //[out] expiration TimeStamp structure 
+0

आप 'InitializeSecurityContext' को कैसे कॉल कर रहे हैं? (विशेष रूप से कौन सा एसएसपी?) आप 'क्रेडहैंडल' कैसे स्थापित कर रहे हैं? –

+0

@EdwardThomson मैंने पसंदीदा 'नेगोशिएट' प्रदाता, साथ ही 'एनटीएलएम 'की कोशिश की है। 'CredHandle' को 'AcquireCredentialsHandle'' पर कॉल के माध्यम से प्रारंभ किया गया है। –

+0

मुझे एक समान समस्या होने की याद आ रही है, हालांकि यह साल पहले था और मुद्दा अस्पष्ट है। यदि आप w/उन्नत अनुमतियां चलाते हैं तो क्या कोई बदलाव है? (डोमेन व्यवस्थापक शायद?) –

उत्तर

0

मुझे लगता है कि यह एक और question कि आप पोस्ट के रूप में ही समस्या का समाधान किया जा सके।

मुझे समझ में आता है कि आप अब क्या करने की कोशिश कर रहे हैं। मुझे एक और पोस्ट पर जो लिखा है उसे दोबारा दोबारा दोहराएं।

Username Password Domain    Machine on domain? Validate as 
======== ======== ================= ================== ============== 
iboyd  pass1  .     No     Local account 
iboyd  pass1  (empty)   No     Local account 
iboyd  pass1  stackoverflow.com No     Domain account 
iboyd  pass1  .     Yes     Local account 
iboyd  pass1  (empty)   Yes     Domain account 
iboyd  pass1  stackoverflow.com Yes     Domain account 

आप एक डोमेन के उपयोगकर्ता है कि आपकी मशीन पर भरोसा नहीं करता है

  • एक डोमेन है कि आपकी मशीन
  • भरोसा से एक उपयोगकर्ता को प्रमाणित प्रमाणित करें

    1. करना चाहते हैं एक स्थानीय उपयोगकर्ता को प्रमाणित

    आप डोमेन नियंत्रक के साथ उचित SSPI हेन्डशेकिंग करके पहले दो मामलों को प्राप्त कर सकते । केबी आलेख जिसे आप किसी अन्य प्रश्न में संदर्भित कर रहे हैं वह एसएसपीआई हैंडशेकिंग को वापस लूप कर रहा है। यह नंबर एक के मामले में काम नहीं करेगा क्योंकि क्लाइंट मशीन उस डोमेन पर भरोसा नहीं करती है जिसे आप प्रमाणीकृत कर रहे हैं। यही कारण है कि आप SEC_E_NO_AUTHENTICATING_AUTHORITY देख रहे हैं। यदि आप के रूप में

    PrincipalContext.ValidateCredentials(username, password); 
    

    आप डोमेन उपयोगकर्ता से अलग ढंग से स्थानीय उपयोगकर्ता को संभालने की ज़रूरत बिल्कुल वही बात करना चाहता हूँ

    , यह कटौती करने के लिए। डोमेन उपयोगकर्ता के लिए, आपको दिए गए प्रमाण-पत्रों का उपयोग करके डोमेन नियंत्रक से जुड़ने के लिए ldap_bind_s पर कॉल करने की आवश्यकता है। // YourComputerName दिया क्रेडेंशियल्स का उपयोग: स्थानीय उपयोगकर्ता के लिए, आप Winnt से आबद्ध होने ADsOpenObject उपयोग करने के लिए की जरूरत है। यह PrincipalContext.ValidateCredentials है जो मैंने प्रतिबिंब में पढ़ा है।

    मैं नहीं दिख रहा है आप के लिए ही बात कर रहे किसी भी बराबर एक ही देशी एपीआई है।

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