web-dev-qa-db-fra.com

Utilisation d'Active Directory pour authentifier les utilisateurs sur le site intranet

J'ai un site "intranet" que j'ai construit, qui possède son propre système de connexion (les utilisateurs s'enregistrent en tant que nouveaux utilisateurs et utilisent le nom d'utilisateur/mot de passe sur celui-ci pour se connecter au site). Cependant, maintenant je veux l'étendre et faire en sorte que le site intranet utilise ActiveDirectory existant pour l'authentification. C'est ce que je recherche pour l'avenir -

Lorsqu'un utilisateur accède à ce site intranet (http://intranetsite/mySite), les informations d'identification de domaine de l'utilisateur sont validées par rapport à Active Directory, et si les informations d'identification de l'utilisateur correspondent à AD, l'utilisateur se voit alors présenter la page principale du site intranet.

Je suis nouveau sur AD et je ne sais pas comment procéder pour cette configuration. Mon site intranet est construit autour de PHP et utilise Apache sur le serveur d'applications; l'AD est sur un autre serveur IIS.

De quelles informations ai-je besoin et où dois-je placer ces informations (dans mon site? Htaccess? N'importe où ailleurs?) Pour pouvoir utiliser l'authentification AD? La 'configuration' suffit-elle ou dois-je écrire un code explicite PHP pour cette authentification?

Tous les pointeurs sont très appréciés.

27
kallakafar

Si vous recherchez uniquement l'authentification et rien d'autre, vous pouvez vous en tirer avec seulement quelques lignes de code.

Tout d'abord, assurez-vous d'avoir ldap enabled dans votre php.

Voici une implémentation php pure:
(notez qu'en procédant de cette façon, vous devez vous assurer D'AVOIR un nom d'utilisateur et un mot de passe d'un utilisateur - la liaison anonyme renverra presque toujours true pour 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

Si vous vous attendez à faire plus de choses amusantes avec Active Directory comme extraire des informations sur l'utilisateur actuellement connecté, je recommande fortement d'utiliser un framework pour faire le gros du travail pour vous. Comme déjà mentionné, adLDAP est bon et si vous exécutez PHP 5.4 j'ose recommander la bibliothèque AD-X que je développe activement (vous pouvez l'installer via Composer ).

Avec la bibliothèque AD-X, vous pouvez vérifier les informations d'identification d'un utilisateur à l'aide de ce code:

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

N'hésitez pas à choisir celle qui vous convient le mieux. Cependant, si vous vous attendez à faire plus qu'authentifier, je vous suggère fortement d'utiliser une bibliothèque pour le travail LDAP - cela vous fera gagner beaucoup de temps et peut-être de la frustration lorsque les choses ne fonctionnent pas comme vous vous y attendez.

De plus, en cas de doute sur les informations que vous pouvez/devez utiliser pour vous connecter et vous authentifier, n'hésitez pas à consulter mon réponse précédente sur ce sujet.

20
Robert Rossmann

Voici ce que j'utilise:

<?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>
6
jrm