অ্যাক্টিভ ডিরেক্টরি বিরুদ্ধে একটি ব্যবহারকারীর নাম এবং পাসওয়ার্ড যাচাই?


526

অ্যাক্টিভ ডিরেক্টরিতে আমি কীভাবে কোনও ব্যবহারকারীর নাম এবং পাসওয়ার্ডকে বৈধতা দিতে পারি? আমি কেবলমাত্র একটি ব্যবহারকারী নাম এবং পাসওয়ার্ড সঠিক কিনা তা পরীক্ষা করতে চাই।

উত্তর:


642

আপনি .NET 3.5 বা আরও নতুনর উপরে কাজ করলে আপনি System.DirectoryServices.AccountManagementনাম স্থানটি ব্যবহার করতে পারেন এবং সহজেই আপনার শংসাপত্রগুলি যাচাই করতে পারেন :

// create a "principal context" - e.g. your domain (could be machine, too)
using(PrincipalContext pc = new PrincipalContext(ContextType.Domain, "YOURDOMAIN"))
{
    // validate the credentials
    bool isValid = pc.ValidateCredentials("myuser", "mypassword");
}

এটি সহজ, এটি নির্ভরযোগ্য, এটি আপনার 100% সি # পরিচালিত কোড - আপনি আর কী চাইতে পারেন? :-)

এখানে এটি সম্পর্কে পড়ুন:

হালনাগাদ:

এই অন্যান্য এসও প্রশ্নের (এবং এর উত্তরগুলি) হিসাবে বর্ণিত হিসাবে , সম্ভবত এই Trueব্যবহারকারীর পুরানো পাসওয়ার্ডের জন্য ফিরে আসা এই কলটিতে একটি সমস্যা রয়েছে । কেবল এই আচরণ সম্পর্কে সচেতন থাকুন এবং এটি ঘটলে খুব অবাক হবেন না :-) (এটি দেখানোর জন্য @ মাইকগ্লেডহিলকে ধন্যবাদ!)


36
আমার ডোমেনে, আমাকে পিসি.ভালিডেটক্রেনডেন্টালস ("মাইউসার", "মাইপ্যাসওয়ার্ড", কনটেক্সটপশনস.নিগোটিভেট) নির্দিষ্ট করতে হবে বা আমি সিস্টেম.ডাইরেক্টরি সার্ভিসেস.প্রোটোকলস.ডাইরেক্টরিঅপেশন এক্সপ্লেশন পেয়েছি: সার্ভারটি ডিরেক্টরি অনুরোধগুলি পরিচালনা করতে পারে না।
অ্যালেক্স পেক

12
যদি কোনও পাসওয়ার্ডের মেয়াদ শেষ হয়ে যায় বা অ্যাকাউন্টগুলি অক্ষম হয়ে যায়, তবে ভ্যালিডেট ক্রেনডেনিয়ালস মিথ্যা ফেরত আসবে। দুর্ভাগ্যক্রমে, এটি আপনাকে জানায় না যে এটি কেন মিথ্যা ফিরে এসেছে (যা দুঃখের কারণ হিসাবে আমি ব্যবহারকারীর পাসওয়ার্ড পরিবর্তন করতে পুনঃনির্দেশের মতো বুদ্ধিমান কিছু করতে পারি না)।
ক্রিস জে

64
এছাড়াও 'অতিথি' অ্যাকাউন্ট থেকে সাবধান থাকুন - যদি ডোমেন-স্তরের অতিথির অ্যাকাউন্টটি সক্ষম করা থাকে, আপনি যদি অ-অস্তিত্বশীল ব্যবহারকারীকে দেন তবে ValidateCredentials সত্য হয় । ফলস্বরূপ, আপনি UserPrinciple.FindByIdentityপ্রথমে ব্যবহারকারীর আইডিতে পাস করা আছে কিনা তা দেখতে কল করতে চাইতে পারেন।
ক্রিস জে

7
@ অ্যালেক্সপেক: আপনার এটি করার কারণটি (আমার মতো) ছিল N নেটটি নিম্নলিখিত প্রযুক্তিগুলি ডিফল্টরূপে ব্যবহার করে: এলডিএপি + এসএসএল, কার্বেরোস, তারপরে আরপিসি। আমি সন্দেহ করি যে আপনার নেটওয়ার্কে আরপিসি বন্ধ রয়েছে (ভাল!) এবং আপনি স্পষ্টভাবে ব্যবহার করে না বললে Kerberos প্রকৃতপক্ষে .NET দ্বারা ব্যবহৃত হবে না ContextOptions.Negotiate
ব্রেট Veenstra

