Trace: » Authentification Automatique (SSO - Single Sign On)

Authentification Automatique (SSO - Single Sign On)

L'authentification automatique permet aux utilisateurs de GLPI de pouvoir s'identifier automatiquement dans l'application sans avoir à resaisir leur nom d'utilisateur ainsi que leur mot de passe. Ce sont ceux de la session ouverte sur le système qui sont utilisés.

Deux modes opératoires :

Pour les versions de GLPI supérieures ou égales à 0.71

Modification Serveur WEB

Apache2

Le module mod_auth_sspi.so ne fonctionne que sous Windows

Tout d'abord il nous faut activer le module mod_auth_sspi.so qui est inclus dans la distribution. Il suffit de dé-commenter la ligne : LoadModule sspi_auth_module modules/mod_auth_sspi.so dans le fichier de configuration d'Apache (apache/conf/httpd.conf)

Si cette ligne n'apparaît pas, il faut la rajouter à la fin de la liste des module à charger (car l'ordre est important) Il faut aussi s'assurer que le module mod_auth_sspi.so se trouve bien dans le dossier des modules (/apache2.2.8/modules)

ATTENTION : le module mod_auth_sspi.so est différent selon la version d'Apache :

  • Pour Apache v.2.2.8, il faut mod_auth_sspi.so en v.1.0.3-2.0.2
  • Pour Apache v.2.2.11, il faut mod_auth_sspi.so en v.1.0.4-2.2.2

Les differentes version sont disponible ici.

Il faut également ajouter à ce même fichier (à la fin par exemple) :

 #glpi configuration
 <Directory "C:/OCSinventoryNG/xampp/htdocs/glpi>
  Options None
  Order allow,deny
  Allow from all
 
  AuthName "Accès restreint"
  AuthType SSPI
  SSPIAuth On
  SSPIAuthoritative On
  SSPIOfferBasic On
  require valid-user
  </Directory>

En adaptant le chemin de votre répertoire GLPI selon votre configuration.

Un bug connu à l'utilisation conjointe d'Internet Explorer / mod_auth_sspi/1.04 et de l'Ajax dans GLPI peut apparaitre (typiquement le contenu des onglets n'apparaissent plus). Dans ce cas il est nécessaire de rajouter la ligne : “SSPIPerRequestAuth On” à la configuration ci-dessus.

Apache

Si vous utilisez Apache, utilisez le mod_auth_ntlm. Il suffit de décommenter la ligne qui contient mod_auth_ntlm dans le fichier de configuration d'Apache apacheconfhttpd.conf.

Il se peut également qu'il faille ajouter du code à la fin du fichier de conf de Apache comme pour Apache 2 mais n'ayant pas de quoi tester, je ne peux le confirmer. Encore une fois à vous de tester… ;-)

IIS

Sous IIS ça doit marcher sans modification. Si quelqu'un pouvait le confirmer ça serait top :)

IIS 6 : Il faut désactiver l'identification anonyme et activer l'authentification Windows :

Propriétés du site Web → Onglet Sécurité du répertoire. Dans la partie Authentification et contrôle d'accès, cliquer sur le bouton 'Modifier'.

  • Décocher : Activer la connexion anonyme.
  • Cocher : Authentification Windows intégrée.

Configuration GLPI

Toute la configuration de l'authentification automatique se fait sous le menu Configuration - Authentification - Autres.

Il suffit d'entrer la bonne valeur dans la zone “Champ de stockage du login dans la variable _SERVER”.

Si vous ne savez pas quelle valeur entrer, vous pouvez créer un fichier “test.php” avec comme contenu ce code:

<?php
echo $_SERVER["REMOTE_USER"];
?>

Remplacer “REMOTE_USER” par une des valeurs de GLPI pour savoir laquelle renvoie votre Login. “REMOTE_USER” est la bonne valeur lorsque l'on s'identifie sur un Active Directory.

Si vous avez une page blanche, c'est que l'identification sur le serveur IIS est en mode anonyme. Il faut désactiver l'identification anonyme et activer l'authentification Windows (voir plus haut).

Le service “Affichage des messages”, activé ou non, n'est pour rien dans le résultat de la page blanche.


Du côté des navigateurs

Internet Explorer

