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.