5
সচেতন থাকুন যে ব্যবহারকারী যদি তাদের অ্যাক্টিভ ডিরেক্টরি পাসওয়ার্ড পরিবর্তন করে, এই টুকরো কোডটি তাদের পুরানো এডি পাসওয়ার্ড ব্যবহার করে ব্যবহারকারীকে সুখে অনুমোদন করতে থাকবে। হ্যাঁ, সত্যিই। এখানে একটি পঠন করুন: stackoverflow.com/questions/8949501/…
মাইক গ্লেডহিল

70

আমরা আমাদের ইন্ট্রানেটে এটি করি

আপনাকে সিস্টেম.ডাইরেক্টরি সার্ভিস ব্যবহার করতে হবে;

এখানে কোডের সাহস রয়েছে

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();
        }
    }
}

9
"পথ" আপনি কি রাখেন? ডোমেইনের নাম? সার্ভারের নাম? এলডিএপি ডোমেইনের পথে? এলডিএপি সার্ভারের পথে?
ইয়ান বয়ড

3
উত্তর 1: না আমরা এটি একটি ওয়েব পরিষেবা হিসাবে চালিত করি যাতে এটি মূল ওয়েব অ্যাপের একাধিক অবস্থান থেকে কল করা যায়। উত্তর 2: পাথে রয়েছে এলডিএপি তথ্য ... এলডিএপি: // ডিসি = ডোমেন নাম 1, ডিসি = ডোমেইননাম 2, ডিসি = কম
ডাইনিংপিল্যান্ডেরার

3
দেখে মনে হচ্ছে এটি এলডিএপি ইঞ্জেকশনের অনুমতি দিতে পারে। আপনি নিশ্চয়ই নিশ্চিত হয়ে যেতে পারেন যে strAccountId
Brain2000

এর অর্থ কি strPasswordপ্লেইন টেক্সটে এলডিএপিতে সংরক্ষিত আছে?
ম্যাট কোকাজ

15
স্পষ্টভাবে Close()কোনও usingভেরিয়েবলের কল করার দরকার নেই ।
নাইয়ারগডস

62

এখানে উপস্থাপিত বেশ কয়েকটি সমাধানের মধ্যে ভুল ব্যবহারকারী / পাসওয়ার্ড এবং একটি পাসওয়ার্ডের মধ্যে পার্থক্য করার ক্ষমতা নেই। এটি নিম্নলিখিত উপায়ে করা যেতে পারে:

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);
            }
        }
    }
}

যদি ব্যবহারকারীদের পাসওয়ার্ডটি ভুল হয় বা ব্যবহারকারীর উপস্থিতি না থাকে তবে ত্রুটি থাকবে

"8009030C: LdapErr: DSID-0C0904DC, মন্তব্য: স্বীকার করুন সুরক্ষাসূত্র ত্রুটি, ডেটা 52e, ভি 1 ডিবি 1",

যদি ব্যবহারকারীদের পাসওয়ার্ড পরিবর্তন করার প্রয়োজন হয় তবে এটি ধারণ করবে

"8009030C: LdapErr: DSID-0C0904DC, মন্তব্য: স্বীকার করুন সুরক্ষাসূত্র ত্রুটি, ডেটা 773, v1db1"

lexc.ServerErrorMessageতথ্য মান Win32 ত্রুটি কোড একটি হেক্স উপস্থাপনা। এগুলি একই ত্রুটি কোডগুলি যা অন্যথায় উইন 32 লগইনউসার এপিআই কলটি কল করে ফিরে আসবে। নীচের তালিকাটিতে হেক্স এবং দশমিক মানগুলির সাথে প্রচুর সাধারণ মানের সংক্ষিপ্তসার রয়েছে:

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)

2
দুর্ভাগ্যক্রমে, কিছু AD ইনস্টলেশন LDAP সাব ত্রুটি কোডটি ফিরিয়ে দেয় না, যার অর্থ এই সমাধানটি কাজ করবে না।
সেরেন মর্স

