Dans la première saison partie de cette série d’article, nous avons vu comment intégrer l’authentification unique SAML 2 dans Liferay, nous allons à présent nous intéresser à la déconnexion centralisé, autrement dit le “Single Logout Profile”. Lire la suite…
Dans le précédent épisode article, nous avions presque terminé notre mécanisme d’authentification unique SAML 2.0, nous allons maintenant assembler les pièces du puzzle et faire quelque finitions…
Une dernière touche de peinture
Si nous reprenons notre descriptif de l’échange (non, ne me tapez pas ! c’est la dernière fois (pour ce schéma en tous cas)) :

Lire la suite…
Dans le précédent épisode article, nous avions mis en place une boite aux lettres pour recevoir du courrier. Et le message que l’on reçoit doit être signé d’un superbe autographe.
Un autographe authentique ?
Dans la mesure où, la réponse doit être signée, il pourrait être judicieux de vérifier la signature. Dans le cas du HTTP Post Binding, il s’agit d’une classique signature XML. Pour la valider, nous allons pouvoir nous servir de la « Java XML Digital Signature API » (JSR 105) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67
| public static boolean validateXmlSignature(String xml) {
try {
// Instantiate the document to be validated
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
org.w3c.dom.Document doc = dbf.newDocumentBuilder().parse(
new ByteArrayInputStream(xml.getBytes(StringPool.UTF8)));
// Find Signature element
NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS, SAMLConstants.SIGNATURE);
if (nl.getLength() == 0) {
_log.error("Cannot find Signature element");
return false;
}
// Create a DOM XMLSignatureFactory that will be used to
// unmarshal the document containing the XMLSignature
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
for(int i = 0; i < nl.getLength(); ++i) {
// Create a DOMValidateContext and specify KeyValue, KeySelector and document context
DOMValidateContext valContext = new DOMValidateContext(new SAMLKeySelector(), nl.item(i));
// unmarshal the XMLSignature
XMLSignature signature = fac.unmarshalXMLSignature(valContext);
// Validate the XMLSignature
if (signature.validate(valContext)) {
if (_log.isDebugEnabled()) {
_log.debug("Signature " + i + " passed core validation");
}
} else {
_log.error("Signature " + i + " failed core validation");
if (_log.isInfoEnabled()) {
boolean sv = signature.getSignatureValue().validate(valContext);
_log.info("signature validation status: " + sv);
// check the validation status of each Reference
Iterator<Reference> itRef = signature.getSignedInfo().getReferences().iterator();
for (int j=0; itRef.hasNext(); j++) {
boolean refValid = itRef.next().validate(valContext);
_log.info("ref[" + j + "] validity status: " + refValid);
}
}
return false;
}
}
}
catch (Exception e) {
_log.error(e, e);
return false;
}
return true;
} |
Lire la suite…
Dans le précédent épisode article (oui, je sais que les meilleures blagues sont les plus courtes, mais non, je n’ai pas l’intention d’arrêter de faire cette blague pourrie, habituez vous), nous avons vu comment envoyer un message en suivant le HTTP Redirect Binding, maintenant que nous avons notre bouteille, il va nous falloir prendre notre plus beau parchemin et écrire ce message de détresse.
Lire la suite…