Il faut vérifier que “Activer l'authentification intégrée de Windows” dans les options avancées d'Internet Explorer soit bien coché.

Il faut penser à rajouter l'url de GLPI dans la liste des sites de l'Intranet local sous l'onglet Sécurité dans les options d'Internet Explorer.

Bon à savoir : https + auth auto + xampp + ie7 = problèmes de connexion

solution: dans xampp/apache/conf/extra/httpd-ssl.conf, enlever le nokeepalive dans

<IfModule setenvif_module>

      BrowserMatch ".*MSIE.*" 
               ssl-unclean-shutdown 
               downgrade-1.0 force-response-1.0
  </IfModule>
FireFox

Taper “about:config” dans la barre d'adresse et valider. Modifier la valeur network.negotiate-auth.delegation.uris et lui rajouter le nom de domaine pour lequel on veut activer l'envoi automatique d'information. Ex:.glpi-project.org Remarque : si cela ne fonctionne pas, il faut modifier la valeur network.automatic-ntlm-auth.trusted-uris et Ajouter la chaine https://,http://.

A noter que cette option fonctionne pour tous les navigateurs basés sur Mozilla dans leur version récente : Mozilla, Netscape ou Epiphany.

Autre possibilité (testé sous FF 3.0.8) Taper “about:config” dans la barre d'adresse et valider. Modifier la valeur network.automatic-ntlm-auth.trusted-uris et lui indiquer les serveurs pour lesquels l'authentification auto doit être activée. Exemple : http://serv-glpi,http://test-glpi

Opera

Aucune solution d'authentification auto trouvée pour le moment

Safari

Aucune solution d'authentification auto trouvée pour le moment

Voilà vous avez maintenant toutes les cartes pour réaliser l'authentification automatique sur la 0.71.

Sous Windows Vista ou Seven

Le navigateur renvoie une erreur Internal Server Error.

Il faut ajouter une valeur dans la base de registre :

HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/Control/Lsa

Ajouter une nouvelle valeur DWORD:

La nommer « LmCompatibilityLevel » la mettre à « 1 » Merci glpigreg ;-)

Pour les versions de GLPI inférieures à 0.71

Article rédigé par Garga et mis à jour par Ro9eR

Cette page s'adresse aux utilisateurs utilisants les versions 0.68 et 0.70 de GLPI (inférieures à 0.71).

Le but de ce tip est de permettre aux utilisateurs de GLPI de pouvoir s'identifier dans l'application sans avoir à retaper leur nom d'utilisateur ainsi que leur mot de passe.

Cette astuce fonctionne avec Apache 2 et GLPI configuré avec une authentification externe avec Active Directory. L'utilisateur doit utiliser Internet Explorer.

La configuration sur laquelle a été validé cette manipulation est celle-ci :

- GLPI : 0.68.2 et AD sur W2k3 - Internet Explorer 6sp2 / - XAMPP version 1.5.1 / Apache 2.2.0 / MySql : 5.0.18 / PHP 5.1.1

Par conséquent si vous testez sur une autre configuration et que cela fonctionne n'hésitez pas à compléter. Il semblerai que ce patch fonctionne également avec Apache et IIS mais là encore je n'ai pas pu tester donc libre à vous de le faire et de compléter cet article.

Enfin dernière précision, les modifications ainsi que le code fourni dans cet article ne sont pas de moi à part l'adaptation de celui-ci pour la version 0.68.2 de GLPI donc un grand merci à OUKIBILL, tsmr, blink38, VANB etc… :-P

Mise en place

Modification dans le serveur Web

Apache 2:

Tout d'abord il nous faut activer le module mod_auth_sspi.so qui est inclus dans la distribution. Il suffit de décommenter la ligne : LoadModule sspi_auth_module modules/mod_auth_sspi.so dans le fichier de configuration d'Apache (apacheconfhttpd.conf)

Il faut également ajouter (à la fin du même fichier par exemple) :

 #glpi configuration
 <Directory "C:/OCSinventoryNG/xampp/htdocs/glpi>
  Options None
  Order allow,deny
  Allow from all
 
  AuthName "Accès restreint"
  AuthType SSPI
  SSPIAuth On
  SSPIAuthoritative On
  SSPIOfferBasic On
  require valid-user
  </Directory>

en adaptant le chemin de votre répertoire GLPI selon votre configuration.