4
প্রকল্পে কিছু উল্লেখ যুক্ত করতে ভুলবেন না: System.DirectoryServicesএবংSystem.DirectoryServices.Protocols
টমএক্সপি 411

3
আমার প্রশ্নটি যদিও এটি: আপনি এলডিএপি সার্ভারের নামটি কীভাবে পাবেন? আপনি যদি কোনও পোর্টেবল অ্যাপ্লিকেশন লিখছেন তবে আপনি প্রতিটি নেটওয়ার্কে AD সার্ভারের নাম জানতে বা প্রয়োজনীয় সরবরাহের আশা করতে পারবেন না।
TomXP411

1
আমার কাছে ব্যবহারকারী রয়েছে যা নির্দিষ্ট ওয়ার্কস্টেশনগুলিতে লগ ইন করতে সীমাবদ্ধ; আমি যে ওয়ার্কস্টেশনটির জন্য লগইনটি চেষ্টা করছি তা কীভাবে নির্দিষ্ট করব? (ওয়ার্কস্টেশন 1 ডেটা 531 দিয়ে ব্যর্থ হবে, ওয়ার্কস্টেশন 2 ভাল কাজ করবে, উদাহরণস্বরূপ)
অ্যাকোহলস্মিথ

1
আমার মনে হয় না আপনি যথেষ্ট ক্রেডিট পাচ্ছেন বলে আমি অদ্ভুত বোধ করি। এটি "Win32 অ্যাপ্লিকেশন পাসওয়ার্ডটি পুনরায় সেট করতে হবে" কিনা তা পরিষ্কার করার জন্য Win32 এপিআই কলটির ঝামেলা ছাড়াই এটি একটি সম্পূর্ণ পরিচালিত পদ্ধতি যা অন্য উত্তরগুলির কোনওটিই স্পষ্টভাবে অর্জিত হয়নি। এই পদ্ধতিতে এটির প্রশংসা কম হওয়ার কারণে কোনও ফাঁক রয়েছে? হুম ...
লিওনেট চেন

34

ডাইরেক্টরি সার্ভিস ব্যবহার করে খুব সহজ সমাধান:

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;
}

খারাপ ব্যবহারকারী / পাসওয়ার্ড সনাক্ত করতে নেটিভঅবজেক্ট অ্যাক্সেসের প্রয়োজন


4
এই কোডটি খারাপ কারণ এটি একটি অনুমোদন চেকও করছে (ব্যবহারকারীকে সক্রিয় ডিরেক্টরি তথ্য পড়ার অনুমতি দেওয়া হয়েছে কিনা তা পরীক্ষা করে দেখুন)। ব্যবহারকারীর নাম এবং পাসওয়ার্ড বৈধ হতে পারে, তবে ব্যবহারকারী তথ্য পড়ার অনুমতি দেয় না - এবং একটি ব্যতিক্রম পেতে পারে। অন্য কথায় আপনার একটি বৈধ ব্যবহারকারীর নাম এবং পাসওয়ার্ড থাকতে পারে, তবে এখনও একটি ব্যতিক্রম পান।
ইয়ান বয়ড

2
আমি প্রকৃতপক্ষে দেশীয় সমতুল্য PrincipleContext- যা কেবল নেট নেট 3.5 এ বিদ্যমান রয়েছে তা জিজ্ঞাসা করার প্রক্রিয়ায় আছি । তবে আপনি .NET 3.5 বা নতুন ব্যবহার করছেন তবে আপনার ব্যবহার করা উচিতPrincipleContext
ইয়ান বয়ড

28

দুর্ভাগ্যক্রমে AD তে কোনও ব্যবহারকারী শংসাপত্রগুলি পরীক্ষা করার কোনও "সহজ" উপায় নেই।

এখন পর্যন্ত উপস্থাপিত প্রতিটি পদ্ধতি সহ, আপনি একটি মিথ্যা-নেতিবাচক পেতে পারেন: একটি ব্যবহারকারীর শংসাপত্র বৈধ হবে, তবে AD নির্দিষ্ট পরিস্থিতিতে মিথ্যা ফিরিয়ে দেবে:

  • নেক্সট লগনে ব্যবহারকারীকে পাসওয়ার্ড পরিবর্তন করতে হবে।
  • ব্যবহারকারীর পাসওয়ার্ডের মেয়াদ শেষ হয়ে গেছে।

