Déléguer l'authentification d'un IdP Shibboleth à un serveur CAS avec le SSO-CAS login handler

Le SSO-CAS Login Handler permet d'ajouter une fonctionnalité à la délégation de l'authentification d'un IdP Shibboleth à un serveur CAS. En effet, contrairement au RemoteUser login handler, il permet d'utiliser l'authentification forcée (forceAuthn) activée sur certaines ressources.

Pour suivre ce guide, vous devez déjà disposer d'un IdP fonctionnel et configuré pour utiliser CAS avec le RemoteUser login handler. Si ce n'est pas le cas, rendez-vous sur cette page.

Pour activer l'authentification forcée sur un SP, voir cette page.

Compatibilité de cette extension :

  • Shibboleth IdP versions 2.x
  • Client CAS 3.x
  • Serveur CAS 3.x

Nous utilisons deux nommages pour désigner respectivement le répertoire des sources de l'IdP et son répertoire d'installation :

  • $IDP_INSTALL_DIR, e.g. /opt/src/ ou /usr/local/src/
  • $IDP_HOME est fixé par défaut à /opt/shibboleth-idp/

1. Téléchargement et Installation

1.1 Téléchargement

Vous pouvez télécharger directement l'archive depuis :

https://sourcesup.renater.fr/frs/download.php/4086/ssocas-login-handler-0.1.jar

ou obtenir le code source en utilisant subversion :

svn export https://subversion.renater.fr/ssocashandler/trunk/ ssocas-login-handler
cd ssocas-login-handler
mvn package

Ces commandes vous permettent de générer le JAR du login handler dans le répertoire ssocas-login-handler/target/ .

1.2 Installation

Copiez le fichier JAR ssocas-login-handler dans la librairie du répertoire d'installation de votre Identity Provider.

cp ssocas-login-handler-0.1.jar $IDP_INSTALL_DIR/lib
Il est nécessaire de modifier les filtres CAS pour activer cette extension. Nous ne réinstallons donc pas l'IdP à ce stade.

2. Configuration

2.1 Web Applications

