c# - सक्रिय निर्देशिका के खिलाफ उपयोगकर्ता नाम और पासवर्ड मान्य करें?




authentication active-directory (8)

DirectoryServices का उपयोग करके बहुत ही सरल समाधान:

using System.DirectoryServices;

//srvr = ldap server, e.g. LDAP://domain.com
//usr = user name
//pwd = user password
public bool IsAuthenticated(string srvr, string usr, string pwd)
{
    bool authenticated = false;

    try
    {
        DirectoryEntry entry = new DirectoryEntry(srvr, usr, pwd);
        object nativeObject = entry.NativeObject;
        authenticated = true;
    }
    catch (DirectoryServicesCOMException cex)
    {
        //not authenticated; reason why is in cex
    }
    catch (Exception ex)
    {
        //not authenticated due to some other exception [this is optional]
    }

    return authenticated;
}

खराब उपयोगकर्ता / पासवर्ड का पता लगाने के लिए मूल ऑब्जेक्ट एक्सेस की आवश्यकता होती है

सक्रिय निर्देशिका के विरुद्ध मैं उपयोगकर्ता नाम और पासवर्ड कैसे सत्यापित कर सकता हूं? मैं बस यह जांचना चाहता हूं कि उपयोगकर्ता नाम और पासवर्ड सही हैं या नहीं।


Ponvoke LogonUser Win32 API.eg को संभवतः सबसे आसान तरीका है

http://www.pinvoke.net/default.aspx/advapi32/LogonUser.html

एमएसडीएन संदर्भ यहाँ ...

http://msdn.microsoft.com/en-us/library/aa378184.aspx

निश्चित रूप से लॉगऑन प्रकार का उपयोग करना चाहते हैं

LOGON32_LOGON_NETWORK (3)

यह केवल हल्के टोकन बनाता है - ऑथन चेक के लिए बिल्कुल सही। (इंटरैक्टिव सत्र आदि बनाने के लिए अन्य प्रकारों का उपयोग किया जा सकता है)


दुर्भाग्यवश एडी पर उपयोगकर्ता प्रमाण-पत्रों की जांच करने के लिए कोई "सरल" तरीका नहीं है।

अब तक प्रस्तुत हर विधि के साथ, आपको झूठी-नकारात्मक मिल सकती है: उपयोगकर्ता के क्रेडिट मान्य होंगे, हालांकि कुछ परिस्थितियों में एडी झूठी वापसी करेगा:

  • उपयोगकर्ता को अगले लॉगऑन पर पासवर्ड बदलने की आवश्यकता है।
  • उपयोगकर्ता का पासवर्ड समाप्त हो गया है।

ActiveDirectory आपको यह निर्धारित करने के लिए एलडीएपी का उपयोग करने की अनुमति नहीं देगा कि कोई पासवर्ड अमान्य है या नहीं, इस तथ्य के कारण कि उपयोगकर्ता को पासवर्ड बदलना चाहिए या उनका पासवर्ड समाप्त हो गया है।

पासवर्ड परिवर्तन या पासवर्ड की समयसीमा समाप्त करने के लिए, आप Win32: LogonUser () को कॉल कर सकते हैं, और निम्न 2 स्थिरांक के लिए विंडोज त्रुटि कोड जांच सकते हैं:

  • ERROR_PASSWORD_MUST_CHANGE = 1 9 07
  • ERROR_PASSWORD_EXPIRED = 1330

फिर भी एक और .NET कॉल एलडीएपी प्रमाण-पत्र प्रमाणीकृत करने के लिए:

using System.DirectoryServices;

using(var DE = new DirectoryEntry(path, username, password)
{
    try
    {
        DE.RefreshCache(); // This will force credentials validation
    }
    catch (COMException ex)
    {
        // Validation failed - handle how you want
    }
}

यदि आप .NET 2.0 और प्रबंधित कोड से फंस गए हैं, तो यहां एक और तरीका है जो स्थानीय और डोमेन खातों के साथ काम करता है:

using System;
using System.Collections.Generic;
using System.Text;
using System.Security;
using System.Diagnostics;

static public bool Validate(string domain, string username, string password)
{
    try
    {
        Process proc = new Process();
        proc.StartInfo = new ProcessStartInfo()
        {
            FileName = "no_matter.xyz",
            CreateNoWindow = true,
            WindowStyle = ProcessWindowStyle.Hidden,
            WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
            UseShellExecute = false,
            RedirectStandardError = true,
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            LoadUserProfile = true,
            Domain = String.IsNullOrEmpty(domain) ? "" : domain,
            UserName = username,
            Password = Credentials.ToSecureString(password)
        };
        proc.Start();
        proc.WaitForExit();
    }
    catch (System.ComponentModel.Win32Exception ex)
    {
        switch (ex.NativeErrorCode)
        {
            case 1326: return false;
            case 2: return true;
            default: throw ex;
        }
    }
    catch (Exception ex)
    {
        throw ex;
    }

    return false;
}   

यहां प्रस्तुत कई समाधानों में गलत उपयोगकर्ता / पासवर्ड, और एक पासवर्ड बदलने के लिए अंतर करने की क्षमता की कमी है। यह निम्न तरीके से किया जा सकता है:

using System;
using System.DirectoryServices.Protocols;
using System.Net;

namespace ProtocolTest
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                LdapConnection connection = new LdapConnection("ldap.fabrikam.com");
                NetworkCredential credential = new NetworkCredential("user", "password");
                connection.Credential = credential;
                connection.Bind();
                Console.WriteLine("logged in");
            }
            catch (LdapException lexc)
            {
                String error = lexc.ServerErrorMessage;
                Console.WriteLine(lexc);
            }
            catch (Exception exc)
            {
                Console.WriteLine(exc);
            }
        }
    }
}

