CMS Automne
http://www.automne-cms.org/forum/

[Résolu]SSO Possible ?
http://www.automne-cms.org/forum/viewtopic.php?f=2&t=2659
Page 1 sur 1

Auteur:  Fouineux [ Jeu Jan 03, 2013 10:35 am ]
Sujet du message:  [Résolu]SSO Possible ?

Bonjour à tous!Et Bonne Année en passant ;)

Je me demandais si quelqu'un avait réussi à réaliser une connexion SSO avec le module LDAP d'Automne? J'ai lu à plusieurs reprises que cette fonctionnalité était prévue, mais je n'ai trouvé aucun exemple de réalisation. Comme aujourd'hui je me penche sur la question, je suis à la recherche de pistes.

Merci d'avance.

Auteur:  atm4u [ Jeu Jan 03, 2013 9:14 pm ]
Sujet du message:  Re: SSO Possible ?

Pas de mon côté, désolé :?

Auteur:  Fouineux [ Mar Fév 05, 2013 5:11 pm ]
Sujet du message:  Re: SSO Possible ?

Après quelques galères, j'ai trouvé une solution. Alors techniquement cela fait un peu bidouille, mais ca a le mérite de fonctionner (et on utilise bien l'authentification SSO inclue dans Automne 4.2).

Il s'agit en fait de trouver le login Windows de l'utilisateur courant via NTLM, puis de lancer une authentification Automne SSO. Voici mon code, à adapter en conséquence :

Code :
<?php

//####################################################################################
//############## CONNEXION A AUTOMNE PAR SSO
//############## Ce fichier récupère le user windows de l'utilisateur, l'identifie sous
//############## automne et le redirige vers la page d'accueil de l'intranet.
//####################################################################################

//Inclusion API automne
include_once($_SERVER["DOCUMENT_ROOT"]."/automnedev/cms_rc_frontend.php");

function get_msg_str($msg, $start, $unicode = true) {
         $len = (ord($msg[$start+1]) * 256) + ord($msg[$start]);
         $off = (ord($msg[$start+5]) * 256) + ord($msg[$start+4]);
         if ($unicode)
            return str_replace("\0", '', substr($msg, $off, $len));
         else
            return substr($msg, $off, $len);
      }
         
function getInfosFromNTLM() {

   $headers = apache_request_headers();
   
   if (!isset($headers['Authorization'])){
      header('HTTP/1.1 401 Unauthorized');
      header('WWW-Authenticate: NTLM');
      exit;
   }
   
   $auth = $headers['Authorization'];
   
   if (substr($auth,0,5) == 'NTLM ') {
      $msg = base64_decode(substr($auth, 5));
      if (substr($msg, 0, 8) != "NTLMSSP\x00")
         die('error header not recognised');
   
      if ($msg[8] == "\x01") {
         $msg2 = "NTLMSSP\x00\x02\x00\x00\x00".
            "\x00\x00\x00\x00". // target name len/alloc
            "\x00\x00\x00\x00". // target name offset
            "\x01\x02\x81\x00". // flags
            "\x00\x00\x00\x00\x00\x00\x00\x00". // challenge
            "\x00\x00\x00\x00\x00\x00\x00\x00". // context
            "\x00\x00\x00\x00\x00\x00\x00\x00"; // target info len/alloc/offset
   
         header('HTTP/1.1 401 Unauthorized');
         header('WWW-Authenticate: NTLM '.trim(base64_encode($msg2)));
         exit;
      }
      else if ($msg[8] == "\x03") {
         $user = get_msg_str($msg, 36);
         $domain = get_msg_str($msg, 28);
         $workstation = get_msg_str($msg, 44);
         return array('domain'=>$domain,'user'=>$user,'workstation'=>$workstation);
      }
   }
}

//Récupération des infos NTLM grâce aux fonctions ci-dessus
$infos_NTLM = getInfosFromNTLM();   

//Init de la constante du login à utiliser pour le SSO (donc celui que l'on vient de récupérer)
//Ici je concatène avec le domaine, mais je pense que cela dépend de son LDAP/Config
define('MOD_STANDARD_SSO_LOGIN', $infos_NTLM["user"]."@".strtolower($infos_NTLM["domain"]).".local");

//Constitution des params pour l'authentification
//login et password doivent être vide pour une authentification en SSO
$param = array("login" => "","password" => "","authType"=>"sso");
//Authentification
$cms_auth = new CMS_auth($param);
$auth = $cms_auth->authenticate();

//On peut tester si l'authentification s'est bien passée en traitant le retour à l'aide de $auth->getCode()
//Différentes valeurs possibles pour ce code :
 // FAILURE = 0
 // FAILURE_CREDENTIAL_INVALID = -3
 // FAILURE_IDENTITY_AMBIGUOUS = -2
 // FAILURE_IDENTITY_NOT_FOUND = -1
 // FAILURE_UNCATEGORIZED = -4
 // SUCCESS = 1

if($auth->getCode()==1)
{
   //Si tout s'est bien passé on actualise les sessions
   $init_sessions = CMS_session::authenticate(array("login" => $infos_NTLM["user"]."@".strtolower($infos_NTLM["domain"]).".local","authType"=>"sso"));
   //Ci après on peut rediriger vers automne ou faire le traitement que l'on souhaite...
   // To Do.....
}

?>


L'objectif est donc de lancer d'abord la page contenant ce code pour ensuite rediriger vers automne, ou intégrer cela à la racine d'automne directement.

Bien entendu je fournis ce code tel quel. Il marche très bien dans mon environnement (réseau intranet d'entreprise, IE8, Apache), mais je suis conscient qu'il n'est peut-être pas optimisé. Petite précision supplémentaire : il faut que les comptes existent déjà dans automne. Donc dans mon cas lors du tout premier accès de l'utilisateur, ce dernier se connecte (en utilisant le module LDAP qui va créer le compte) puis lors de toutes ses prochaines visites il sera automatiquement connecté.

Précision bis : j'ai toutefois dû modifier les paramètres d'IE sur certains postes : Option internet>>Sécurité>>Personnaliser le niveau>>Cocher Connexion automatique uniquement dans la zone Intranet (en tout cas, ne pas cocher Toujours demander le login et le mdp, sinon cela ne fonctionnera pas).

En espérant que ca en aide quelques uns!

En cas de questions, n'hésitez pas.

Auteur:  atm4u [ Mer Fév 06, 2013 7:42 am ]
Sujet du message:  Re: [Résolu]SSO Possible ?

Merci beaucoup pour le partage, je vais pas être capable de tester, pas le niveau :oops: , mais c'est cool d'avoir l'info.

Auteur:  Fred [ Mer Fév 06, 2013 11:09 am ]
Sujet du message:  Re: [Résolu]SSO Possible ?

Salut Fouineux,

Excellent ! Ca fonctionne sur l'intranet que je suis en train de développer :)
Je l'ai testé avec succès sur IE, FF et Chrome.

J'ai juste modifié le chemin d'inclusion de cms_rc_frontend.php et la ligne de définition de MOD_STANDARD_SSO_LOGIN (pas de domaine dans le login sur notre LDAP).
J'ai inclus le script au début de la page de login et en cas de succès ça authentifie automatiquement l'utilisateur sans afficher le formulaire.

Merci pour le partage !

Page 1 sur 1 Le fuseau horaire est UTC [Heure d’été]
Powered by phpBB® Forum Software © phpBB Group
http://www.phpbb.com/