Gestion de l'authentification NTLM
Posté : mer. 15 mai 2013 12:17
Bonjour,
Ci-joint un patch pour GestSup 2.8 permettant de gérer l'authentification en NTLM si l'authentification LDAP est activé.
Bien sur, la méthode de déclenchement n'est correcte que dans notre cas et il faudrait, pour le faire proprement, ajouter une option dans le panneau d'administration pour activer ou non l'authentification NTLM (exclusivement ou bien en cas d'échec renvoyer vers le formulaire avec authentification LDAP).
Bref ce patch fonctionne pour notre besoin précis mais peut surtout servir de base pour intégrer nativement cette fonctionnalité.
PS : l'upload du patch n'étant pas accepté en raison de l'extension (.patch et .txt), voici le contenu ci-dessous
Ci-joint un patch pour GestSup 2.8 permettant de gérer l'authentification en NTLM si l'authentification LDAP est activé.
Bien sur, la méthode de déclenchement n'est correcte que dans notre cas et il faudrait, pour le faire proprement, ajouter une option dans le panneau d'administration pour activer ou non l'authentification NTLM (exclusivement ou bien en cas d'échec renvoyer vers le formulaire avec authentification LDAP).
Bref ce patch fonctionne pour notre besoin précis mais peut surtout servir de base pour intégrer nativement cette fonctionnalité.
PS : l'upload du patch n'étant pas accepté en raison de l'extension (.patch et .txt), voici le contenu ci-dessous
Code : Tout sélectionner
### Eclipse Workspace Patch 1.0
#P gestsup-sia
Index: index_auth.php
===================================================================
--- index_auth.php (revision 3)
+++ index_auth.php (working copy)
@@ -22,8 +22,10 @@
if(!isset($_GET['state'])) $_GET['state'] = '';
if(!isset($_GET['techread'])) $_GET['techread'] = '';
if(!isset($_GET['techid'])) $_GET['techid'] = '';
-if(!isset($_GET['viewid'])) $_GET['viewid'] = '';
+if(!isset($_GET['viewid'])) $_GET['viewid'] = '';
+$headers = apache_request_headers();
+
//default values
if($_GET['state']=='') $_GET['state'] = '%';
if($_GET['state']=='') $_GET['state'] = '%';
@@ -169,8 +171,121 @@
</SCRIPT>";
}
};
+
+ // if user isn't connected and could authenticate in NTLM but doesn't have "Authorization" header
+ if ($_SESSION['login'] == '' && $rparameters['ldap_auth']==1 && !isset($headers['Authorization']) )
+ {
+ header( "HTTP/1.1 401 Unauthorized" );
+ header( "WWW-Authenticate: NTLM" );
+ exit;
+ }
+
+ // if user isn't connected and have "Authorization" header for NTLM authentication
+ if ($_SESSION['login'] == '' && $rparameters['ldap_auth']==1 && isset($headers['Authorization']) && substr($headers['Authorization'],0,5) == 'NTLM ')
+ {
+ // on vÈrifie que le client soit en NTLM
+ $chaine = $headers['Authorization'];
+ $chaine = substr($chaine, 5); // recuperation du base64-encoded type1 message
+ $chained64 = base64_decode($chaine); // decodage base64 dans $chained64
+
+ if (substr($chained64, 0, 8) != "NTLMSSP\x00")
+ {
+ die('Error : Header not recognized');
+ }
+
+ if($chained64[8] == "\x01")
+ {
+ // |_ byte signifiant l'etape du processus d'identification (etape 3)
+
+ $retAuth = "NTLMSSP".chr(000).chr(002).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
+ $retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(001).chr(002).chr(081).chr(000);
+ $retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
+ $retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
+ $retAuth .= chr(000).chr(000).chr(000).chr(000).chr(000).chr(000);
+
+ $retAuth64 = base64_encode( $retAuth ); // encode en base64
+ $retAuth64 = trim( $retAuth64 ); // enleve les espaces de debut et de fin
+ header( "HTTP/1.1 401 Unauthorized" ); // envoie le nouveau header
+ header( "WWW-Authenticate: NTLM $retAuth64" ); // avec l'identification supplÈmentaire
+ exit;
+
+ }
+
+ else if($chained64[8] == "\x03" )
+ {
+ // |_ byte signifiant l'etape du processus d'identification (etape 5)
+
+ // on recupere le domaine
+ $lenght_domain = ( ord( $chained64[31] ) * 256 + ord( $chained64[30] ) ); // longueur du domain
+ $offset_domain = ( ord( $chained64[33] ) * 256 + ord( $chained64[32] ) ); // position du domain.
+ $domain = str_replace( "\0", "", substr( $chained64, $offset_domain, $lenght_domain ) ); // decoupage du du domain
+
+ //le login
+ $lenght_login = ( ord( $chained64[39] ) * 256 + ord( $chained64[38] ) ); // longueur du login.
+ $offset_login = ( ord( $chained64[41] ) * 256 + ord( $chained64[40] ) ); // position du login.
+ $login = str_replace( "\0", "", substr( $chained64, $offset_login, $lenght_login ) ); // decoupage du login
+
+ if ($login != NULL) {
+ // stockage des donnÈes dans des variable de session
+ $_SESSION['login'] = "$login";
+ $q = mysql_query("SELECT id FROM tusers where login='$login'");
+ $r = mysql_fetch_array($q);
+ $_SESSION['user_id'] = "$r[0]";
+
+ if($r['0']=='')
+ {
+ // if error with login or password
+ echo '<div id="erreur"><img src="./images/access.png" alt="erreur" style="border-style: none" alt="img" /> Votre compte est inexistant dans ce logiciel.</div>';
+ $www = "./index.php";
+ session_destroy();
+ //web redirection to login page
+ echo "<SCRIPT LANGUAGE='JavaScript'>
+ <!--
+ function redirect()
+ {
+ window.location='$www'
+ }
+ setTimeout('redirect()',$rparameters[time_display_msg]);
+ -->
+ </SCRIPT>";
+ } else {
+ echo '<div id="valide"><img alt="logo" src="./images/valide.png" style="border-style: none" alt="img" /> Vos identifiants sont corrects.</div>';
+
+ //update last time connection
+ $query = "UPDATE tusers SET last_login='$datetime' WHERE id LIKE '$r[0]'";
+ $exec = mysql_query($query) or die('Erreur SQL !<br /><br />'.mysql_error());
+
+ $www = "./index.php?page=dashboard&techid=$r[0]&state=1";
+ //web redirection
+ echo "<SCRIPT LANGUAGE='JavaScript'>
+ <!--
+ function redirect()
+ {
+ window.location='$www'
+ }
+ setTimeout('redirect()',$rparameters[time_display_msg]);
+ -->
+ </SCRIPT>";
+ }
+ }
+ else {
+ // If NTLM authentication is not reconized
+ // web redirection
+ echo "<SCRIPT LANGUAGE='JavaScript'>
+ <!--
+ function redirect()
+ {
+ window.location='$www'
+ }
+ setTimeout('redirect()',$rparameters[time_display_msg]);
+ -->
+ </SCRIPT>";
+ }
+ }
+
+ }
// if user isn't connected then display authentication else display dashboard
- if ($_SESSION['login'] == '')
+ else if ($_SESSION['login'] == '')
{
if($rparameters['ldap_auth']==1) $info=' <img title="Vous pouvez utiliser votre identifiant et mot de passe Windows." src="./images/info_icn.png" border="0" />'; else $info='';
echo '