<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-4880364674450768067</id><updated>2012-02-16T19:13:01.859-08:00</updated><category term='SSO'/><category term='AD'/><category term='LDAP'/><category term='User Authentication'/><title type='text'>Praveen's</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://praveen-rangarajan.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4880364674450768067/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://praveen-rangarajan.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Praveen Rangarajan</name><uri>http://www.blogger.com/profile/10501638623047223714</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>1</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-4880364674450768067.post-5704834874242447704</id><published>2009-06-30T07:29:00.001-07:00</published><updated>2009-06-30T08:10:20.099-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='User Authentication'/><category scheme='http://www.blogger.com/atom/ns#' term='AD'/><category scheme='http://www.blogger.com/atom/ns#' term='LDAP'/><category scheme='http://www.blogger.com/atom/ns#' term='SSO'/><title type='text'>C# class to validate User credentials on Active Directory (LDAP)</title><content type='html'>I have seen a lot of folks trying to build a SSO int(er|ra)net web application, and end up using Windows Authentication because its tough for them to write a AD connector. Trust me guys its not too hard, not with google around :). &lt;div&gt;Anyway here's yet another SSO implementation (happens to be mine :)).&lt;br /&gt;&lt;div&gt;Its fairly easy to use the class. Just 2 public static routines. One to validate a user's credential, and the other to retrieve all users from the AD. Part one is self explanatory. Part two was important for me because I do roles management (and no I dont use Membership Providers - its either too little or too much). &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Here's the full implementation. Let me know if you have trouble using it. btw, a sample usage:&lt;/div&gt;&lt;div&gt;1. &lt;span class="Apple-style-span"   style="  ;font-family:Helvetica, fantasy;font-size:10px;"&gt;&lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#2b91af;"&gt;String&lt;/span&gt;.IsNullOrEmpty(string errorMessage = &lt;span style="color:#2b91af;"&gt;ADConnector&lt;/span&gt;.AuthenticateUserPassword("LDAP://secure.company.com", "tech1", "tech1234")))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, -webkit-fantasy;font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;{&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, -webkit-fantasy;font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;  &lt;/span&gt;//blah blah blah&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Helvetica, -webkit-fantasy;font-size:85%;"&gt;&lt;span class="Apple-style-span"  style="font-size:10px;"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;2. &lt;span class="Apple-style-span"   style="  ;font-family:Helvetica, fantasy;font-size:10px;"&gt; &lt;span style="color:#2b91af;"&gt;SearchResultCollection&lt;/span&gt; resColl = &lt;span style="color:#2b91af;"&gt;ADConnector&lt;/span&gt;.DumpAllUsers("LDAP://secure.comapy.com", "admin", "admin1234");&lt;/span&gt;&lt;/div&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#0000ff;"&gt;foreach&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;SearchResult&lt;/span&gt; res &lt;span style="color:#0000ff;"&gt;in&lt;/span&gt; resColl)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-tab-span" style="white-space:pre"&gt;   &lt;/span&gt;//If account is not disabled&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                    &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (!&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToBoolean(&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(res.Properties[&lt;span style="color:#a31515;"&gt;"userAccountControl"&lt;/span&gt;][0], System.Globalization.&lt;span style="color:#2b91af;"&gt;CultureInfo&lt;/span&gt;.InvariantCulture) &amp;amp; &lt;span style="color:#2b91af;"&gt;ADConnector&lt;/span&gt;.UF_DISABLED))&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                    {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                        //blah blah blah&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                    }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            }&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;---------------------------------------------------------------------------------ADConnector.cs------------------------------------------------------------------------------------------------&lt;/p&gt;&lt;div&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="color:#0000FF;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span style="color:#0000ff;"&gt;namespace&lt;/span&gt; Utilities.Login.SSO&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;{&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;///&lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;summary&lt;span class="Apple-style-span" style="font-family: Helvetica, -webkit-fantasy; "&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;/// &lt;/span&gt; &lt;span style="color: #808080"&gt;&amp;lt;remarks&lt;span class="Apple-style-span" style="font-family: Helvetica, -webkit-fantasy; "&gt;&amp;gt;&lt;span class="Apple-style-span" style="color: rgb(0, 128, 0); font-family: Helvetica, fantasy; "&gt;Developed by: Praveen Rangarajan&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #808080"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;/// &lt;/span&gt; &lt;span style="color: #808080"&gt;&amp;lt;CR1 date="10/12/2008"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;Included the functionality to retrieve all accounts from the AD&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); font-family: Helvetica, -webkit-fantasy; "&gt;&amp;lt;/&lt;span class="Apple-style-span" style="font-family: Helvetica, fantasy; "&gt;CR1&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;&lt;span style="color: #808080"&gt;/// &lt;/span&gt; &lt;span style="color: #808080"&gt;&amp;lt;CR2 date="2/4/2009"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;Functionality to return "Locked-out", "Password expired", and "Account disabled" error message&lt;span style="color: #808080"&gt;&amp;lt;/CR2&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;/remarks&lt;span class="Apple-style-span" style="font-family: Helvetica, -webkit-fantasy; "&gt;&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#808080;"&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&lt;span style="color: #000000"&gt;    &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;/summary&lt;span class="Apple-style-span" style="font-family: Helvetica, -webkit-fantasy; "&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p color="#808080" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&lt;/span&gt;public&lt;span style="color:#000000;"&gt; &lt;/span&gt;partial&lt;span style="color:#000000;"&gt; &lt;/span&gt;class&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#2b91af;"&gt;ADConnector&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; UF_DISABLED = 0x0002;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; UF_LOCKED = 0x0010;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;const&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; UF_EXPIRED = 0x800000;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;///&lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt; Authenticate the login credentials of the user on the AD.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;param name="ldap"&lt;span style="color: #008000"&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;Url to the LDAP server alongwith the default DC settings. Example "LDAP://contoso.com, DC=contoso, DC=com"&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;param name="userName"&lt;span style="color: #008000"&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;Domain account of the user. Just the account name is sufficient&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;param name="password"&lt;span style="color: #008000"&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;User password&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;returns&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt; null If valid.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt; Non-empty string with the error message, if invalid.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;/returns&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        &lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; AuthenticateUserPassword(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ldap, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; userName, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; password, &lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); "&gt;string&lt;/span&gt; adminName, &lt;span class="Apple-style-span" style="color: rgb(0, 0, 255); "&gt;string&lt;/span&gt; adminPassword)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#0000ff;"&gt;try&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt; deSystem = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt;(ldap, userName, password);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#2b91af;"&gt;DirectorySearcher&lt;/span&gt; s = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectorySearcher&lt;/span&gt;(deSystem, &lt;span style="color:#a31515;"&gt;"SAMAccountName="&lt;/span&gt; + userName,&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                    &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;[] { &lt;span style="color:#a31515;"&gt;"userAccountControl"&lt;/span&gt; }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                    , &lt;span style="color:#2b91af;"&gt;SearchScope&lt;/span&gt;.Subtree);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#2b91af;"&gt;SearchResult&lt;/span&gt; res;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((res = s.FindOne()) == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;"Username and/or Password incorrect"&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToBoolean(&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(res.Properties[&lt;span style="color:#a31515;"&gt;"userAccountControl"&lt;/span&gt;][0]) &amp;amp; UF_DISABLED))&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;"Account has been disabled. Please contact administrator for more details"&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#0000ff;"&gt;catch&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            {&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;//User validation returned exception. Now check for Password expired or Account locked out.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;// Use the admin account (any account has LDAP query rights) to check for the above condition.&lt;/span&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt; deSystem = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt;(ldap, adminName, adminPassword);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#2b91af;"&gt;DirectorySearcher&lt;/span&gt; s = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectorySearcher&lt;/span&gt;(deSystem, &lt;span style="color:#a31515;"&gt;"SAMAccountName="&lt;/span&gt; + userName,&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] { &lt;/span&gt;"userAccountControl"&lt;span style="color:#000000;"&gt;, &lt;/span&gt;"msDS-User-Account-Control-Computed"&lt;span style="color:#000000;"&gt; }&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                    , &lt;span style="color:#2b91af;"&gt;SearchScope&lt;/span&gt;.Subtree);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#2b91af;"&gt;SearchResult&lt;/span&gt; res;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; ((res = s.FindOne()) == &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;)&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;"User not identified in AD"&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToBoolean(&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(res.Properties[&lt;span style="color:#a31515;"&gt;"userAccountControl"&lt;/span&gt;][0]) &amp;amp; UF_DISABLED))&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;"Account has been disabled. Please contact administrator for more details"&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (res.Properties.Contains(&lt;span style="color:#a31515;"&gt;"msDS-User-Account-Control-Computed"&lt;/span&gt;) &amp;amp;&amp;amp;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                    &lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToBoolean(&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(res.Properties[&lt;span style="color:#a31515;"&gt;"msDS-User-Account-Control-Computed"&lt;/span&gt;][0]) &amp;amp; UF_LOCKED))&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;"Account locked-out. Please contact administrator for more details"&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                &lt;span style="color:#0000ff;"&gt;if&lt;/span&gt; (&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToBoolean(&lt;span style="color:#2b91af;"&gt;Convert&lt;/span&gt;.ToInt32(res.Properties[&lt;span style="color:#a31515;"&gt;"userAccountControl"&lt;/span&gt;][0]) &amp;amp; UF_EXPIRED))&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                    &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;"Password has expired. Please change your password before attempting to login again."&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;return&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;"Username and/or Password incorrect"&lt;span style="color:#000000;"&gt;;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p color="#808080" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;&lt;/p&gt;&lt;p color="#808080" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;///&lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt; Internal function to convert Large integer into its highpart and lowpart equivalents.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;///&lt;span style="color: #008000"&gt; &amp;lt;&lt;/span&gt;/summary&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;///&lt;span style="color: #008000"&gt; &amp;lt;&lt;/span&gt;param name="largeInteger"&amp;gt;&lt;span style="color: #008000"&gt;Large integer object&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;///&lt;span style="color: #008000"&gt; &amp;lt;&lt;/span&gt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        &lt;span style="color:#0000ff;"&gt;private&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;long&lt;/span&gt; LongFromLargeIntegerObject(&lt;span style="color:#0000ff;"&gt;object&lt;/span&gt; largeInteger)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            System.&lt;span style="color:#2b91af;"&gt;Type&lt;/span&gt; type = largeInteger.GetType();&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; highPart = (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)type.InvokeMember(&lt;span style="color:#a31515;"&gt;"HighPart"&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, largeInteger, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#0000ff;"&gt;int&lt;/span&gt; lowPart = (&lt;span style="color:#0000ff;"&gt;int&lt;/span&gt;)type.InvokeMember(&lt;span style="color:#a31515;"&gt;"LowPart"&lt;/span&gt;, &lt;span style="color:#2b91af;"&gt;BindingFlags&lt;/span&gt;.GetProperty, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;, largeInteger, &lt;span style="color:#0000ff;"&gt;null&lt;/span&gt;);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; (&lt;span style="color:#0000ff;"&gt;long&lt;/span&gt;)highPart &lt;&lt; style="color: #0000ff"&gt;uint)lowPart;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;/p&gt;&lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;///&lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;summary&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;///&lt;/span&gt; Returns a collection of all users on the AD, for the given CN.&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;/summary&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;/// &lt;/span&gt; &lt;span style="color: #808080"&gt;&amp;lt;param name="ldap"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;Fully qualified LDAP url, alongwith the CN and OU.&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #008000"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;&lt;span style="color: #808080"&gt;/// &lt;/span&gt; &lt;span style="color: #808080"&gt;&amp;lt;param name="connectUser"&lt;/span&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;Domain account having privileges to query to the LDAP.&lt;span style="color: #808080"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;param name="connectPassword"&lt;span style="color: #008000"&gt;&lt;span class="Apple-style-span" style="color: rgb(128, 128, 128); "&gt;&amp;gt;&lt;/span&gt;Password for the domain account.&lt;/span&gt;&amp;lt;/param&amp;gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color: #808080"&gt;&lt;span style="color: #000000"&gt;        &lt;/span&gt;/// &lt;span style="color: #008000"&gt; &lt;/span&gt;&amp;lt;returns&amp;gt;&lt;span class="Apple-style-span"  style="color:#009900;"&gt;SearchResultCollection&lt;/span&gt;&amp;lt;/returns&amp;gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt; &lt;p color="#808080" style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; "&gt;&lt;span style="color:#0000ff;"&gt;public&lt;/span&gt; &lt;span style="color:#0000ff;"&gt;static&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;SearchResultCollection&lt;/span&gt; DumpAllUsers(&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; ldap, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; connectUser, &lt;span style="color:#0000ff;"&gt;string&lt;/span&gt; connectPassword)&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        {&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt; deSystem = &lt;span style="color:#0000ff;"&gt;new&lt;/span&gt; &lt;span style="color:#2b91af;"&gt;DirectoryEntry&lt;/span&gt;(ldap, connectUser, connectPassword);&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#2b91af;"&gt;&lt;span style="color:#000000;"&gt;            &lt;/span&gt;DirectorySearcher&lt;span style="color:#000000;"&gt; s = &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;DirectorySearcher&lt;span style="color:#000000;"&gt;(deSystem, &lt;/span&gt;&lt;span style="color:#a31515;"&gt;"SAMAccountName=*"&lt;/span&gt;&lt;span style="color:#000000;"&gt;,&lt;/span&gt;&lt;/p&gt; &lt;p  style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; color:#a31515;"&gt;&lt;span style="color:#000000;"&gt;                &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;new&lt;/span&gt;&lt;span style="color:#000000;"&gt; &lt;/span&gt;&lt;span style="color:#0000ff;"&gt;string&lt;/span&gt;&lt;span style="color:#000000;"&gt;[] { &lt;/span&gt;"cn"&lt;span style="color:#000000;"&gt;, &lt;/span&gt;"mail"&lt;span style="color:#000000;"&gt;, &lt;/span&gt;"samAccountName"&lt;span style="color:#000000;"&gt;, &lt;/span&gt;"userAccountControl"&lt;span style="color:#000000;"&gt; }&lt;/span&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;                , &lt;span style="color:#2b91af;"&gt;SearchScope&lt;/span&gt;.Subtree);&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica; min-height: 12.0px"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;            &lt;span style="color:#0000ff;"&gt;return&lt;/span&gt; s.FindAll();&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;        }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;    }&lt;/p&gt; &lt;p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 10.0px Helvetica"&gt;}&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/4880364674450768067-5704834874242447704?l=praveen-rangarajan.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://praveen-rangarajan.blogspot.com/feeds/5704834874242447704/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=4880364674450768067&amp;postID=5704834874242447704' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/4880364674450768067/posts/default/5704834874242447704'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/4880364674450768067/posts/default/5704834874242447704'/><link rel='alternate' type='text/html' href='http://praveen-rangarajan.blogspot.com/2009/06/c-class-to-validate-user-credentials-on.html' title='C# class to validate User credentials on Active Directory (LDAP)'/><author><name>Praveen Rangarajan</name><uri>http://www.blogger.com/profile/10501638623047223714</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
