En ganska enkel lösning är att bygga ett API som returnerar information om vilken MFA metod en användare har valt och konfigurerat.

Man kan anropa API:t från skriptet i mfa-authn-config.xml för att bestämma vad nextFlow ska vara. T.ex

var authCtx = input.getSubcontext("net.shibboleth.idp.authn.context.AuthenticationContext");
var mfaCtx = authCtx.getSubcontext("net.shibboleth.idp.authn.context.MultiFactorAuthenticationContext");
var requestContext = input.getSubcontext("net.shibboleth.idp.profile.context.SpringRequestContext").getRequestContext();

usernameLookupStrategyClass = Java.type("net.shibboleth.idp.session.context.navigate.CanonicalUsernameLookupStrategy");
usernameLookupStrategy = new usernameLookupStrategyClass();
var userName = usernameLookupStrategy.apply(input);

if (mfaCtx.isAcceptable()) {
    nextFlow=null
} else {
    // Call to API to ascertain user's chosen MFA method
    <insert code here to call external API and return method-info for userName>
    
    if (hasMethod1) {
        nextFlow="authn/method1";
    } else if (hasMethod2) {
        nextFlow="authn/method2";
    } else {
        // A flow to show a message about how to configure MFA
        nextFlow="authn/none";
    }
    
    nextFlow; // pass control to second factor or end with the first
}

/Paul.

On 2022-02-15 10:15, Björn Wiberg wrote:

Hej allihopa!

 

Har någon av er implementerat logik i MFA-flödet i Shibboleth IdP som kollar vilken/vilka sorts MFA-varianter som tjänsten begärt?

 

Vid MFA så brukar man ju sätta idp.authn.flows=MFA i conf/authn/authn.properties och sedan implementera logiken i conf/authn/mfa-authn-config.xml för att kräva först användarnamn och lösenord och sedan vid behov en andra faktor.

Men hur gör man om den andra faktorn skall kunna variera?

 

T ex om man i Apache-konfigurationen för mod_shib (Shibboleth SP) angett:

 

ShibRequestSetting authnContextClassRef https://refeds.org/profile/mfa

(för U2F)

 

...eller:

 

ShibRequestSetting authnContextClassRef saml2/urn:oasis:names:tc:SAML:2.0:ac:classes:TimeSyncToken

(för TOPTP)

 

…och vill kunna stödja vilken som av dessa i Shibboleth IdP?

 

Man kan ju även ange flera "acceptabla" värden efter varandra och då får väl IdP:n välja bland dessa beroende på vad den stödjer och den ordning som den önskar tillämpa på de metoder den stödjer, och den ordningen får man väl förmodligen definiera själv på något sätt gissar jag…

 

Om man vill snappa upp det i checkSecondFactor() i conf/authn/mfa-authn-config.xml, hur gör man då?

Så här ser det ut i dagsläget:

 

       <entry key="">

            <bean parent="shibboleth.authn.MFA.Transition" p:nextFlow="authn/Password" />

        </entry>

 

        <entry key="authn/Password">

            <bean parent="shibboleth.authn.MFA.Transition" p:nextFlowStrategy-ref="checkSecondFactor" />

        </entry>

 

    <bean id="checkSecondFactor" parent="shibboleth.ContextFunctions.Scripted" factory-method="inlineScript">

        <constructor-arg>

            <value>

                <![CDATA[

                    nextFlow = "authn/U2f";

 

                    authCtx = input.getSubcontext("net.shibboleth.idp.authn.context.AuthenticationContext");

                    mfaCtx = authCtx.getSubcontext("net.shibboleth.idp.authn.context.MultiFactorAuthenticationContext");

 

                    if (mfaCtx.isAcceptable()) {

                        nextFlow=null;

                    }

 

                    nextFlow; // pass control to second factor or end with the first

                ]]>

            </value>

        </constructor-arg>

    </bean>

 

Här skulle jag alltså vilja läsa av mängden av begärda MFA-metoder och välja någon slags ordning för dessa (t ex i första hand TOTP och i andra hand U2F).

Hittar inget om detta i Shibboleth IdP-dokumentationen, även om jag börjat snegla på getPreferredPrincipals() (http://shibboleth.net/sites/release/java-identity-provider/4.1.5/apidocs/net/shibboleth/idp/authn/context/PreferredPrincipalContext.html#getPreferredPrincipals())...

 

Tacksam för alla tips! 😊

 

Med vänliga hälsningar / Best regards
Björn Wiberg


Uppsala universitet / Uppsala University
Avdelningen för universitetsgemensam IT / University IT Services
Infrastruktur och drift / Infrastructure and Operations
System Unix/Linux

 



---------------------------------------------------------------
saml-admins-at-swamid.se mailing list
Medlemskap/Arkiv etc finns p�:
http://segate.sunet.se/cgi-bin/wa?A0=saml-admins
---------------------------------------------------------------
-- 
Paul Scott <paul.scott@kau.se>
Systemutvecklare, IT-avdelningen, Karlstads universitet
Tel: +46 (0)54-700 23 07

När du skickar e-post till Karlstads universitet behandlar vi dina personuppgifter.
When you send an e-mail to Karlstad University, we will process your personal data.