Archive

Archives pour 05/2012

SAML 2 et Liferay – partie 5

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)) :

Diagramme de séquence du SSO en SAML
Lire la suite…

Share

Retour d’expérience : 2 ans avec Spring-Webflow

Il y a deux ans et demi, lorsque nous avons commencé à travailler sur Kwixo, il a fallu choisir un (des) framework(s) pour gérer la partie MVC. Le cahier des charges était énorme, et Spring MVC paraissait un peu juste pour gérer les enchaînements de pages demandés par la MOA.

Par exemple, le formulaire d’inscription est réparti sur plusieurs pages et implique l’envoi d’un code via SMS sur le téléphone (qui peut-être ignoré). Bref, une cinématique complexe.

Lire la suite…

Share

SAML 2 et Liferay – partie 4

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…

Share