অ্যাক্টিভ ডাইরেক্টরি আপনাকে কোনও ব্যবহারকারীকে অবশ্যই পাসওয়ার্ড পরিবর্তন করতে হবে বা তাদের পাসওয়ার্ডের মেয়াদ শেষ হয়ে গেছে কিনা এই কারণে কোনও পাসওয়ার্ড অবৈধ কিনা তা নির্ধারণ করতে আপনাকে এলডিএপি ব্যবহারের অনুমতি দেবে না।

পাসওয়ার্ড পরিবর্তন বা পাসওয়ার্ডের মেয়াদ শেষ হয়ে গেছে তা নির্ধারণ করতে আপনি উইন 32: লগনউজার () কল করতে পারেন এবং নীচের 2 টি স্থির জন্য উইন্ডোজ ত্রুটি কোডটি পরীক্ষা করতে পারেন:

  • ERROR_PASSWORD_MUST_CHANGE = 1907
  • ERROR_PASSWORD_EXPIRED = 1330

1
আমি জিজ্ঞাসা করতে পারি আপনি মেয়াদোত্তীর্ণ এবং মোস্ট_চেঞ্জের জন্য ডিভাইসগুলি কোথায় পেয়েছেন ... সেগুলি কোথাও পাওয়া যায় নি তবে এখানে :)
mabstrei

1
এমএসডিএন নিবন্ধ থেকে: এমএসডিএন.মাইক্রোসফটকম / en
অ্যালান

ধন্যবাদ। আমি চেষ্টা করছিলাম যে আমার বৈধতা সমস্ত সময় মিথ্যা ফিরে আসছিল। এটি ছিল কারণ ব্যবহারকারীর তার পাসওয়ার্ড পরিবর্তন করতে হবে।
ডাইস ভিসেন্টিন

22

সম্ভবত সবচেয়ে সহজ উপায় হ'ল পিনভোক লগনউজার উইন 32 এপিআইজি g

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

এমএসডিএন রেফারেন্স এখানে ...

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

অবশ্যই লগনের ধরণটি ব্যবহার করতে চান

LOGON32_LOGON_NETWORK (3)

এটি কেবল একটি হালকা ওজনের টোকেন তৈরি করে - এথন চেকগুলির জন্য উপযুক্ত। (অন্যান্য ধরণের ইন্টারেক্টিভ সেশন ইত্যাদি তৈরিতে ব্যবহৃত হতে পারে)


@ অ্যালান হিসাবে উল্লেখ করেছেন যে, লগনউজার এপিআইয়ের একটি সিস্টেম.ডাইরেক্টরি সার্ভিসেস কলের বাইরে অনেকগুলি কার্যকর বৈশিষ্ট্য রয়েছে।
স্টেফবু

3
@ সিসিওটি: না, এটা ভুল। কাউকে সঠিকভাবে প্রমাণীকরণের সর্বোত্তম উপায় হ'ল লগনউসারপিআইটিকে @ স্টেপবু লেখার মতো ব্যবহার করা। এই পোস্টে বর্ণিত অন্যান্য সমস্ত পদ্ধতি 100% কাজ করবে না। তবে কেবল একটি নোট, আমি বিশ্বাস করি যে লগন ইউজারকে কল করতে আপনাকে ডোমেন ইনর্ডারে যোগ দিতে হবে।
অ্যালান 18

@ অ্যালান শংসাপত্র তৈরি করতে আপনাকে একটি বৈধ ডোমেন অ্যাকাউন্টে হস্তান্তর করে ডোমেনে সংযোগ করতে সক্ষম হতে হবে। তবে আমি নিশ্চিত যে আপনার মেশিনটি ডোমেনের সদস্য হওয়ার প্রয়োজন নেই।
স্টেফবু

2
LogonUserএপিআই আছে ব্যবহারকারী প্রয়োজন আইনের অপারেটিং সিস্টেমের একটি অংশ হিসাবে privelage; যা এমন কিছু নয় যা ব্যবহারকারীরা পান - এবং এমন কোনও কিছু নয় যা আপনি প্রতিষ্ঠানের প্রতিটি ব্যবহারকারীর কাছে প্রদান করতে চান। ( এমএসডিএন.মাইক্রোসফটকম /en-us/library/aa378184(v=vs.85).aspx )
ইয়ান বয়ড