यदि उपयोगकर्ता पासवर्ड गलत है, या उपयोगकर्ता मौजूद नहीं है, तो त्रुटि होगी

"8009030 सी: LdapErr: DSID-0C0904DC, टिप्पणी: AcceptSecurityContext त्रुटि, डेटा 52e, v1db1",

यदि उपयोगकर्ता पासवर्ड को बदलने की जरूरत है, तो इसमें शामिल होगा

"8009030 सी: LdapErr: DSID-0C0904DC, टिप्पणी: AcceptSecurityContext त्रुटि, डेटा 773, v1db1"

lexc.ServerErrorMessage डेटा मान Win32 त्रुटि कोड का हेक्स प्रतिनिधित्व है। ये वही त्रुटि कोड हैं जिन्हें अन्यथा Win32 LogonUser API कॉल का आह्वान करके वापस किया जाएगा। नीचे दी गई सूची हेक्स और दशमलव मानों के साथ सामान्य मानों की एक श्रृंखला को सारांशित करती है:

525​ user not found ​(1317)
52e​ invalid credentials ​(1326)
530​ not permitted to logon at this time​ (1328)
531​ not permitted to logon at this workstation​ (1329)
532​ password expired ​(1330)
533​ account disabled ​(1331) 
701​ account expired ​(1793)
773​ user must reset password (1907)
775​ user account locked (1909)

सिस्टम से कक्षाओं का उपयोग करने के लिए एक पूर्ण नेट समाधान है। डायरेक्टरी सर्विसेज नेमस्पेस। वे सीधे एक एडी सर्वर से पूछने की अनुमति देते हैं। यहां एक छोटा सा नमूना है जो यह करेगा:

using (DirectoryEntry entry = new DirectoryEntry())
{
    entry.Username = "here goes the username you want to validate";
    entry.Password = "here goes the password";

    DirectorySearcher searcher = new DirectorySearcher(entry);

    searcher.Filter = "(objectclass=user)";

    try
    {
        searcher.FindOne();
    }
    catch (COMException ex)
    {
        if (ex.ErrorCode == -2147023570)
        {
            // Login or password is incorrect
        }
    }
}

// FindOne() didn't throw, the credentials are correct

यह कोड प्रदान किए गए प्रमाण-पत्रों का उपयोग करके सीधे एडी सर्वर से जुड़ता है। यदि प्रमाण-पत्र अमान्य हैं, तो खोजकर्ता। ढूँढें () एक अपवाद फेंक देगा। त्रुटि कोड "अवैध उपयोगकर्ता नाम / पासवर्ड" COM त्रुटि से संबंधित है।

आपको कोड को एडी उपयोगकर्ता के रूप में चलाने की आवश्यकता नहीं है। असल में, मैं डोमेन के बाहर एक ग्राहक से, एडी सर्वर पर सूचनाओं के बारे में पूछताछ के लिए सफलतापूर्वक इसका उपयोग करता हूं!


हम इसे अपने इंट्रानेट पर करते हैं

आपको System.DirectoryServices का उपयोग करना होगा;

कोड के हिम्मत यहाँ हैं

using (DirectoryEntry adsEntry = new DirectoryEntry(path, strAccountId, strPassword))
{
    using (DirectorySearcher adsSearcher = new DirectorySearcher(adsEntry))
    {
        //adsSearcher.Filter = "(&(objectClass=user)(objectCategory=person))";
        adsSearcher.Filter = "(sAMAccountName=" + strAccountId + ")";

        try
        {
            SearchResult adsSearchResult = adsSearcher.FindOne();
            bSucceeded = true;

            strAuthenticatedBy = "Active Directory";
            strError = "User has been authenticated by Active Directory.";
        }
        catch (Exception ex)
        {
            // Failed to authenticate. Most likely it is caused by unknown user
            // id or bad strPassword.
            strError = ex.Message;
        }
        finally
        {
            adsEntry.Close();
        }
    }
}




active-directory