Il peut être intéressant pour vous de maintenir un fichier web.xml dans le répertoire de configuration de l'IdP. Voir “Advanced Configuration Topics” ici pour découvrir comment le faire.
  • Modifer la configuration des filtres du client CAS dans $IDP_INSTALL_DIR/src/main/webapp/WEB-INF/web.xml :
             ...
 
 
    	<!-- CAS Filter Configuration --> 
	<context-param> 
	  <param-name>serverName</param-name> 
	  <param-value>https://serveur.cas.exemple</param-value> 
	</context-param>
 
	<!-- CAS Authentication Filter -->
	<filter> 
	 <filter-name>CAS Authentication Filter</filter-name> 
	 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 
	 <init-param> 
	  <param-name>casServerLoginUrl</param-name> 
	  <param-value>https://serveur.cas.exemple/cas/login</param-value> 
	 </init-param> 
	</filter> 
 
	<!-- CAS Validation Filter --> 
	<filter> 
	 <filter-name>CAS Validation Filter</filter-name> 
	 <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 
	 <init-param> 
	  <param-name>casServerUrlPrefix</param-name> 
	  <param-value>https://serveur.cas.exemple/cas</param-value> 
	 </init-param> 
	</filter> 
 
	<!-- CAS Authentication Filter - forceAuthn  -->
	<filter> 
	 <filter-name>CAS Authentication Filter - forceAuthn</filter-name> 
	 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class> 
	 <init-param> 
	  <param-name>casServerLoginUrl</param-name> 
	  <param-value>https://serveur.cas.exemple/cas/login</param-value> 
	 </init-param> 
	 <init-param> 
	  <param-name>renew</param-name> 
	  <param-value>true</param-value> 
	 </init-param>
	</filter> 
 
	<!-- CAS Validation Filter - forceAuthn -->
	<filter> 
	 <filter-name>CAS Validation Filter - forceAuthn</filter-name> 
	 <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 
	 <init-param> 
	  <param-name>casServerUrlPrefix</param-name> 
	  <param-value>https://serveur.cas.exemple/cas</param-value> 
	 </init-param> 
	 <init-param> 
	  <param-name>renew</param-name> 
	  <param-value>true</param-value> 
	 </init-param>
	</filter> 
 
 
	<!-- CAS HttpServletRequest Wrapper Filter --> 
	<filter> 
	 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 
	 <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 
	</filter> 
 
	<!-- CAS Assertion Thread Local Filter --> 
	<filter> 
	 <filter-name>CAS Assertion Thread Local Filter</filter-name> 
	 <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 
	</filter> 
 
	<!-- CAS Filter for Shibb RemoteUser --> 
	<filter-mapping> 
	 <filter-name>CAS Authentication Filter</filter-name> 
	 <url-pattern>/Authn/Cas/NoforceAuthn</url-pattern> 
	 <dispatcher>REQUEST</dispatcher>  
	 <dispatcher>FORWARD</dispatcher>  
	</filter-mapping> 
 
	<filter-mapping> 
	 <filter-name>CAS Validation Filter</filter-name> 
	 <url-pattern>/Authn/Cas/NoForceAuthn</url-pattern> 
	</filter-mapping> 
 
 
	<filter-mapping> 
	 <filter-name>CAS Authentication Filter - forceAuthn</filter-name> 
	 <url-pattern>/Authn/Cas/ForceAuthn</url-pattern>
	 <dispatcher>REQUEST</dispatcher>  
	 <dispatcher>FORWARD</dispatcher>  
	</filter-mapping> 
 
	<filter-mapping> 
	 <filter-name>CAS Validation Filter - forceAuthn</filter-name> 
	 <url-pattern>/Authn/Cas/ForceAuthn</url-pattern>
	</filter-mapping> 
 
 
	<filter-mapping> 
	 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>  
	 <url-pattern>/Authn/Cas/*</url-pattern> 
	</filter-mapping> 
	<filter-mapping> 
	 <filter-name>CAS Assertion Thread Local Filter</filter-name>
	 <url-pattern>/Authn/Cas/*</url-pattern> 
	</filter-mapping>
 
            ...
  • Modifiez le “servlet-mapping” de la RemoteUserAuthServlet (toujours dans ce web.xml) :
           ...
 
 
    <!-- Servlet protected by container used for RemoteUser authentication -->
    <servlet>
        <servlet-name>RemoteUserAuthHandler</servlet-name>
        <servlet-class>edu.internet2.middleware.shibboleth.idp.authn.provider.RemoteUserAuthServlet</servlet-class>
        <load-on-startup>3</load-on-startup>
    </servlet>
 
    <servlet-mapping>
        <servlet-name>RemoteUserAuthHandler</servlet-name>
        <url-pattern>/Authn/Cas/ForceAuthn</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>RemoteUserAuthHandler</servlet-name>
        <url-pattern>/Authn/Cas/NoForceAuthn</url-pattern>
    </servlet-mapping>
 
 
        ...

2.2 Handlers

Définissez le login handler CentralAuthnService dans $IDP_HOME/conf/handler.xml :

  • ajoutez le namespace “fr:renater:ssocashandler” et le schéma “classpath:/schema/ssocasloginhandler.xsd” dans ProfileHandlerGroup comme suit :
    <ph:ProfileHandlerGroup xmlns:ph="urn:mace:shibboleth:2.0:idp:profile-handler"
			    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
			    xmlns:sclh="fr:renater:ssocashandler"
			    xsi:schemaLocation="urn:mace:shibboleth:2.0:idp:profile-handler classpath:/schema/shibboleth-2.0-idp-profile-handler.xsd
                            fr:renater:ssocashandler classpath:/schema/ssocasloginhandler.xsd">
  • définissez le handler :
    <ph:LoginHandler xsi:type="sclh:CentralAuthnService" casFiltersPath="/Authn/Cas">
        <ph:AuthenticationMethod>urn:oasis:names:tc:SAML:2.0:ac:classes:unspecified</ph:AuthenticationMethod>
    </ph:LoginHandler>
Vous devriez aussi commenter la définition du RemoteUser login handler, l'IdP ne l'utilisera plus.

2.3 Logs

Vous pouvez ajouter les logs du SSO-CAS Login Handler à ceux de l'IdP. Pour cela, modifez le fichier $IDP_HOME/conf/logging.xml en rajoutant le bloc suivant et en choisissant le niveau de log (DEBUG ou ERROR) :

    <!-- Logs from SSO-CAS Login Handler -->
    <logger name="fr.renater.ssocashandler" level="DEBUG"/>

Les logs du handler apparaissent dans le fichier idp-process.log.

3. Déploiement du handler

Vous pouvez à présent réinstaller l'IdP :

cd $IDP_INSTALL_DIR
./install.sh

Redémarrer votre serveur Tomcat pour terminer l'installation du handler afin de vous assurer du bon redémarrage de la servlet.

4. Développement

Module développé par Yanis Aumont (juillet/août 2012).