Apps

Module JCMS SSO 2.1

Description

Ce module permet une authentification automatique sur le site à partir d'une connexion préalable à un autre site de technologie Jalios.


Installation

Ce module ne fonctionne qu'à partir de JCMS 9.0 SP1

1. Introduction

Ce module permet l'authentification automatique d'un utilisateur sur un site JCMS X en utilisant l'authentification effectuée sur un site JCMS central.
Le membre est créé/synchronisé sur le site X à partir des informations du site central (soit via un LDAP commun si il existe, soit via OpenAPI).

Toutes webapps autres que JCMS peut bénéficier de ce SSO à l'aide d'un developpement personnalisé basé sur JCMS OpenAPI.
Les termes suivants seront utilisés tout au long de cette documentation:

  • Webapp JCMS principal : la webapp JCMS utilisée comme référentiel central pour l'authentification et les membres.
  • Webapp cliente JCMS : une webapp JCMS sur lequel le module est installé afin de bénéficier de l'authentification de l'instance JCMS principale.
  • Webapp cliente externe : une webapp (autre que JCMS) qui veut bénéficier de l'authentification de la webapp JCMS principale.
  • Ticket SSO : c'est un ticket d'authentification généré sur la webapp JCMS principale, utilisé par les webapps clientes pour authentifier les membres.

2. Principes

Le SSO auprès de JCMS est réalisé en trois étapes:

  1. ÉTAPE 1 sur la webapp cliente : redirection de l'utilisateur non authentifié sur le JCMS principal pour la demande SSO.
  2. ÉTAPE 2 sur la webapp JCMS principale : la demande de SSO est validé et l'utilisateur est redirigé vers la webapp cliente avec un Ticket SSO.
  3. ÉTAPE 3 sur la webapp cliente : la webapp cliente lit le Ticket SSO et l'utilise pour effectuer une requête Open API sur la webapp JCMS principale pour valider l'authentification (et synchroniser le membre si nécessaire).

