Bonjour à tous.

J'essai de mettre en place un SSO entre Elgg et eZ Publish.
J'ai choisi d'utiliser SimpleSAMLphp pour faire ça.

Comme beaucoup de monde j'ai un problème de "State information lost".

Je travail en local sous windows.
Pour le moment je me concentre sur la partie SimpleSAMLphp - Elgg

Installation

SimpleSAMLphp

J’ai installé SimpleSAMLphp en IdP sur http://saml.loc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
<VirtualHost *:80>
        ServerName saml.loc
        DocumentRoot "C:\wamp\www\saml\www"
        Alias /simplesaml "C:\wamp\www\saml\www"
		<Directory "/simplesaml">    
			allow from all 
		</Directory>
</VirtualHost>
Je définis ma base d’identités dans authsource.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$config = array(
	'admin' => array(
		'core:AdminPassword',
	),
	'example-userpass' => array(
		'exampleauth:UserPass',
		'student:studentpass' => array(
			'uid' => array('test'),
			'eduPersonAffiliation' => array('member', 'student'),
		),
		'employee:employeepass' => array(
			'uid' => array('employee'),
			'eduPersonAffiliation' => array('member', 'employee'),
		),
	)
) ;
J’enregistre mes SP dans saml20-sp-remote.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
$metadata['http://elgg.loc/simplesaml/module.php/saml/sp/metadata.php/default-sp'] = array (
  'AssertionConsumerService' => 'http://elgg.loc/simplesaml/module.php/saml/sp/saml2-acs.php/default-sp',
  'SingleLogoutService' => 'http://elgg.loc/simplesaml/module.php/saml/sp/saml2-logout.php/default-sp',
);
Elgg
J'ai installé Elgg sur http://elgg.loc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
<VirtualHost *:80>
    ServerName elgg.loc
	DocumentRoot "C:\wamp\www\elgg\www"
	Alias /simplesaml "C:\wamp\www\elgg\simplesamlphp\www"
</VirtualHost>
J'utilise le module saml_login développé par uniquidNews
http://community.elgg.org/plugins/838203/1.2

J'ai configuré mon module comme cela dans mon interface d'administration de Elgg.
Path of the SimpleSAMLPHP environment: C:\wamp\www\elgg\simplesamlphp
The SP auth source you want to connect to elgg: default-sp
The attribute whose value uniquely identifies a user object: uid

Dans mon fichier authsource.php je définit mon IdP:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
$config = array(
	'default-sp' => array(
		'saml:SP',
		'entityID' => NULL,
		'idp' => 'http://saml.loc/simplesaml/saml2/idp/metadata.php',
		'discoURL' => NULL,
));
Dans mon fichier saml20-idp-remote.php je recopie les informations fournies par mon installation IdP de SimpleSAMLphp :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
$metadata['http://saml.loc/simplesaml/saml2/idp/metadata.php'] = array (
	  'name' => array('Fr' => "Serveur d'identification"),
	  'description' => "MON serveur d'identification à moi.",
	  'metadata-set' => 'saml20-idp-remote',
	  'entityid' => 'http://saml.loc/simplesaml/saml2/idp/metadata.php',
	  'SingleSignOnService' => array (0 => array (
		      'Binding' => 'urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect',
		      'Location' => 'http://saml.loc/simplesaml/saml2/idp/SSOService.php',
	  ),),
	  'SingleLogoutService' => 'http://saml.loc/simplesaml/saml2/idp/SingleLogoutService.php',
	  'certData' => '...',
	  'NameIDFormat' => 'urn:oasis:names:tc:SAML:2.0:nameid-format:transient',
);
Utilisation
Je me rends sur mon réseau social Elgg
http://elgg.loc
Le bouton « Uniquid » du module apparait bien dans le formulaire de connexion.
Lorsque je clique dessus je suis bien redirigé vers mon IdP http://saml.loc ou je peux saisir mes identifiants.

Mais lors que je reviens sur mon site j’obtiens le message suivant :

State information lost, and no way to restart the request
Si vous signalez cette erreur, veuillez aussi signaler l'identifiant de suivi qui permet de trouver votre session dans les logs accessibles à l'administrateur système : b2bdc2a41c
Information de déboguage
SimpleSAML_Error_NoState: NOSTATE
Backtrace:
2 C:\wamp\www\elgg\simplesamlphp\lib\SimpleSAML\Auth\State.php:240 (SimpleSAML_Auth_State::loadState)
1 C:\wamp\www\elgg\simplesamlphp\modules\saml\www\sp\saml2-acs.php:68 (require)
0 C:\wamp\www\elgg\simplesamlphp\www\module.php:135 (N/A)

Debug
J’ajoute du debug supplémentaire.

Au début du fichier saml2-acs.php de SimpleSAMLphp installé dans elgg :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
print_r($_COOKIE);
print_r($_SERVER['HTTP_COOKIE']);
print_r($_SESSION);
$_COOKIE
Array
(
[Elgg] => 4s83pf02ep9a8tpl83a4190jt1
)

$_SERVER['HTTP_COOKIE']
Elgg=4s83pf02ep9a8tpl83a4190jt1

$_SESSION
Undefined variable: _SESSION
Je réactualise ma page :
$_COOKIE
Array
(
[Elgg] => 4s83pf02ep9a8tpl83a4190jt1
[PHPSESSID] => 92814a4545e0ff9aa2fb093a6e8b3dea
)

$_SERVER['HTTP_COOKIE']
Elgg=4s83pf02ep9a8tpl83a4190jt1; PHPSESSID=92814a4545e0ff9aa2fb093a6e8b3dea

$_SESSION
Undefined variable: _SESSION

Je ne vois pas quoi faire pour résoudre mon problème.
Merci par avance pour votre aide.
Si vous avez des questions n’hésitez pas à les pauser afin que je puisse compléter l’exposé de mon problème.


Quelques liens :
http://fr.wikipedia.org/wiki/SAML
http://code.google.com/p/simplesamlphp/wiki/LostState