Hej Paul!
Tack för tipset!
I dagsläget har vi inte "separat" lagrad information om supporterade MFA-metoder
per användare, även om det borde vara väldigt rättframt att implementera och många redan
gör det.
Interimslösningen fick bli en logik som går igenom begärd(a) MFA-metod(er) i
RequestedPrincipalContext och väljer en av dessa (kan ske "rangordnat").
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
Från: Paul Scott <paul.scott(a)kau.se>
Skickat: den 10 februari 2023 10:47
Till: Swamid saml-admins <saml-admins(a)swamid.se>
Ämne: [Saml-admins] Re: Logik för att välja mellan flera MFA-metoder?
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
<https://refeds.org/profile/mfa%20%20för%20U2>
(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/ne…)
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 <mailto:paul.scott@kau.se> <paul.scott(a)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
<https://www.kau.se/gdpr> .
When you send an e-mail to Karlstad University, we will process your personal data
<https://www.kau.se/en/gdpr> .
VARNING: Klicka inte på länkar och öppna inte bilagor om du inte känner igen avsändaren
och vet att innehållet är säkert.
CAUTION: Do not click on links or open attachments unless you recognise the sender and
know the content is safe.