Voici une explication plus détaillée de ce qui se passe au cours de ces trois étapes:

  • ÉTAPE 1 (sur la webapp cliente):
    1. L'utilisateur accède une webapp cliente sans être authentifié.
    2. La webapp cliente redirige l'utilisateur vers la webapp JCMS principale pour demander un ticket SSO. (Via le JSP plugins/JcmsSSOPlugin/jsp/sso.jsp ).
  • ETAPE 2 (sur la webapp JCMS principale):
    1. La webapp JCMS principale vérifie que la demande SSO provient d'un site autorisé (en validant le paramètre JcmsSsoRedirect avec la configuration effectué dans les propriétés du module).
    2. Si l'utilisateur n'est pas encore authentifié sur l'instance de JCMS principal, l'authentification est effectuée.
    3. Une fois authentifié sur la webapp JCMS principale, un ticket SSO est généré pour ce membre. Le ticket SSO ne peut être utilisé pour effectuer une demande REST pour ce membre (http://www.example.com/rest/data/{memberId} ) et n'est valable que pendant une durée déterminée.
    4. L'utilisateur est redirigé vers la webapp cliente avec le ticket SSO.
  • ETAPE 3 (sur la webapp cliente):
    1. La webapp cliente lit le ticket SSO à partir des paramètres JcmsSsoMemberId et JcmsSsoAuthKey .
    2. En utilisant OpenAPI, la webapp cliente effectue une requête à la webapp JCMS principale afin de valider le ticket SSO et de récupérer toutes les informations du membres (http://www.example.com/rest/data/{memberId} ).
    3. Une fois que le login de l'utilisateur été récupéré à partir d'Open API, la synchronisation se produit : 
      Une première tentative de synchronisation a lieu en utilisant LDAP si il est activé.
      Si le LDAP est désactivé ou si la synchronisation LDAP échoue, le membre est synchronisé à l'aide des informations extraites de OpenAPI. (Consulter la FAQ ci-dessous pour plus d'informations sur les règles de synchronisation).

3. Installation

3.1 Installation sur la webapp JCMS principale 

  1. Déployez le module sur la webapp JCMS principale et redémarrez.
  2. Modifiez les propriétés d'administration du plugin et entrez les informations suivantes:
    • JCMS Principal ? (obligatoire) : Choisissez oui .
    • URL du site principal (obligatoire) : Saisissez l'URL de base de la webapp JCMS principale 
      par exemple http://www.example.com/
    • Sites autorisés (obligatoire) : Saisissez l'URL de base exacte de tous les sites qui sont autorisés à utiliser cette webapp principale comme SSO. 
      par exemple http://site1.example.com/, http://site2.example.com/
    • Groupes autorisés (optionnel) : Saisissez la liste des groupes (identifiant) auquel un membre doit appartenir pour être autorisé à s'authentifier à l'aide du SSO. 
      Utilisez cette option comme une couche de sécurité supplémentaire pour plus de contrôle sur qui est autorisé à utiliser l'authentification unique et qui n'est pas.
    • Durée de validité du ticket SSO (optionnel) : La valeur par défaut est de 15 secondes, ce qui est très bien dans la plupart des cas. Augmentez cette valeur si votre réseau souffrent de latence très élevée, diminuer la valeur pour améliorer la sécurité.
  3. Modifiez les propriétés d'administration dans l'onglet "Web Services" et activer OpenAPI. 
    Assurez-vous que toutes les adresses IP des webapps clientes sont autorisées à effectuer des requêtes OpenAPI.
  4. Optionnel: configurez les paramètres LDAP.

3.2 Installation sur une webapp cliente JCMS

  1. Déployez le module sur la webapp JCMS cliente et redémarrez.
  2. Modifiez les propriétés d'administration du plugin et saisissez les informations suivantes (tous les autres paramètres ne sont utilisés que par la webapp JCMS principale):
    • JCMS Principal ?  (obligatoire) : Laisser à non.
    • URL du site principal (obligatoire) : Saisissez l'URL de base de la webapp JCMS principale 
      par exemple http://www.example.com/
    • Groupes autorisés (facultatif mais fortement recommandé ) : Saisissez la liste des groupes (identifiant) auquel un membre doit appartenir pour être autorisé à s'authentifier à l'aide du SSO.
      L'utilisation de cette option est nécessaire pour prévenir le vol d'identité, comme expliqué ci-dessous.
    • Groupes par défaut (optionnel) : Groupes utilisés pour créer de nouveaux membres grâce à la synchronisation Open API. 
      Utile pour suivre les membres créés à partir de SSO. Cette option doit contenir tous les groupes spécifiés dans les groupes autorisés
  3. Optionnel: configurez votre LDAP en utilisant les mêmes paramètres entrés dans la webapp JCMS principale.

Note très importante concernant la sécurité et le vol d'identité des comptes existants : 
Suivez les recommandations ci-dessous pour remplir l'option Groupes autorisésSans cette option, un utilisateur malveillant pourrait modifier son nom d'utilisateur sur la webapp JCMS principale pour correspondre à un utilisateur existant sur ​​la webapp cliente, gagnant ainsi l'accès à la webapp cliente en tant qu'utilisateur avec des privilèges existants. (Par exemple, l'utilisateur "SimpleUser" changer sa connexion à "someadmin" sur la webapp JCMS principale, alors il peut accéder à la webapp cliente et sera authentifié comme "someadmin»). 
En spécifiant cette option, un membre existant ne sera pas autorisé à être authentifié à l'aide du SSO, sauf si vous l'ajoutez au groupe(s) approprié(s).

Recommandations:

  1. Indiquez au moins un groupe dans l'option Groupes autorisés
  2. Vérifiez UN PAR UN les comptes existants et ajoutez-les au groupe précédent uniquement si le Membre correspondant existe déjà sur la webapp JCMS principale,
  3. Spécifiez le même groupe dans l'option  Groupes par défaut pour que les Membres créés grâce à la synchronisation OpenAPI sont automatiquement autorisées.

3.3 Installation sur une webapp cliente externe

L'utilisation de ce plugin webapp client externe nécessite un developpement personnalisé, voir la section ci-dessous.

4. Développement sur une webapp cliente externe

4.1 Pré-requis

  • Lire la documentation de votre application web pour apprendre à developper un mécanisme d'authentification personnalisé.
  • Lire la section «Principes» ci-dessus pour bien comprendre le fonctionnement de JCMS SSO fonctionne et comment l'appliquer dans votre webapp client.
  • Lire la documentation de l'OpenAPI client de JCMS.

4.2 Développement

Vérifiez tout d'abord que votre webapp cliente a été autorisé à utiliser le JCMS SSO sur la webapp JCMS principale.

Le processus de connexion

  • Depuis votre webapp cliente, rediriger l'utilisateur non authentifié sur l'URL suivante de la webapp JCMS principale (étape 1 dans les principes):
    http://mainjcms.example.com/plugins/JcmsSSOPlugin/jsp/sso.jsp?JcmsSsoRedirect={redirectUrl}
    Où {redirectUrl} est l'URL absolue vers laquelle l'utilisateur sera redirigé après authentification sur le site principal.
  • Lire les paramètres JcmsSsoMemberId et JcmsSsoAuthKey , puis effectuer la demande d'ouverture de l'API de synchroniser et de connecter l'utilisateur (étape 3 sur les principes). 
    Voici un exemple simple (et incomplet) en Java à l'aide JCMS OpenAPI client :
      final String mainJcmsUrl = "http://mainjcms.example.com/";
      String remoteMbrId = request.getParameter("JcmsSsoMemberId");
      String authKey = request.getParameter("JcmsSsoAuthKey");
      if (Util.isEmpty(remoteMbrId) || Util.isEmpty(authKey)) {
        return null;
      }
      
      ClientSession clientSession = new ClientSession(mainJcmsUrl);
      JcmsApp jcmsApp = new JcmsApp(clientSession);
      String memberResourcePath = mainJcmsUrl + jcmsApp.getDataPath(remoteMbrId);
      clientSession.setAuthentication(new AuthKeyAuthentication(memberResourcePath, authKey));
      try {
        logger.info("[JCMSSSO-STEP3] Performing OpenAPI request : " + memberResourcePath);
        JcmsResource memberResource = jcmsApp.getData(remoteMbrId);
        MemberElement memberElement = MemberElement.getFirstMemberElement(memberResource, clientSession);
        String login = memberElement.getLogin();
        [...] // authenticate user from this login (synchronize it if needed)
      } catch (Exception ex) {
        logger.warn("[JCMSSSO-STEP3] An exception occured while performing Open API request on '" + mainJcmsUrl + "' to retrieve information for remote Member '" + remoteMbrId + "'. ", ex);
        [...] // display error message to user
      }

Note: cet exemple utilise la classe MemberElementqui est disponible dans l'OpenAPI cliente fournie à partir de JCMS 6.1.2.

Le processus de déconnexion

Depuis votre webapp cliente, rediriger l'utilisateur authentifié sur l'URL suivante de la webapp JCMS principale:

http://mainjcms.example.com/plugins/JcmsSSOPlugin/jsp/logout.jsp

L'utilisateur sera déconnecté de la webapp JCMS principale. Vous êtes responsable de déconnecter l'utilisateur de votre webapp avant ou après cette opération. 
Vous pouvez fournir un paramètre optionnel redirect si vous souhaitez rediriger l'utilisateur vers un emplacement spécifique après la déconnexion de la webapp JCMS principale.

5. Configurations et développements avancés

Règle d'accès pour les webapps JCMS clientes

Sur les webapps JCMS clientes, vous pouvez configurer une "règle d'accès" dans les propriété pour déclencher la redirection et l'authentification sur la webapp JCMS principale uniquement lorsque certaines conditions sont remplies, telles que définies par la règle et sa configuration.

Quelques règles d'accès sont fournis en standard dans le package com.jalios.jcms.authentication.rules 
Vous pouvez également développer votre propre règle d'accès en implémentant l'interface AccessRule.

Consultez la Javadoc pour plus d'informations sur les règles existantes et le développement de votre propre règle.
La javadoc des règles d'accès est fourni dans le module, dans le répertoire plugins/JcmsSSOPlugin/docs/javadoc/access-rules/ 

L'exemple suivant déclare une règle d'accès basée sur l'adresse IP du client. Dans cet exemple JcmsSSO sera utilisé uniquement pour les clients du réseau 192.168.0.0/24:

jcmsplugin.jcmssso.access-rule.class: com.jalios.jcms.authentication.rules.IpAccessRule
jcmsplugin.jcmssso.ip-access-rule.regex: ^ 192 \ \ .168 \ \ .0 \ \ .. *

Si aucun paramètre de règle d'accès n'est spécifié dans les propriétés, le comportement par défaut de l'authentification JcmsSSO est appliquée : les clients sont toujours redirigés de la webapp JCMS cliente à la webapp JCMS principale lorsqu'ils ne sont pas authentifiés.

Il est possible d'exploiter ce module pour fournir un SSO sur n'importe quelle application web autre que JCMS.
Il faut pour cela réaliser un développement très simple basé sur l'API JCMS Open API Client (Java, .Net ou tout autre language)

Un connecteur externe existe déjà pour le framework de sécurité Altassian Seraph (utilisé par JIRA et Confluence), ce connecteur exploite le framework de gestion d'utilisateur OpenSymphony User (OSUser) pour la création et la synchronisation des membres à partir des données OpenAPI. Contactez l'équipe commercial Jalios si vous êtes intéressé par ce connecteur.


FAQ

1. Qu'advient-il si un membre est modifié sur la webapp JCMS principale?

Tous les champs du membre sont synchronisés sur la webapp cliente JCMS à l'exception :

  • du statut d'administrateur
  • des groupes
  • du mot de passe
2. Qu'advient-il si le login d'un membre est modifiée sur la webapp JCMS principale ?

Le champ login est mis à jour sur la webappe JCMS cliente, sauf si le login est en conflit avec un membre existant (dans ce cas, l'utilisateur est connecté, mais son login ne change pas).

3. Les administrateurs sont-ils synchronisés sur les webapps cliente JCMS ?

Tous les membres sont synchronisés mais leur statut d'administrateur ne l'est pas.

4. Les groupes sont-ils synchronisés sur les webapps cliente JCMS ?

Non, le groupe par défaut (spécifié dans la propriété du site) et les groupes par défaut (spécifié dans les propriétés de l'interface d'admin plugin) sont utilisés lors de la création d'un nouveau membre. Les groupes existants ne sont pas modifiés lors de l'actualisation d'un membre existant.

5. Le mot de passe de l'utilisateur est-il synchronisé sur la webapp cliente JCMS ?

Non. Un mot de passe aléatoire est généré sur la webapp cliente JCMS. Par conséquent, l'utilisateur ne sera pas en mesure de se connecter à la webapp cliente si le SSO est désactivé.

6. Qu'advient-il si au cours d'une synchronisation le login d'un membre est déjà utilisé sur le site du client par un autre membre ?

Si le membre existait déjà sur la webapp cliente JCMS, mais avec un autre login, tous ses champs sont mis à jour à l'exception du login.
Si le membre n'existait pas sur la webapp cliente JCMS, il n'est pas créé et l'authentification JCMS SSO est désactivée pour la session J2EE en cours

7. L'authentification par JCMS SSO peut-elle être utilisée avec l'authentification standard sur une webapp cliente JCMS?

L'authentification standard peut être utilisé en accédant à front/privateLogin.jsp qui ne déclenchera pas JCMS SSO.
De plus, si JCMS SSO échoue (pour une raison quelconque), il sera désactivé pour la session J2EE en cours, permettant ainsi l'authentification standard.

En dehors de ces cas, JCMS SSO est toujours déclenché lorsque l'utilisateur accéde à une webapp cliente JCMS sans être authentifié.

Une règle d'accès peut être configurée pour modifier ce comportement.

8. Y-a-t-il des risques concernant la sécurité à connaitre ?

Oui. Lisez attentivement la documentation pour configurer les webapps correctement.

Informations

Version
  • 2.1
Stabilité
  • Stable
Compatibilité
  • JCMS 9 SP1
    JCMS 9 SP2
    JCMS 9 SP3
    JCMS 9 SP4
    JCMS 9 SP5
    JPlatform 10
Certifié Jalios
  • Oui
Prix
  • Module gratuit
Support
  • Jalios Support
Auteur
  • Jalios SA
Licence
  • Jalios
Taille
  • 405,91 Ko
Mis-à-jour
  • 26/01/15
Téléchargements
  • 53