1
লগনউজারকে উইন্ডোজ 2000 এর জন্য অপারেটিং সিস্টেমের অংশ হিসাবে কেবল নীচে প্রয়োজন সমর্থন এবং মাইক্রোসফ্ট.কম / কেবি/180548 অনুসারে ... এটি সার্ভার 2003 এবং এর থেকেও উচ্চতর জন্য পরিষ্কার দেখাচ্ছে।
ক্রিস জে

18

একটি সম্পূর্ণ। নেট সমাধানটি সিস্টেম.ডাইরেক্টরি সার্ভিসেস নেমস্পেস থেকে ক্লাসগুলি ব্যবহার করা। তারা সরাসরি একটি এডি সার্ভারকে জিজ্ঞাসা করার অনুমতি দেয়। এখানে একটি ছোট নমুনা যা এটি করবে:

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

এই কোডটি প্রদত্ত শংসাপত্রগুলি ব্যবহার করে সরাসরি AD সার্ভারের সাথে সংযোগ স্থাপন করে। শংসাপত্রগুলি যদি অবৈধ হয় তবে অনুসন্ধানকারী .ফিনডোন () একটি ব্যতিক্রম ছুঁড়ে দেবে। ত্রুটি কোডটি হ'ল "অবৈধ নাম / পাসওয়ার্ড" সিওএম ত্রুটির সাথে সম্পর্কিত।

আপনার কোনও এডি ব্যবহারকারী হিসাবে কোড চালানোর দরকার নেই। আসলে, আমি ডোমেনের বাইরের কোনও ক্লায়েন্টের কাছ থেকে এডি সার্ভারে তথ্য অনুসন্ধানের জন্য সফলভাবে এটি ব্যবহার করছি!


কিভাবে প্রমাণীকরণের প্রকার? আমি মনে করি আপনি এটি উপরে আপনার কোডটিতে ভুলে গেছেন। :-) ডিফল্ট ডিরেক্টরি ডিরেক্টরীএন্ট্রি.আথেনটিকেশন টাইপটি সুরক্ষিত ঠিকে সেট করা আছে? যে কোডটি সুরক্ষিত নয় এমন এলডিএপিগুলিতে কাজ করছে না (নামহীন বা সম্ভবত কেউই নেই)। আমি কি এই সাথে সঠিক?
jerbersoft

কোনও AD সার্ভারের অনুসন্ধানের ডাউন- সাইডটি হ'ল আপনার এডি সার্ভারটি জিজ্ঞাসা করার অনুমতি রয়েছে । আপনার শংসাপত্রটি বৈধ হতে পারে তবে আপনার যদি AD এর কোয়েরি করার অনুমতি না থাকে তবে আপনি ত্রুটিটি পেয়ে যাবেন। এজন্য তথাকথিত ফাস্ট বাইন্ড তৈরি হয়েছিল; আপনি কিছু করার ক্ষমতা ব্যবহারকারীর অনুমোদন ছাড়াই শংসাপত্রগুলি বৈধতা দিন।
আয়ান

2
শংসাপত্রগুলি যাচাইয়ের আগে অন্য কোনও কারণে COMException নিক্ষেপ করা হলে এটি কি কাউকে পাস করার অনুমতি দেবে না?
স্টিফান পল নোক

11

LDAP শংসাপত্রগুলি দ্রুত প্রমাণীকরণের জন্য আরেকটি। নেট কল:

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
    }
}

এটিই একমাত্র সমাধান যা আমার পক্ষে কাজ করেছে, প্রিন্সিপাল কনটেক্সট আমার পক্ষে কাজ করে নি।
ড্যানিয়েল

