<div dir="ltr"><div>Hi,</div><div><br></div><div>I would like to link eprints system to Microsoft AD for authentication. I have referred to a few websites, and configured as advise, but it is not working, with no error message.</div><div><br></div><div>Following is a script for eprints-AD connection testing. I tried and it is working. I can get the result.</div><div><br></div><div><i><font color="#0000ff">******************************</font></i></div><div><i><font color="#0000ff">#!/usr/bin/perl -w</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># EPrints Services LDAP test script</font></i></div><div><i><font color="#0000ff">use Net::LDAP;</font></i></div><div><i><font color="#0000ff">use Net::LDAP::Constant;</font></i></div><div><i><font color="#0000ff">use strict;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">my ($user_sent) = $ARGV[0];</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Params</font></i></div><div><i><font color="#0000ff">my $ldap_host = &quot;ldaps://<a href="http://192.168.5.11"><font color="red"><b>MailScanner warning: numerical links are often malicious:</b></font> 192.168.5.11</a>&quot;; # Active Directory server on <a href="http://example.org">example.org</a> domain</font></i></div><div><i><font color="#0000ff">my $bind_dn = &quot;cn=Tarc Admin;cn=users,DC=tarc,DC=edu,DC=local&quot;; # one or more &#39;ou&#39;s may need to be set</font></i></div><div><i><font color="#0000ff">my $bind_pword = &quot;PASSWORD&quot;;</font></i></div><div><i><font color="#0000ff">my $base = &quot;DC=tarc,DC=edu,DC=local&quot;; # Likely the same domain as the AD server itself</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Connect to server</font></i></div><div><i><font color="#0000ff">my $ldap = Net::LDAP-&gt;new( $ldap_host, version =&gt; 3, port =&gt; 636 ); # Version and port may need changing</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">die &quot;LDAP connect error: $@\n&quot; unless defined $ldap;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Try to bind</font></i></div><div><i><font color="#0000ff">my $mesg;</font></i></div><div><i><font color="#0000ff">if( $bind_dn eq &quot;&quot; &amp;&amp; $bind_pword eq &quot;&quot; )</font></i></div><div><i><font color="#0000ff">{</font></i></div><div><i><font color="#0000ff">       $mesg = $ldap-&gt;bind; # anonymous bind</font></i></div><div><i><font color="#0000ff">}</font></i></div><div><i><font color="#0000ff">else</font></i></div><div><i><font color="#0000ff">{</font></i></div><div><i><font color="#0000ff">       $mesg = $ldap-&gt;bind( $bind_dn, password =&gt; $bind_pword );</font></i></div><div><i><font color="#0000ff">}</font></i></div><div><i><font color="#0000ff">die &quot;LDAP bind error: &quot; . $mesg-&gt;error() . &quot;\n&quot; if $mesg-&gt;code();</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Search for an account and get all available attributes (by not setting attrs)</font></i></div><div><i><font color="#0000ff">$mesg = $ldap-&gt;search (</font></i></div><div><i><font color="#0000ff">       base    =&gt; $base,</font></i></div><div><i><font color="#0000ff">       scope   =&gt; &quot;sub&quot;,</font></i></div><div><i><font color="#0000ff">       filter =&gt; &quot;sAMAccountName=$user_sent&quot;, # Most likely cn, uid or sAMAccountName</font></i></div><div><i><font color="#0000ff">       sizelimit =&gt; 1,</font></i></div><div><i><font color="#0000ff">);</font></i></div><div><i><font color="#0000ff">if( $mesg-&gt;code() )</font></i></div><div><i><font color="#0000ff">{</font></i></div><div><i><font color="#0000ff">       print STDERR &quot;LDAP search error: &quot;.$mesg-&gt;error.&quot;\n&quot;;</font></i></div><div><i><font color="#0000ff">       exit;</font></i></div><div><i><font color="#0000ff">}</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">my $entr = $mesg-&gt;pop_entry;</font></i></div><div><i><font color="#0000ff">unless( defined $entr )</font></i></div><div><i><font color="#0000ff">{</font></i></div><div><i><font color="#0000ff">       print STDERR &quot;LDAP no search results returned\n&quot;;</font></i></div><div><i><font color="#0000ff">       exit 1;</font></i></div><div><i><font color="#0000ff">}</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># See what attributes are set for this user</font></i></div><div><i><font color="#0000ff">print $entr-&gt;dump;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">$ldap-&gt;unbind;</font></i></div><div><i><font color="#0000ff">******************************</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div>I have configured the following authentication script (got from <a href="https://wiki.eprints.org/w/LDAP">https://wiki.eprints.org/w/LDAP</a>), it always show &quot;Incorrect username or password.&quot; although the AD login and password is correct.</div><div><br></div><div><i><font color="#0000ff">******************************</font></i></div><div><i><font color="#0000ff">=pod</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Please see <a href="http://wiki.eprints.org/w/User_login.pl">http://wiki.eprints.org/w/User_login.pl</a></font></i></div><div><i><font color="#0000ff"># $c-&gt;{check_user_password} = sub {</font></i></div><div><i><font color="#0000ff">#       my( $repo, $username, $password ) = @_;</font></i></div><div><i><font color="#0000ff">#</font></i></div><div><i><font color="#0000ff">#       ... check whether $password is ok</font></i></div><div><i><font color="#0000ff">#</font></i></div><div><i><font color="#0000ff">#       return $ok ? $username : undef;</font></i></div><div><i><font color="#0000ff">#};</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">$c-&gt;{check_user_password} = sub {</font></i></div><div><i><font color="#0000ff">  my( $session, $username, $password ) = @_;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  # Kerberos authentication for &quot;user&quot;, &quot;editor&quot; and &quot;admin&quot; types (roles)</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  use Net::LDAP; # IO::Socket::SSL also required</font></i></div><div><i><font color="#0000ff">  use Authen::Krb5::Simple;</font></i></div><div><i><font color="#0000ff">  use Authen::SASL;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  # LDAP tunables</font></i></div><div><i><font color="#0000ff">  my $ldap_host = &quot;ldaps://<a href="http://192.168.5.11"><font color="red"><b>MailScanner warning: numerical links are often malicious:</b></font> 192.168.5.11</a>&quot;;</font></i></div><div><i><font color="#0000ff">  my $base      = &quot;OU=TARUC,DC=tarc,DC=edu,DC=local&quot;;</font></i></div><div><i><font color="#0000ff">  my $proxy_user =&quot;ad_read&quot;;</font></i></div><div><i><font color="#0000ff">  my $dn        = &quot;CN=$proxy_user,$base&quot;;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  # Kerberos tunables</font></i></div><div><i><font color="#0000ff">  my $krb_host = &quot;192.168.5.11&quot;;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  my $krb         = Authen::Krb5::Simple-&gt;new(realm =&gt; $krb_host);</font></i></div><div><i><font color="#0000ff">  unless ( $krb )</font></i></div><div><i><font color="#0000ff">  {</font></i></div><div><i><font color="#0000ff">        print STDERR &quot;Kerberos error: $@\n&quot;;</font></i></div><div><i><font color="#0000ff">        return 0;</font></i></div><div><i><font color="#0000ff">  }</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  my $ldap      = Net::LDAP-&gt;new ( $ldap_host );</font></i></div><div><i><font color="#0000ff">  unless( $ldap )</font></i></div><div><i><font color="#0000ff">  {</font></i></div><div><i><font color="#0000ff">      print STDERR &quot;LDAP error: $@\n&quot;;</font></i></div><div><i><font color="#0000ff">      return 0;</font></i></div><div><i><font color="#0000ff">  }</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  my $sasl = Authen::SASL-&gt;new(</font></i></div><div><i><font color="#0000ff">         mechanism =&gt; &#39;GSSAPI&#39;,</font></i></div><div><i><font color="#0000ff">         callback =&gt; { user =&gt; &#39;ad_read&#39; }</font></i></div><div><i><font color="#0000ff">       ) or die &quot;$@&quot;;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  my $mesg = $ldap-&gt;bind(sasl =&gt; $sasl);</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  if( $mesg-&gt;code() )</font></i></div><div><i><font color="#0000ff">  {</font></i></div><div><i><font color="#0000ff">      print STDERR &quot;LDAP Bind error: &quot; . $mesg-&gt;error() . &quot;\n&quot;;</font></i></div><div><i><font color="#0000ff">      return 0;</font></i></div><div><i><font color="#0000ff">  }</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  # Distinguished name (and attribues needed later on) for this user</font></i></div><div><i><font color="#0000ff">  my $result = $ldap-&gt;search (</font></i></div><div><i><font color="#0000ff">      base    =&gt; &quot;$base&quot;,</font></i></div><div><i><font color="#0000ff">      filter  =&gt; &quot;(&amp;(sAMAccountName=$username))&quot;,</font></i></div><div><i><font color="#0000ff">      attrs   =&gt;  [&#39;1.1&#39;, &#39;uid&#39;, &#39;sn&#39;, &#39;givenname&#39;, &#39;mail&#39;, &#39;department&#39;, &#39;title&#39;],</font></i></div><div><i><font color="#0000ff">      sizelimit=&gt;1</font></i></div><div><i><font color="#0000ff">  );</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  my $entr = $result-&gt;pop_entry;</font></i></div><div><i><font color="#0000ff">  unless( defined $entr )</font></i></div><div><i><font color="#0000ff">  {</font></i></div><div><i><font color="#0000ff">      # Allow local EPrints authentication for admins (accounts not found in LDAP)</font></i></div><div><i><font color="#0000ff">      my $user = EPrints::DataObj::User::user_with_username( $session, $username );</font></i></div><div><i><font color="#0000ff">      return 0 unless $user;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">      my $user_type = $user-&gt;get_type;</font></i></div><div><i><font color="#0000ff">      if( $user_type eq &quot;admin&quot; )</font></i></div><div><i><font color="#0000ff">      {</font></i></div><div><i><font color="#0000ff">          # internal authentication for &quot;admin&quot; type</font></i></div><div><i><font color="#0000ff">          return $session-&gt;get_database-&gt;valid_login( $username, $password );</font></i></div><div><i><font color="#0000ff">      }</font></i></div><div><i><font color="#0000ff">      return 0;</font></i></div><div><i><font color="#0000ff">  }</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  # Check password</font></i></div><div><i><font color="#0000ff">  if( !$krb-&gt;authenticate( $username, $password ) )</font></i></div><div><i><font color="#0000ff">  {</font></i></div><div><i><font color="#0000ff">        print STDERR &quot;$username authentication failed: &quot;, $krb-&gt;errstr(), &quot;\n&quot;;</font></i></div><div><i><font color="#0000ff">      return 0;</font></i></div><div><i><font color="#0000ff">  }</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  # Does account already exist?</font></i></div><div><i><font color="#0000ff">  my $user = EPrints::DataObj::User::user_with_username( $session, $username );</font></i></div><div><i><font color="#0000ff">  if( !defined $user )</font></i></div><div><i><font color="#0000ff">  {</font></i></div><div><i><font color="#0000ff">      # New account</font></i></div><div><i><font color="#0000ff">      $user = EPrints::DataObj::User::create( $session, &quot;user&quot; );</font></i></div><div><i><font color="#0000ff">      $user-&gt;set_value( &quot;username&quot;, $username );</font></i></div><div><i><font color="#0000ff">  }</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  # Set metadata</font></i></div><div><i><font color="#0000ff">  my $name = {};</font></i></div><div><i><font color="#0000ff">  $name-&gt;{family} = $entr-&gt;get_value( &quot;sn&quot; );</font></i></div><div><i><font color="#0000ff">  $name-&gt;{given} = $entr-&gt;get_value( &quot;givenName&quot; );</font></i></div><div><i><font color="#0000ff">  $name-&gt;{honourific} = $entr-&gt;get_value( &quot;title&quot;);</font></i></div><div><i><font color="#0000ff">  $user-&gt;set_value( &quot;name&quot;, $name );</font></i></div><div><i><font color="#0000ff">  $user-&gt;set_value( &quot;username&quot;, $username );</font></i></div><div><i><font color="#0000ff">  $user-&gt;set_value( &quot;email&quot;, $entr-&gt;get_value( &quot;mail&quot; ) );</font></i></div><div><i><font color="#0000ff">  $user-&gt;set_value( &quot;dept&quot;, $entr-&gt;get_value(&quot;department&quot;)  );</font></i></div><div><i><font color="#0000ff">  $user-&gt;commit();</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  $ldap-&gt;unbind if $ldap;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">  return 1;</font></i></div><div><i><font color="#0000ff"> }</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">=cut</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Maximum time (in seconds) before a user must log in again</font></i></div><div><i><font color="#0000ff"># $c-&gt;{user_session_timeout} = undef;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Time (in seconds) to allow between user actions before logging them out</font></i></div><div><i><font color="#0000ff"># $c-&gt;{user_inactivity_timeout} = 86400 * 7;</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff"># Set the cookie expiry time</font></i></div><div><i><font color="#0000ff"># $c-&gt;{user_cookie_timeout} = undef; # e.g. &quot;+3d&quot; for 3 days</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div><i><font color="#0000ff">******************************</font></i></div><div><i><font color="#0000ff"><br></font></i></div><div>    Please advise where went wrong. FYI, I do not familiar with Perl.</div><div><br></div><div><div class="gmail_signature"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><span style="font-family:tahoma,sans-serif">    Thank you very much for your help.</span><br></div><div><font face="tahoma, sans-serif"><br></font></div><div><font face="tahoma, sans-serif"><br></font></div><div><font face="tahoma, sans-serif">Regards,</font></div><div><font face="tahoma, sans-serif">Lee Yeat Yee</font></div><div><span style="font-family:tahoma,sans-serif;font-size:12.8px">CIT Centre</span><br></div><div><font face="tahoma, sans-serif">Tunku Abdul Rahman University College</font></div><div><font face="tahoma, sans-serif">Tel: 03-41450123 ext 3511</font></div><div><font face="tahoma, sans-serif">Fax: 03-41438980</font></div><div><br></div></div></div></div></div></div>
</div>

<br>
<div style="font-family:Arial,Helvetica,sans-serif;font-size:1.3em"><hr></div><span style="font-family:Calibri;font-size:1.3em;vertical-align:baseline;white-space:pre-wrap"><font size="1">The content in this e-mail and any attachments are intended solely for the addressee or addressees and any disclosure of such contents to other parties is unauthorized, not condoned by the TAR UC and may be unlawful. If you are not the intended recipient, please delete the message and any attachments and notify the sender. No undertaking, guarantee or other obligation contained in this e-mail shall be binding upon the TAR UC unless confirmed in writing under our letterhead. Any views and or representations expressed by any individual within this e-mail shall not be deemed as reflecting the stand of the TAR UC. All liabilities arising as a result of, or consequential upon any cyber security breach, including but not limited to computer viruses, is excluded to the fullest extent permissible by law.</font></span><div><div style="text-align:center"><br><hr><img src="http://www.tarc.edu.my/images/50th_taruc.jpg"></div></div>