Utilización de Active Directory para autenticar usuarios en un sitio Intranet

Tengo una 'intranet' sitio que he construido, que tiene un sistema de inicio de sesión de su propia (los usuarios se registran como nuevos usuarios, y utilizar el nombre de usuario / contraseña en él para iniciar sesión en el sitio). Sin embargo, ahora quiero ampliarlo, y que el sitio de la intranet utilizar el ActiveDirectory existente para la autenticación. Esto es lo que estoy buscando, en el futuro -

Cuando un usuario accede a este sitio de intranet (http://intranetsite/mySite), las credenciales de dominio del usuario se validan contra el directorio activo, y si las credenciales del usuario coinciden con AD, el usuario se presenta entonces la página principal del sitio de intranet.

Soy nuevo en AD, y no sé cómo ir sobre esta configuración. Mi sitio de intranet está construido alrededor de PHP y utiliza Apache en el servidor de aplicaciones; el AD está en un servidor IIS diferente.

¿Qué información necesito, y dónde puedo poner esta información (en mi sitio? htaccess? en cualquier otro lugar?) para que pueda utilizar la autenticación de AD? ¿Es sólo 'configuración' suficiente, o necesito escribir código PHP explícito para esta autenticación?

Cualquier punteros son muy apreciados.

Si sólo busca la autenticación y nada más, puede que le basten unas pocas líneas de código.

En primer lugar, asegúrese de que tiene ldap enabled en su php.

Aquí's pura implementación php:
(tenga en cuenta que al hacerlo de esta manera debe asegurarse de que TIENE un nombre de usuario y una contraseña de un usuario - anonymous binding casi siempre devolverá true para 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, 'username@domain.com', 'SomeSecret')) {
    // Invalid credentials! Handle error appropriately
}
// Bind was successful - continue

Si esperas hacer cosas más divertidas con Active Directory, como obtener información sobre el usuario que ha iniciado sesión, te recomiendo encarecidamente que utilices un framework que haga el trabajo pesado por ti. Como ya he mencionado, adLDAP es uno bueno y si ejecutas PHP 5.4 me atrevo a recomendar la librería AD-X que desarrollo activamente (puedes instalarla a través de Composer).

Con la librería AD-X, puedes verificar las credenciales de un usuario usando este código:

try {
    $link = new ADX\Core\Link('domain.com'); // Establish connection to AD
    $link->bind('username@domain.com', '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

Siéntase libre de elegir lo que más le convenga. Sin embargo, si usted espera hacer algo más que autenticar le sugiero encarecidamente que utilice una biblioteca para el trabajo ldap - que le ahorrará mucho tiempo y posiblemente frustración cuando las cosas no funcionan como usted esperaría.

Además, si tienes dudas sobre qué información puedes/debes usar para conectarte y autenticarte, no dudes en consultar mi respuesta anterior sobre este tema.

Comentarios (3)

Esto es lo que yo uso:

<?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);
}
?>
Login

* { font-family: Calibri, Tahoma, Arial, sans-serif; }
.errmsg { color: red; }
#loginbox { font-size: 12px; }


<div align="center"><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">

        <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" />

    </div>
</div>
</div>
Comentarios (0)