:!:N'oublier pas de redemarrer le service Apache avec toutes modifications

Apache

Si vous utilisez Apache, utilisez le mod_auth_ntlm. Il suffit de décommenter la ligne qui contient mod_auth_ntlm dans le fichier de configuration d'Apache apacheconfhttpd.conf.

Il se peut également qu'il faille ajouter du code à la fin du fichier de conf de Apache comme pour Apache 2 mais n'ayant pas de quoi tester, je ne peux le confirmer. Encore une fois à vous de tester… ;-)

:!:N'oublier pas de redemarrer le service Apache avec toutes modifications

IIS

Si vous utilisez IIS, ça marchera tout seul. Si quelqu'un peut le tester et le confirmer ici, ça serait top.

Modification dans Glpi

Il faut commencer par copier les fichiers index.php et login.php pour sauvegarder les fichiers d'origine de Glpi, pour pouvoir revenir en arrière en cas de problème. Personellement je leur rajoute l'extension .orig pour plus de clarté. Ensuite il faut insérer ou modifier du code dans index.php et login.php.

0.68
index.php

:fr:pbauthoauto.png

Chercher:

// Using CAS server
	  if (!empty($cfg_glpi["cas_host"])&&!isset($_GET["noCAS"])) {
	    glpi_header("login.php");
	  }

Ajouter aprés:

if ( isset($_SERVER["REMOTE_USER"])){          
      $pos = stripos($_SERVER["REMOTE_USER"],"");
            if (! $pos === false ){
        $login = substr($_SERVER["REMOTE_USER"], $pos + 1);
        if ( $login != '' ){
          header("Location: login.php?login_name=".$login);
           }
        }
    }
login.php

:fr:pbauthoauto.png Chercher:

$_POST['login_password']=unclean_cross_side_scripting_deep($_POST['login_password']);

Ajouter aprés:

$http_auth = false;
if ( isset($_SERVER["REMOTE_USER"])){
  $pos = stripos($_SERVER["REMOTE_USER"],"");
  if (! $pos === false ){
    $login = substr($_SERVER["REMOTE_USER"], $pos + 1);
    if ( $login != '' ){
      $_POST['login_name'] = $login;
      $http_auth = true;
    }
  }
}

Chercher:

