ADFS kann sowohl als SP als auch als IdP agieren. Hier wird beschrieben, wie man die AuthenticationContextClass anpassen kann, da für eine korrekte Funktion in gekoppelten Szenarien nicht der Standard wie z.B. urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport verwendet werden darf, sondern http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password.
Bei ADFS (getestet mit Version 2.0) sind dafür folgenden Anpassungen in der Konfiguration notwendig:
<!-- <bean id="authn/Password" parent="shibboleth.AuthenticationFlow" p:passiveAuthenticationSupported="true" p:forcedAuthenticationSupported="true" /> --> <bean id="authn/Password" parent="shibboleth.AuthenticationFlow" p:passiveAuthenticationSupported="true" p:forcedAuthenticationSupported="true"> <property name="supportedPrincipals"> <list> <bean parent="shibboleth.SAML2AuthnContextClassRef" c:classRef="http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password"/> <bean parent="shibboleth.SAML2AuthnContextClassRef" c:classRef="urn:oasis:names:tc:SAML:2.0:ac:classes:PasswordProtectedTransport" /> <bean parent="shibboleth.SAML2AuthnContextClassRef" c:classRef="urn:oasis:names:tc:SAML:2.0:ac:classes:Password" /> <bean parent="shibboleth.SAML1AuthenticationMethod" c:method="urn:oasis:names:tc:SAML:1.0:am:password" /> </list> </property> </bean>
Damit wird Shibboleth die neue AuthenticationContextClass bekannt gemacht. Nun muss diese noch selektiv für das bzw. die ADFS-Systeme zur Verfügung gestellt werden. Dies wird in der relying-party.xml erreicht.
<!-- ... --> <!-- neues bean für adfs mit der AuthenticationContextClass --> <bean id="SAML2.SSO.adfs" parent="SAML2.SSO"> <property name="defaultAuthenticationMethods"> <list> <bean parent="shibboleth.SAML2AuthnContextClassRef" c:classRef="http://schemas.microsoft.com/ws/2008/06/identity/authenticationmethod/password"/> </list> </property> </bean> <!-- ... --> <util:list id="shibboleth.RelyingPartyOverrides"> <!-- ... --> <!-- komma-separierte Liste der Entity IDs der ADFS-Systeme --> <bean parent="RelyingPartyByName" c:relyingPartyIds="#{{'http://adfs1.beispiel-uni.de/adfs/services/trust', 'http://adfs2.beispiel-uni.de/adfs/services/trust'}}"> <property name="profileConfigurations"> <list> <bean parent="SAML2.SSO.adfs" p:nameIDFormatPrecedence="#{{'urn:oasis:names:tc:SAML:2.0:nameid-format:transient'}}"/> <ref bean="SAML2.Logout" /> <ref bean="SAML2.AttributeQuery" /> <ref bean="SAML2.ArtifactResolution" /> <ref bean="Liberty.SSOS" /> </list> </property> </bean> <!-- ... -->