প্রিন্সিপাল কনটেক্সটটি কোনও নিরাপদ এলডিএপি সংযোগের জন্য বৈধ নয় (ওরফে এলডিএপিএস, যা পোর্ট
63

10

এই কোডটি ব্যবহার করে দেখুন (দ্রষ্টব্য: উইন্ডোজ সার্ভার 2000 এ কাজ না করার জন্য প্রতিবেদন করা হয়েছে)

#region NTLogonUser
#region Direct OS LogonUser Code
[DllImport( "advapi32.dll")]
private static extern bool LogonUser(String lpszUsername, 
    String lpszDomain, String lpszPassword, int dwLogonType, 
    int dwLogonProvider, out int phToken);

[DllImport("Kernel32.dll")]
private static extern int GetLastError();

public static bool LogOnXP(String sDomain, String sUser, String sPassword)
{
   int token1, ret;
   int attmpts = 0;

   bool LoggedOn = false;

   while (!LoggedOn && attmpts < 2)
   {
      LoggedOn= LogonUser(sUser, sDomain, sPassword, 3, 0, out token1);
      if (LoggedOn) return (true);
      else
      {
         switch (ret = GetLastError())
         {
            case (126): ; 
               if (attmpts++ > 2)
                  throw new LogonException(
                      "Specified module could not be found. error code: " + 
                      ret.ToString());
               break;

            case (1314): 
               throw new LogonException(
                  "Specified module could not be found. error code: " + 
                      ret.ToString());

            case (1326): 
               // edited out based on comment
               //  throw new LogonException(
               //   "Unknown user name or bad password.");
            return false;

            default: 
               throw new LogonException(
                  "Unexpected Logon Failure. Contact Administrator");
              }
          }
       }
   return(false);
}
#endregion Direct Logon Code
#endregion NTLogonUser

"লগনএক্সেপশন" এর জন্য আপনার নিজস্ব কাস্টম ব্যতিক্রম তৈরি করা দরকার বাদে


কোনও পদ্ধতি থেকে তথ্য ফেরত দেওয়ার জন্য ব্যতিক্রম হ্যান্ডলিং ব্যবহার করবেন না। "অজানা ব্যবহারকারীর নাম বা খারাপ পাসওয়ার্ড" ব্যতিক্রমী নয়, এটি লগন ইউজারের জন্য স্ট্যান্ডার্ড আচরণ। শুধু মিথ্যা ফিরে।
ট্রেব

হ্যাঁ ... এটি একটি পুরানো ভিবি 6 লাইব্রেরির একটি বন্দর ছিল ... 2003 বা আরও লেখা ... (যখন প্রথম প্রথম প্রকাশিত হবে)
চার্লস ব্রেটানা

উইন্ডোজ 2000 এ চলতে থাকলে এই কোডটি কাজ করবে না ( সমর্থন.microsoft.com/kb/180548 )
ইয়ান বয়ড

1
এই পুনর্বিবেচনা। লগন ব্যবহারকারীর প্রত্যাশিত আচরণ, এটির উদ্দেশ্য, ব্যবহারকারীকে লগইন করা । এটা যে কাজটি সম্পাদন করতে ব্যর্থ হলে, এটা IS একটি ব্যতিক্রম। আসলে, পদ্ধতিটি বুলিয়ান নয়, বাতিল করে ফেলা উচিত। এছাড়াও, আপনি যদি মাত্র একটি বুলিয়ান ফিরিয়ে দেন তবে পদ্ধতির গ্রাহকের কাছে ব্যর্থতার কারণ কী তা ব্যবহারকারীকে অবহিত করার কোনও উপায় নেই।
চার্লস ব্রেটানা

5

যদি আপনি .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;
}   

তিনি স্ক্রিপ্টটি চালু করলেন মেশিনের স্থানীয় অ্যাকাউন্টগুলির সাথে ভাল কাজ করে
eka808

বিটিডব্লিউ, এই পদ্ধতিটি এই কাজটি সার্বজনীন স্টিকিট স্ট্রিং টোসিকিউরস্ট্রিং (স্ট্রিং পিডব্লাস্ট্রিং) তৈরি করার জন্য প্রয়োজন [চর [] পাসওয়ার্ডচার্স = পিডবস্ট্রিং.টোকচারআরে (); সিকিউরস্ট্রিং পাসওয়ার্ড = নতুন সিকিওরস্ট্রিং (); foreach (পাসওয়ার্ডচরে চার সি) পাসওয়ার্ড.অ্যাপেন্ডচার (সি); প্রসেসস্টার্টআইএনফো foo = নতুন প্রসেসস্টার্টআইএনফো (); foo.Password = পাসওয়ার্ড; ফেরত foo.Password; }
eka808