if (empty($_POST['login_name'])||empty($_POST['login_password'])){

Remplacer par:

if ((empty($_POST['login_name'])||empty($_POST['login_password'])) && !$http_auth){

Chercher:

	      // With UTF8 decoding
	      //if (!$auth_succeded) $auth_succeded = $identificat->connection_db(utf8_decode($_POST['login_name']),utf8_decode($_POST['login_password']));
	      //if ($auth_succeded) $user_present = $identificat->user->getFromDBbyName(utf8_decode($_POST['login_name']));

Ajouter aprés:

    }
    // try HTTP authentication
    if ($http_auth){
      
      $found_dn=false;
      $auth_succeded=0;
      $found_dn=$identificat->ldap_get_dn_active_directory($cfg_glpi["ldap_host"],$cfg_glpi["ldap_basedn"],$_POST['login_name'],$cfg_glpi["ldap_rootdn"],$cfg_glpi["ldap_pass"],$cfg_glpi["ldap_port"]);
      
      if ($found_dn!=false){
        $auth_succeded = true;
        $identificat->extauth=1;
        $user_present = $identificat->user->getFromDBbyName($_POST['login_name']);
        $identificat->user->getFromLDAP_active_directory($cfg_glpi["ldap_host"],$cfg_glpi["ldap_port"],$found_dn,$cfg_glpi["ldap_rootdn"],$cfg_glpi["ldap_pass"],$cfg_glpi['ldap_fields'],$_POST['login_name'],$cfg_glpi["ldap_condition"]);        }
0.70
index.php

:fr:pbauthoauto.png Chercher:

  if (!empty($CFG_GLPI["cas_host"])&&!isset($_GET["noCAS"])) {
      glpi_header("login.php");
  }

Ajouter aprés:

  // Authentification Automatique HTTP
  if (isset($_SERVER["REMOTE_USER"])) {          
      $pos = stripos($_SERVER["REMOTE_USER"],"");
      if (!$pos === false) {
          $login = substr($_SERVER["REMOTE_USER"], $pos + 1);
          if ($login != '') {
              header("Location: login.php?login_name=".$login);
          }
      }
  }
login.php

:fr:pbauthoauto.png Chercher:

if (isset ($_POST['login_password'])) {
    $_POST['login_password'] = unclean_cross_side_scripting_deep($_POST['login_password']);
}

Remplacer par:

if (isset ($_POST['login_password'])) {
    $http_auth = false;
    $_POST['login_password'] = unclean_cross_side_scripting_deep($_POST['login_password']);
}
elseif (!isset($_POST['login_password']) &&  isset($_SERVER["REMOTE_USER"])) { 
    $http_auth = false;
    $pos = stripos($_SERVER["REMOTE_USER"],"");
    if (!$pos === false) {
        $login = substr($_SERVER["REMOTE_USER"], $pos + 1);
        if ($login != '') {
            $_POST['login_name'] = $login;
            $http_auth = true;
        }
    }
}

Chercher:

  if (empty ($_POST['login_name']) || empty ($_POST['login_password'])) {
      $identificat->addToError($LANG["login"][8]);

Remplacer par:

 if ((empty($_POST['login_name']) || empty($_POST['login_password'])) && !$http_auth){
      $identificat->addToError($LANG["login"][8]);

Chercher:

      // exists=0 -> no exist
      // exists=1 -> exist with password
      // exists=2 -> exist without password
      $exists = $identificat->userExists($_POST['login_name']);
      // Pas en premier car sinon on ne fait pas le blankpassword
      // First try to connect via le DATABASE
      if ($exists == 1) {

Remplacer par:

      // exists=0 -> no exist
      // exists=1 -> exist with password
      // exists=2 -> exist without password
      $exists = $identificat->userExists($_POST['login_name']);
      // Authentification Automatique HTTP
      if ($http_auth && $exists == 2) {
          $identificat->user->getFromDBbyName(addslashes($_POST['login_name']));
          $config_ldap = $identificat->auth_methods["ldap"][$identificat->user->fields["id_auth"]];
          //Connect to the directory
          $ds = connect_ldap($config_ldap['ldap_host'], $config_ldap['ldap_port'], $config_ldap['ldap_rootdn'], $config_ldap['ldap_pass'], $config_ldap['ldap_use_tls']);
          $user_dn = ldap_search_user_dn($ds, $config_ldap['ldap_basedn'], $config_ldap['ldap_login'], stripslashes($_POST['login_name']), $config_ldap['ldap_condition']);
          if ($user_dn != false) {
              $identificat->auth_succeded = true;
          }
       }
      // Pas en premier car sinon on ne fait pas le blankpassword
      // First try to connect via le DATABASE
      elseif ($exists == 1) {

Du côté des navigateurs

Internet Explorer

Il faut bien vérifier que “Activer l'authentification intégrée de Windows” dans les options avancées d' Internet Explorer soit bien coché.

Il faut penser à rajouter l'url de GLPI dans la liste des sites de l'Intranet local sous l'onglet Sécurité dans les options d'Internet Explorer.

Mozilla Firefox

On va dire que pour Firefox cela ne fonctionne pas.

Avis aux amateurs pour trouver une solution ….. ;-)

Tsmr : Si si ca fonctionne. Je le détaillerais dès que j'aurais un peu de temps. mais faut modifier une valeur dans about:config

network.negociate-auth.delegation-uris : (nom du serveur AD/LDAP) network.negociate-auth.trusted-uris : nom des sites web avec authentification intégrée.

possible via gpo avec un bout de ce script :

http://sourceforge.net/projects/firefoxadm/

Met@lnono : Dans mon entreprise, pour que ça fonctionne, j'ai dû modifier une autre valeur dans about:config

network.automatic-ntlm-auth.trusted-uris : https://,http://

Attention, cette dernière configuration fait que vous enverrez automatiquement vos identifiants à tous les sites qui vous le demanderons !

A vous de jouer

Voilà à peu près tout ce que j'ai pu rassembler sur cette ajout de fonction mais si certain d'entre vous veulent améliorer le tip alors n'hésitez pas, je suis aussi preneur!!!! ^_^

Adresse du post sur le forum à l'origine de l'article: http://www.glpi-project.org/forum/viewtopic.php?id=1397&p=1