2013-07-21 5 views
25

Ich habe ein ‚Intranet‘ Website, die ich gebaut habe, die ein Login-System seiner eigenen (Benutzer als neuer Benutzer registrieren hat, und verwenden Sie den Benutzernamen/Passwort darauf das einzuloggen Seite? ˅). Jetzt möchte ich es jedoch erweitern und die Intranet-Site verwenden das vorhandene ActiveDirectory für die Authentifizierung. Das ist, was ich suche, vorwärts -Active Directory-Benutzer auf Intranet-Site zu authentifizieren

Wenn ein Benutzer auf diese Intranetsite (http://intranetsite/mySite) zugreift, werden die Domänenanmeldeinformationen des Benutzers für das aktive Verzeichnis überprüft und wenn die Benutzeranmeldeinformationen mit AD übereinstimmen, wird der Benutzer angezeigt die Hauptseite der Intranet-Site.

Ich bin neu in AD, und weiß nicht, wie zu dieser Konfiguration zu gehen. Meine Intranet-Site ist um PHP herum aufgebaut und verwendet Apache auf dem Anwendungsserver; Die AD befindet sich auf einem anderen IIS-Server.

Welche Informationen benötige ich, und wo stelle ich diese Informationen (in meiner Website? .htaccess? Anderswo?), So dass ich die AD-Authentifizierung verwenden kann? Ist nur "Konfiguration" genug, oder muss ich expliziten PHP-Code für diese Authentifizierung schreiben?

sind Alle Zeiger sehr geschätzt.

+0

[adLDAP] (http://adldap.sourceforge.net) Bibliothek könnte für diese sehr hilfreich sein. –

+0

Sie werden die LDAP-Bibliothek für PHP verwenden und ein Konto von Ihrem AD-Administrator anfordern, das nur Lesezugriff auf den Katalog hat. – DevlshOne

+0

Lassen Sie mich wissen, wenn Sie weiter kommen und ich werde Ihnen gerne zeigen, was ich eingerichtet habe. – DevlshOne

Antwort

19

Wenn Sie nur für die Authentifizierung und nichts anderes suchen, können Sie mit nur wenigen Zeilen Code weg.

Zuerst stellen Sie sicher, ldap enabled in Ihrer PHP haben.

Hier reine PHP-Implementierung:
(beachten Sie, dass, wenn es auf diese Weise tun, sollten Sie sicherstellen, dass Sie einen Benutzername tun und ein Passwort von einem Benutzer - anonyme Bindung wird fast immer true zurück für AD)

$link = ldap_connect('domain.com'); // Your domain or domain server 

if(! $link) { 
    // Could not connect to server - handle error appropriately 
} 

ldap_set_option($link, LDAP_OPT_PROTOCOL_VERSION, 3); // Recommended for AD 

// Now try to authenticate with credentials provided by user 
if (! ldap_bind($link, '[email protected]', 'SomeSecret')) { 
    // Invalid credentials! Handle error appropriately 
} 
// Bind was successful - continue 

Wenn Sie erwarten, mehr Spaß mit Active Directory zu tun, wie das Abrufen einiger Informationen über den aktuell angemeldeten Benutzer, empfehle ich dringend, ein Framework zu verwenden, um das schwere Heben für Sie durchzuführen. Wie bereits erwähnt, ist adLDAP ein guter und wenn Sie PHP 5.4 verwenden, würde ich Ihnen empfehlen, die AD-X Bibliothek zu empfehlen, die ich aktiv entwickle (Sie können sie über Composer installieren).

Mit dem AD-X-Bibliothek, können Sie ein Benutzerberechtigungsnachweise mit diesem Code überprüfen:

try { 
    $link = new ADX\Core\Link('domain.com'); // Establish connection to AD 
    $link->bind('[email protected]', 'SomeSecret'); // Authenticate user 
} 
catch (ADX\Core\ServerUnreachableException $e) { 
    // Unable to connect to server, handle error 
} 
catch (ADX\Core\InvalidCredentialsException $e) { 
    // Invalid credentials supplied 
} 
catch (Exception $e) { 
    // Something else happened, check the exception and handle appropriately 
} 

// Successfully authenticated if no exception has been thrown 

Fühlen Sie sich frei zu entscheiden, welche Ihnen am besten passt. Wenn Sie jedoch mehr als nur Authentifizierung erwarten, empfehle ich Ihnen dringend, eine Bibliothek für die ldap-Arbeit zu verwenden - es wird Ihnen viel Zeit und möglicherweise Frustration ersparen, wenn die Dinge nicht so funktionieren, wie Sie es erwarten würden.

Auch im Zweifelsfall, welche Informationen Sie verwenden können/sollten, um sich zu verbinden und zu authentifizieren fühlen Sie sich frei, um meine previous answer zu diesem Thema zu überprüfen. Hier

+0

Während Sie sicherlich demonstrieren, wie Sie AD mit adLDAP verbinden und binden, enthält dieser Code so viel fortgeschrittenen Code, dass er Teile des Codes, die der Fragesteller am meisten interessiert, effektiv verbirgt. – DevlshOne

+5

Mein Beispiel zeigt nichts mit adLDAP. Welchen Teil davon halten Sie für fortgeschritten und wie würden Sie empfehlen, ihn zu aktualisieren? Danke für die Erklärung. –

+2

Wie kann ich mich automatisch anmelden? Ihre Methode erfordert Benutzername und Passwort. Wie kann ich diese bekommen? – Somnium

6

ist das, was ich benutze:

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 'On'); 

define('DOMAIN_FQDN', 'mycompany.intra'); 
define('LDAP_SERVER', '192.168.0.1'); 

if (isset($_POST['submit'])) 
{ 
    $user = strip_tags($_POST['username']) .'@'. DOMAIN_FQDN; 
    $pass = stripslashes($_POST['password']); 

    $conn = ldap_connect("ldap://". LDAP_SERVER ."/"); 

    if (!$conn) 
     $err = 'Could not connect to LDAP server'; 

    else 
    { 
     define('LDAP_OPT_DIAGNOSTIC_MESSAGE', 0x0032); 

     ldap_set_option($conn, LDAP_OPT_PROTOCOL_VERSION, 3); 
     ldap_set_option($conn, LDAP_OPT_REFERRALS, 0); 

     $bind = @ldap_bind($conn, $user, $pass); 

     ldap_get_option($conn, LDAP_OPT_DIAGNOSTIC_MESSAGE, $extended_error); 

     if (!empty($extended_error)) 
     { 
      $errno = explode(',', $extended_error); 
      $errno = $errno[2]; 
      $errno = explode(' ', $errno); 
      $errno = $errno[2]; 
      $errno = intval($errno); 

      if ($errno == 532) 
       $err = 'Unable to login: Password expired'; 
     } 

     elseif ($bind) 
     { 
      $base_dn = array("CN=Users,DC=". join(',DC=', explode('.', DOMAIN_FQDN)), 
       "OU=Users,OU=People,DC=". join(',DC=', explode('.', DOMAIN_FQDN))); 

      $result = ldap_search(array($conn,$conn), $base_dn, "(cn=*)"); 

      if (!count($result)) 
       $err = 'Unable to login: '. ldap_error($conn); 

      else 
      { 
       foreach ($result as $res) 
       { 
        $info = ldap_get_entries($conn, $res); 

        for ($i = 0; $i < $info['count']; $i++) 
        { 
         if (isset($info[$i]['userprincipalname']) AND strtolower($info[$i]['userprincipalname'][0]) == strtolower($user)) 
         { 
          session_start(); 

          $username = explode('@', $user); 
          $_SESSION['foo'] = 'bar'; 

          // set session variables... 

          break; 
         } 
        } 
       } 
      } 
     } 
    } 

    // session OK, redirect to home page 
    if (isset($_SESSION['foo'])) 
    { 
     header('Location: /'); 
     exit(); 
    } 

    elseif (!isset($err)) $err = 'Unable to login: '. ldap_error($conn); 

    ldap_close($conn); 
} 
?> 
<!DOCTYPE html><head><title>Login</title></head> 
<style> 
* { font-family: Calibri, Tahoma, Arial, sans-serif; } 
.errmsg { color: red; } 
#loginbox { font-size: 12px; } 
</style> 
<body> 
<div align="center"><img id="imghdr" src="/img/logo.png" height="100" /><br><br><h2>Login</h2><br><br> 

<div style="margin:10px 0;"></div> 
<div title="Login" style="width:400px" id="loginbox"> 
    <div style="padding:10px 0 10px 60px"> 
    <form action="/login.php" id="login" method="post"> 
     <table><?php if (isset($err)) echo '<tr><td colspan="2" class="errmsg">'. $err .'</td></tr>'; ?> 
      <tr> 
       <td>Login:</td> 
       <td><input type="text" name="username" style="border: 1px solid #ccc;" autocomplete="off"/></td> 
      </tr> 
      <tr> 
       <td>Password:</td> 
       <td><input type="password" name="password" style="border: 1px solid #ccc;" autocomplete="off"/></td> 
      </tr> 
     </table> 
     <input class="button" type="submit" name="submit" value="Login" /> 
    </form> 
    </div> 
</div> 
</div> 
</body></html> 
Verwandte Themen