বিপরীতে, যে কোনওভাবে পাসওয়ার্ডের জন্য সিকিউরস্ট্রিং ব্যবহার করা উচিত। ডাব্লুপিএফ পাসওয়ার্ডবক্স এটি সমর্থন করে।
স্টিফেন ড্রু

5

উইন্ডোজ প্রমাণীকরণ বিভিন্ন কারণে ব্যর্থ হতে পারে: একটি ভুল ব্যবহারকারীর নাম বা পাসওয়ার্ড, একটি লক করা অ্যাকাউন্ট, একটি মেয়াদোত্তীর্ণ পাসওয়ার্ড এবং আরও অনেক কিছু। এই ত্রুটিগুলির মধ্যে পার্থক্য জানাতে , পি / ইনভোকের মাধ্যমে লগনউজার এপিআই ফাংশনটিতে কল করুন এবং ফাংশনটি ফিরে এলে ত্রুটি কোডটি পরীক্ষা করুন false:

using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

using Microsoft.Win32.SafeHandles;

public static class Win32Authentication
{
    private class SafeTokenHandle : SafeHandleZeroOrMinusOneIsInvalid
    {
        private SafeTokenHandle() // called by P/Invoke
            : base(true)
        {
        }

        protected override bool ReleaseHandle()
        {
            return CloseHandle(this.handle);
        }
    }

    private enum LogonType : uint
    {
        Network = 3, // LOGON32_LOGON_NETWORK
    }

    private enum LogonProvider : uint
    {
        WinNT50 = 3, // LOGON32_PROVIDER_WINNT50
    }

    [DllImport("kernel32.dll", SetLastError = true)]
    private static extern bool CloseHandle(IntPtr handle);

    [DllImport("advapi32.dll", SetLastError = true)]
    private static extern bool LogonUser(
        string userName, string domain, string password,
        LogonType logonType, LogonProvider logonProvider,
        out SafeTokenHandle token);

    public static void AuthenticateUser(string userName, string password)
    {
        string domain = null;
        string[] parts = userName.Split('\\');
        if (parts.Length == 2)
        {
            domain = parts[0];
            userName = parts[1];
        }

        SafeTokenHandle token;
        if (LogonUser(userName, domain, password, LogonType.Network, LogonProvider.WinNT50, out token))
            token.Dispose();
        else
            throw new Win32Exception(); // calls Marshal.GetLastWin32Error()
    }
}

নমুনা ব্যবহার:

try
{
    Win32Authentication.AuthenticateUser("EXAMPLE\\user", "P@ssw0rd");
    // Or: Win32Authentication.AuthenticateUser("user@example.com", "P@ssw0rd");
}
catch (Win32Exception ex)
{
    switch (ex.NativeErrorCode)
    {
        case 1326: // ERROR_LOGON_FAILURE (incorrect user name or password)
            // ...
        case 1327: // ERROR_ACCOUNT_RESTRICTION
            // ...
        case 1330: // ERROR_PASSWORD_EXPIRED
            // ...
        case 1331: // ERROR_ACCOUNT_DISABLED
            // ...
        case 1907: // ERROR_PASSWORD_MUST_CHANGE
            // ...
        case 1909: // ERROR_ACCOUNT_LOCKED_OUT
            // ...
        default: // Other
            break;
    }
}

দ্রষ্টব্য: আপনি যে ডোমেনটির বিরুদ্ধে বৈধতা দিচ্ছেন তার সাথে লগনউজারের একটি বিশ্বাসের সম্পর্ক দরকার।


আপনার উত্তরটি কেন সর্বোচ্চ ভোট প্রাপ্ত উত্তরের চেয়ে ভাল বলে আপনি ব্যাখ্যা করতে পারেন?
মোহাম্মদ আলী

