Verwenden von Active Directory zum Authentifizieren von Benutzern auf einer Intranetsite

Lesezeit: 6 Minuten

Ich habe eine ‘Intranet’-Seite, die ich gebaut habe, die ein eigenes Anmeldesystem hat (Benutzer registrieren sich als neue Benutzer und verwenden den Benutzernamen/das Passwort darauf, um sich bei der Seite anzumelden). Jetzt möchte ich es jedoch erweitern und die Intranetsite dazu bringen, das vorhandene ActiveDirectory für die Authentifizierung zu verwenden. Das ist es, wonach ich suche, vorwärts gehen –

Wenn ein Benutzer auf diese Intranetsite zugreift (http://intranetsite/mySite), werden die Domänenanmeldeinformationen des Benutzers anhand des Active Directory validiert, und wenn die Anmeldeinformationen des Benutzers mit AD übereinstimmen, wird dem Benutzer die Hauptseite der Intranetsite angezeigt.

Ich bin neu bei AD und weiß nicht, wie ich diese Konfiguration angehen soll. Meine Intranet-Site basiert auf PHP und verwendet Apache auf dem Anwendungsserver. das AD befindet sich auf einem anderen IIS-Server.

Welche Informationen benötige ich und wo gebe ich diese Informationen ein (auf meiner Website? htaccess? irgendwo anders?), damit ich die AD-Authentifizierung verwenden kann? Reicht nur „Konfiguration“ oder muss ich expliziten PHP-Code für diese Authentifizierung schreiben?

Alle Hinweise werden sehr geschätzt.

  • adLDAP Die Bibliothek kann dabei sehr hilfreich sein.

    – dev-null-Bewohner

    21. Juli 2013 um 15:01 Uhr

  • Sie möchten die LDAP-Bibliothek für PHP verwenden und von Ihrem AD-Administrator ein Konto anfordern, das nur Lesezugriff auf den Katalog hat.

    – DevlshOne

    21. Juli 2013 um 15:01 Uhr

  • Lassen Sie es mich wissen, wenn Sie weiter sind, und ich zeige Ihnen gerne, was ich eingerichtet habe.

    – DevlshOne

    21. Juli 2013 um 15:02 Uhr

  • Sie erhalten einige gute Informationen von [this previous SO Question][1] [1]: stackoverflow.com/questions/3236007/…

    – DevlshOne

    21. Juli 2013 um 15:04 Uhr

  • @DevlshOne – danke für den Hinweis auf die SO-Frage. Ich bin ziemlich neu in AD. Kann ich wissen, welche Informationen ich vom AD-Administrator erhalten muss?

    – kallakafar

    21. Juli 2013 um 15:11 Uhr

Benutzer-Avatar
Robert Roßmann

Wenn Sie nur nach Authentifizierung und sonst nichts suchen, kommen Sie möglicherweise mit nur wenigen Codezeilen davon.

Stellen Sie zunächst sicher, dass Sie dies haben LDAP aktiviert in deiner php.

Hier ist die reine PHP-Implementierung:
(Beachten Sie, dass Sie auf diese Weise sicherstellen sollten, dass Sie einen Benutzernamen und ein Passwort von einem Benutzer HABEN – anonyme Bindung wird für AD fast immer wahr zurückgeben)

$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, mit Active Directory mehr Spaß zu haben, wie z. B. das Abrufen einiger Informationen über den aktuell angemeldeten Benutzer, empfehle ich dringend, ein Framework zu verwenden, das die schwere Arbeit für Sie erledigt. Wie bereits erwähnt, ist adLDAP ein gutes und wenn Sie PHP 5.4 verwenden, wage ich es zu empfehlen AD-X Bibliothek, die ich aktiv entwickle (Sie können sie über Composer installieren).

Mit der AD-X-Bibliothek können Sie die Anmeldeinformationen eines Benutzers 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

Wählen Sie frei aus, was am besten zu Ihnen passt. Wenn Sie jedoch erwarten, mehr zu tun als sich zu authentifizieren, 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.

Wenn Sie Zweifel haben, welche Informationen Sie verwenden können / sollten, um sich zu verbinden und zu authentifizieren, können Sie auch meine vorherige Antwort zu diesem Thema überprüfen.

  • Während Sie sicherlich demonstrieren, wie man sich mit AD mit adLDAP verbindet und an AD bindet, enthält dieser Code so viel fortgeschrittenen Code, dass er effektiv Teile des Codes verbirgt, an denen der Fragesteller am meisten interessiert ist.

    – DevlshOne

    21. Juli 2013 um 21:53 Uhr

  • Mein Beispiel demonstriert 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.

    – Robert Roßmann

    22. Juli 2013 um 0:17 Uhr

  • Wie kann ich Benutzer automatisch anmelden? Ihre Methode erfordert einen Benutzernamen und ein Passwort. Wie kann ich die bekommen?

    – Somnium

    17. März 2017 um 9:21 Uhr

Hier ist, was ich verwende:

<?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 ."https://stackoverflow.com/");

    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="https://stackoverflow.com/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>

1158540cookie-checkVerwenden von Active Directory zum Authentifizieren von Benutzern auf einer Intranetsite

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy