Page 1 sur 1

Gestion de l'authentification NTLM

Posté : mer. 15 mai 2013 12:17
par dghaderi
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

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='&nbsp;<img title="Vous pouvez utiliser votre identifiant et mot de passe Windows." src="./images/info_icn.png" border="0" />'; else $info='';
 		echo '

Re: Gestion de l'authentification NTLM

Posté : mer. 15 mai 2013 18:43
par Flox
Bonjour,

merci de votre contribution, cependant je voudrais connaitre le cas de figure ou vous avez besoin de cette fonction. En effet ne possédez vous pas d'active directory, car sinon l'authentification via le LDAP doit suffir ?


Cdt

Re: Gestion de l'authentification NTLM

Posté : mer. 15 mai 2013 21:09
par dghaderi
Bonjour,

Le but est ici de d'authentifier automatiquement sans avoir à entrer son login et mot de passe via le formulaire.
La prise en charge du REMOTE_USER dans l'en-tête serait aussi une bonne idée à ajouter soit dit en passant (cas de l'authentification via un module Apache comme le mod_auth_cas).

Cordialement.

Re: Gestion de l'authentification NTLM

Posté : jeu. 19 déc. 2013 18:38
par didier43
Bonjour, ce patch pourrait mettre utile, j'ai bien récupérer le code mais mes compétence sont limité en PHP.. Comment faut t'il l'appliquer ?

Merci d'avance !

Re: Gestion de l'authentification NTLM

Posté : lun. 23 déc. 2013 19:02
par Flox
cet update est au programme pour la 3.1 normalement je vous demanderai d'être patient pour que cette dernière soit bien intégré dans l'ensemble du logiciel.

Cdt

Re: Gestion de l'authentification NTLM

Posté : lun. 23 déc. 2013 21:51
par didier43
Pas de problème, patiente est mère de toutes les vertus ;)