1
@ মোহাম্মদআলি: শংসাপত্রের বৈধতা কেন (ব্যর্থ শংসাপত্র, একটি লক করা অ্যাকাউন্ট, একটি মেয়াদোত্তীর্ণ পাসওয়ার্ড ইত্যাদি) কেন আপনার যদি জানতে হবে তবে লগনউজার এপিআই ফাংশন আপনাকে বলবে। বিপরীতে, প্রিন্সিপাল কনটেক্সট.ভালিডেট শংসাপত্রের পদ্ধতি (মার্ক_এর উত্তরের মন্তব্য অনুসারে) তা করবে না; এটি এই সমস্ত ক্ষেত্রে মিথ্যা ফিরিয়ে দেয়। অন্যদিকে, লগনউসারটির ডোমেনটির সাথে একটি বিশ্বাসের সম্পর্ক প্রয়োজন, তবে অধ্যক্ষকন্টেক্সট.ভালিডেট ক্রেনডেন্টিয়ালস (আমার মনে হয়) এটি হয় না।
মাইকেল লিউ

2

আমার সাধারণ ফাংশন

 private bool IsValidActiveDirectoryUser(string activeDirectoryServerDomain, string username, string password)
    {
        try
        {
            DirectoryEntry de = new DirectoryEntry("LDAP://" + activeDirectoryServerDomain, username + "@" + activeDirectoryServerDomain, password, AuthenticationTypes.Secure);
            DirectorySearcher ds = new DirectorySearcher(de);
            ds.FindOne();
            return true;
        }
        catch //(Exception ex)
        {
            return false;
        }
    }

1

আপনার রেফারেন্সের জন্য এখানে আমার সম্পূর্ণ প্রমাণীকরণ সমাধান।

প্রথমে নিম্নলিখিত চারটি রেফারেন্স যুক্ত করুন

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

private void AuthUser() { 


      try{
            string Uid = "USER_NAME";
            string Pass = "PASSWORD";
            if (Uid == "")
            {
                MessageBox.Show("Username cannot be null");
            }
            else if (Pass == "")
            {
                MessageBox.Show("Password cannot be null");
            }
            else
            {
                LdapConnection connection = new LdapConnection("YOUR DOMAIN");
                NetworkCredential credential = new NetworkCredential(Uid, Pass);
                connection.Credential = credential;
                connection.Bind();

                // after authenticate Loading user details to data table
                PrincipalContext ctx = new PrincipalContext(ContextType.Domain);
                UserPrincipal user = UserPrincipal.FindByIdentity(ctx, Uid);
                DirectoryEntry up_User = (DirectoryEntry)user.GetUnderlyingObject();
                DirectorySearcher deSearch = new DirectorySearcher(up_User);
                SearchResultCollection results = deSearch.FindAll();
                ResultPropertyCollection rpc = results[0].Properties;
                DataTable dt = new DataTable();
                DataRow toInsert = dt.NewRow();
                dt.Rows.InsertAt(toInsert, 0);

                foreach (string rp in rpc.PropertyNames)
                {
                    if (rpc[rp][0].ToString() != "System.Byte[]")
                    {
                        dt.Columns.Add(rp.ToString(), typeof(System.String));

                        foreach (DataRow row in dt.Rows)
                        {
                            row[rp.ToString()] = rpc[rp][0].ToString();
                        }

                    }  
                }
             //You can load data to grid view and see for reference only
                 dataGridView1.DataSource = dt;


            }
        } //Error Handling part
        catch (LdapException lexc)
        {
            String error = lexc.ServerErrorMessage;
            string pp = error.Substring(76, 4);
            string ppp = pp.Trim();

            if ("52e" == ppp)
            {
                MessageBox.Show("Invalid Username or password, contact ADA Team");
            }
            if ("775​" == ppp)
            {
                MessageBox.Show("User account locked, contact ADA Team");
            }
            if ("525​" == ppp)
            {
                MessageBox.Show("User not found, contact ADA Team");
            }
            if ("530" == ppp)
            {
                MessageBox.Show("Not permitted to logon at this time, contact ADA Team");
            }
            if ("531" == ppp)
            {
                MessageBox.Show("Not permitted to logon at this workstation, contact ADA Team");
            }
            if ("532" == ppp)
            {
                MessageBox.Show("Password expired, contact ADA Team");
            }
            if ("533​" == ppp)
            {
                MessageBox.Show("Account disabled, contact ADA Team");
            }
            if ("533​" == ppp)
            {
                MessageBox.Show("Account disabled, contact ADA Team");
            }



        } //common error handling
        catch (Exception exc)
        {
            MessageBox.Show("Invalid Username or password, contact ADA Team");

        }

        finally {
            tbUID.Text = "";
            tbPass.Text = "";

        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.