Bonjour,
après plusieurs jours d’échec, et avoir même tenté une bounty sur stackoverflow, j’ai compris ce qui n’allait pas dans mon code.
Version courte :
Une fois la requête à l’IDP faite, on ne requêtait non pas le système de ticket SAML pour qu’il nous renvoie le message de réponse mais notre propre application.
Forcément la requête ne contenant que la demande d’identité elle ne contient pas l’identité.
Version longue
Open Saml découvre à qui il doit demander l’identité via les lignes suivantes :
SAMLPeerEntityContext peerEntityContext = context.getSubcontext(SAMLPeerEntityContext.class, true);
SAMLEndpointContext endpointContext = peerEntityContext.getSubcontext(SAMLEndpointContext.class, true);
endpointContext.setEndpoint(URLToEndpoint("https://192.168.1.14:8443/360.suite/loginSAML.xhtml"));
Dans mon code je dis donc que la requête de demande d’identité doit être envoyée… à moi même.
Si on remplace l’url par idpEndpoint
, il va commencer à fonctionner.
Dans un premier temps, il va râler : il te faut une signature.
Le code du "signing and verification" du dépôt que j’ai envoyé dans l’OP suffit.
Ensuite, il ne faut pas demander un NameId transient. Pour moi tout fonctionne bien avec unspecified.
Enfin, à la réception de la requête, le nom d’utilisateur sera dans :
String userName =
((ResponseImpl) messageContext.getMessage()).getAssertions().get(0).getSubject().getNameID()
.getValue();
Il est simplement nécessaire de vérifier que :
(((ResponseImpl)messageContext.getMessage()).getStatus()
vaut SUCCESS
- les signatures sont cohérentes
- les assertions ne sont pas vides
Je passe en résolu. En espérant que ma galère aidera quelqu’un. Je vais bien sûr traduire cette réponse en anglais sur stackoverflow.