Gestion de l'authentification NTLM

Contribuer au projet de part vos connaissances: PHP, HTML, CSS, SQL, JS ....
Répondre
dghaderi
Gsup LEVEL 0
Messages : 2
Enregistré le : mer. 15 mai 2013 12:07

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 '
Avatar du membre
Flox
Administrateur du site
Messages : 9501
Enregistré le : jeu. 21 juin 2012 19:00

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
GestSup: 3.2.53 | Debian: 12 | Apache: 2.4.59 | MariaDB: 11.5.2 | PHP: 8.3 | https://doc.gestsup.fr/
dghaderi
Gsup LEVEL 0
Messages : 2
Enregistré le : mer. 15 mai 2013 12:07

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.
didier43
Gsup LEVEL 2
Messages : 39
Enregistré le : jeu. 19 déc. 2013 14:45

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 !
GestSup: 3.2.34 | Debian: 11 | Apache: 2.4.56 | MariaDB: 10.5.19 | PHP: 8.2.6
Avatar du membre
Flox
Administrateur du site
Messages : 9501
Enregistré le : jeu. 21 juin 2012 19:00

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
GestSup: 3.2.53 | Debian: 12 | Apache: 2.4.59 | MariaDB: 11.5.2 | PHP: 8.3 | https://doc.gestsup.fr/
didier43
Gsup LEVEL 2
Messages : 39
Enregistré le : jeu. 19 déc. 2013 14:45

Pas de problème, patiente est mère de toutes les vertus ;)
GestSup: 3.2.34 | Debian: 11 | Apache: 2.4.56 | MariaDB: 10.5.19 | PHP: 8.2.6
Répondre