2012-06-28 16 views
13

मान्य करें मैं विंडोज़ पहचान पहचान फ्रेम का उपयोग कर डेस्कटॉप एप्लिकेशन के उपयोगकर्ताओं को प्रमाणित करने के लिए एक सरल वेब सेवा विकसित करने की कोशिश कर रहा हूं, वर्तमान में मैं WindowsIdentity.GetCurrent().Token द्वारा पोस्ट चर के माध्यम से उत्पन्न टोकन पास कर रहा हूं (यह एन्क्रिप्ट किया गया है और ssl'd , विंडोज प्रमाणीकरण एक विकल्प नहीं है जो हमारे डोमेन के लेआउट और सर्वर की कॉन्फ़िगरेशन दिया गया है)। मैं टोकन को ठीक से गुजर रहा हूं और उसे IntPtr में परिवर्तित कर रहा हूं।विंडोज पहचान टोकन

मैं टोकन को सत्यापित करने के तरीके के रूप में खो गया हूं कि यह किसी विशेष सक्रिय निर्देशिका (या उस मामले के लिए कोई भी) द्वारा उत्पन्न किया गया था। मैंने टोकन दिए गए एक नया WindowsIdentity उदाहरण बनाने की कोशिश की है, हालांकि केवल अपवाद में परिणाम (संदेश: प्रतिरूपण के लिए अमान्य टोकन - इसे डुप्लिकेट नहीं किया जा सकता है)।

यदि कोई भी मदद या यहां तक ​​कि संकेत प्रदान कर सकता है तो मैं बहुत सराहना करता हूं, अग्रिम धन्यवाद।

+0

क्या टोकन का उपयोग करना संभव होगा और संसाधनों तक पहुंचने के लिए टोकन का उपयोग करते समय Windows को सत्यापन छोड़ना संभव होगा? –

+2

मेरे मामले में मैं एक कस्टम सॉकेट क्लाइंट/सर्वर समाधान का उपयोग कर रहा हूं जहां मैं विंडोज प्रमाणीकरण का उपयोग कर उपयोगकर्ताओं को प्रमाणीकृत करना चाहता हूं। इसलिए मुझे प्रमाणन के लिए एक टोकन या सर्वर के समान परिवहन करने की आवश्यकता है, लेकिन मुझे समझ में नहीं आता कि कैसे। एमएसडीएन बहुत उपयोगी नहीं है। – jgauffin

+0

क्या एक ही डोमेन पर ग्राहक और सर्वर हैं? विंडोज़ में लॉग इन करते समय क्लाइंट डोमेन को प्रमाणित करता है? –

उत्तर

-1

खैर,

अगर मैं सही ढंग से अपने प्रश्न समझ में, मुझे पता है कि यह प्रत्यक्ष एपीआई कॉल कर ऐसा करने के लिए संभव है। Advapi32.dll में LogonUser उत्तर है। निम्नलिखित स्निपेट के लिए मुझे

public class ActiveDirectoryHelper 
{ 
    [DllImport("advapi32.dll", SetLastError = true)] 
    private static extern bool LogonUser(
     string lpszUsername, 
     string lpszDomain, 
     string lpszPassword, 
     int dwLogonType, 
     int dwLogonProvider, 
     out IntPtr phToken 
     ); 

    [DllImport("kernel32.dll", SetLastError = true)] 
    [return: MarshalAs(UnmanagedType.Bool)] 
    public static extern bool CloseHandle(IntPtr hObject); 

    public static bool Authenticate(string userName, string password, string domain) 
    { 
     IntPtr token; 
     LogonUser(userName, domain, password, 2, 0, out token); 

     bool isAuthenticated = token != IntPtr.Zero; 

     CloseHandle(token); 

     return isAuthenticated; 
    } 

    public static IntPtr GetAuthenticationHandle(string userName, string password, string domain) 
    { 
     IntPtr token; 
     LogonUser(userName, domain, password, 2, 0, out token); 
     return token; 
    } 


} 
1
public bool DoesUserExist(string userName) 
{ 
    using (var domainContext = new PrincipalContext(ContextType.Domain, "DOMAIN")) 
    { 
     using (var foundUser = UserPrincipal.FindByIdentity(domainContext, IdentityType.SamAccountName, userName)) 
     { 
      return foundUser != null; 
     } 
    } 
} 

काम एक उपयोगकर्ता मौजूद है, तो के लिए जाँच प्राप्त करने के लिए। यह System.DirectoryServices.AccountManagement नामस्थान और असेंबली से आता है।

बस अपने उपयोगकर्ता नाम में पास करें जो आप WindowsIdentity.GetCurrent() से प्राप्त कर सकते हैं और यदि उपयोगकर्ता आपके उपयोगकर्ता समूह में है तो यह एक वास्तविक/झूठा वापस आ जाएगा। (अपने आवश्यक समूह नाम के साथ DOMAIN को प्रतिस्थापित करें।)

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