Still celebrating National IT Professionals Day with 3 months of free Premium Membership. Use Code ITDAY17

x
?
Solved

How to validate username and password through LDAP using C#?

Posted on 2006-06-14
8
Medium Priority
?
796 Views
Last Modified: 2011-10-03
I have the following code for validate username and password through LDAP, how can I rewrite it using C#? pls. help, thanks a lot!
Or can I use other methods to achieve this function, such as use System.DirectoryServices.

Function iPlanetAuth(strCoreID, strPassword)

         On Error Resume Next
         Dim oCon, oCmd, oRs, intCount
         Dim oUser, oADSObj, strUserDN, strAdsPath, oA

          Set oCon = Server.CreateObject("ADODB.Connection")
         Set oCmd = Server.CreateObject("ADODB.Command")
         oCon.Provider = "ADsDSOObject"
         oCon.Open "Active Directory Provider"
         Set oCmd.ActiveConnection = oCon
         oCmd.CommandText = "SELECT AdsPath FROM 'LDAP://acb.abc.com:389/ou=people,ou=intranet,dc=abc,dc=com' " & _
                   "WHERE uid='" & strCoreID & "'"
         oCmd.Properties("SearchScope") = 2      ' ADS_SCOPE_SUBTREE
         Set oRs = oCmd.Execute()
         if Not (oRs Is Nothing) then
                   intCount = oRs.RecordCount
                   if (intCount = 1) then
                            strAdsPath = oRs.Fields("adspath").Value
                            oA = Split(strAdsPath, "/")
                            strUserDN = oA(3)
                            Set oADSObj = GetObject("LDAP:")
                            Set oUser = oADSObj.OpenDSObject(CStr(strAdsPath), CStr(strUserDN), CStr(strPassword), 0)
                            if Err.Number <> 0 Then
                                     iPlanetAuth = false
                            else
                                     iPlanetAuth = true
                            end if
                   else
                            iPlanetAuth = false
                            ' too many matching users.
                   end if
         else
                   iPlanetAuth = false
                   ' Cannot retrieve search result.
         end if
         Set oCon = nothing
         Set oCmd = nothing
         Set oRs = nothing
         Set oUser = nothing
         Set oADSObj = nothing
End Function
0
Comment
Question by:d_chenxin
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 5
  • 3
8 Comments
 
LVL 21

Expert Comment

by:MogalManic
ID: 16902315
Try this:
    public override bool ValidateUser(string username, string password)
    {
        //If username/password is authorized to read path, then it is correct
        DirectoryEntry ldapDir = new DirectoryEntry("LDAP://acb.abc.com:389/ou=people,ou=intranet,dc=abc,dc=com", username, password);

        DirectorySearcher search = new DirectorySearcher(ldapDir);
        try
        {
            search.PropertiesToLoad.Add("sAMAccountName");
            search.PropertiesToLoad("memberof");
            search.PropertiesToLoad("cn");
            search.PropertiesToLoad("FullName");

            search.Filter = "sAMAccountName=" + username;

            SearchResult result = search.FindOne();    //Read the path
            foreach (string group in result.Properties["memberof"])
            {
                System.Diagnostics.Debug.WriteLine("group:" + group);
                //Could cache groups here with  search.FindAll() and load list of 'memberof' results
            }

            //If you got this far then you are authorized!
            return true;
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("NotAuthorized:" + username + ":" + ex.Message);
            return false;
        }
    }


add to top of class
using System.DirectoryServices;  //Add 'System.DirectoryServices' as a new reference as well
0
 
LVL 21

Expert Comment

by:MogalManic
ID: 16902328
oops! typo.  Fix this block of code:
            search.PropertiesToLoad.Add("sAMAccountName");
            search.PropertiesToLoad.Add("memberof");
            search.PropertiesToLoad.Add("cn");
            search.PropertiesToLoad.Add("FullName");
0
 

Author Comment

by:d_chenxin
ID: 16908373
Many thanks!

But when I run the program, it throws exception message "The requested authentication method is not supported by the server"  after run the first row code DirectoryEntry ldapDir = new DirectoryEntry("LDAP://acb.abc.com:389/ou=people,ou=intranet,dc=abc,dc=com", username, password);

I change the usename and password, the result is same, so I think it isn't username problem, may be the sever don't provide this kind of method?

But using VB code I posted before, it works fine. Pls. give me some advise. Thanks in advance.

Sidney
0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 21

Expert Comment

by:MogalManic
ID: 16910135
I'm sorry, I incorrectly assumed that it is Active Directory.

If you meant LDAP (which is the same but different), then you could try LDAPConnection class.  It is in the System.DirectoryServices.Protocols namespace (I think it is a seperate library as well).

Manual pages:http://msdn2.microsoft.com/en-us/library/system.directoryservices.protocols.ldapconnection.aspx


0
 
LVL 21

Accepted Solution

by:
MogalManic earned 2000 total points
ID: 16910214
Try this code:
Binding using an Identity

// C# Library namespace
using System.DirectoryServices.Protocols;

// Creating an LdapConnection instance
LdapConnection ldapConn= new LdapConnection("LDAP://acb.abc.com:389/ou=people,ou=intranet,dc=abc,dc=com");


NetworkCredential myCred = new NetworkCredential();
 
myCred .Domain = "acb.abc.com:389";  //?might not need port number
myCred .UserName = UserName;
myCred .Password = Password;
 
//Bind function will Bind the user object Credentials to the Server
ldapConn.Bind(myCred);
0
 

Author Comment

by:d_chenxin
ID: 16917095
Thank you so much!
0
 
LVL 21

Expert Comment

by:MogalManic
ID: 16917315
So It worked?
0
 

Author Comment

by:d_chenxin
ID: 16918098
Yes, it works now, thanks again:>
0

Featured Post

Concerto Cloud for Software Providers & ISVs

Can Concerto Cloud Services help you focus on evolving your application offerings, while delivering the best cloud experience to your customers? From DevOps to revenue models and customer support, the answer is yes!

Learn how Concerto can help you.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Article by: Ivo
C# And Nullable Types Since 2.0 C# has Nullable(T) Generic Structure. The idea behind is to allow value type objects to have null values just like reference types have. This concerns scenarios where not all data sources have values (like a databa…
This article is for Object-Oriented Programming (OOP) beginners. An Interface contains declarations of events, indexers, methods and/or properties. Any class which implements the Interface should provide the concrete implementation for each Inter…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…
This tutorial will teach you the special effect of super speed similar to the fictional character Wally West aka "The Flash" After Shake : http://www.videocopilot.net/presets/after_shake/ All lightning effects with instructions : http://www.mediaf…

705 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question