...
Expand |
---|
title | WebAuthn MFA Flow With Password and Duo fallback |
---|
|
conf/authn/mfa-authn-config.xml Code Block |
---|
<util:map id="shibboleth.authn.MFA.TransitionMap">
<entry key="">
<bean parent="shibboleth.authn.MFA.Transition" p:nextFlowStrategy-ref="checkPasswordOrWebAuthnForRegistration" />
</entry>
<entry key="authn/WebAuthn">
<bean parent="shibboleth.authn.MFA.Transition">
<property name="nextFlowStrategyMap">
<map>
<entry key="NoRegisteredWebAuthnCredentials" value="authn/Password" />
<entry key="NoCredentialsRegisteredForUserHandle" value="authn/Password" />
</map>
</property>
</bean>
</entry>
<entry key="authn/Password">
<bean parent="shibboleth.authn.MFA.Transition" p:nextFlow="authn/WebAuthn" />
</entry>
</util:map>
<!-- If the MFA context is not acceptable from the first factor, run the DuoOIDC flow -->
<bean id="checkSecondFactor" parent="shibboleth.ContextFunctions.Scripted" factory-method="inlineScript">
<constructor-arg>
<value>
<![CDATA[
nextFlow = "authn/DuoOIDC";
// Check if second factor is necessary for request to be satisfied.
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> |
|
Prepopulating the WebAuthn username
...
into the authn/Password flow
When using the passwordless flow with a fallback to authn/Password, you could modify the login.vm
view to pre-fill the username input with the username entered into the WebAuthn context. For example, at the top of login.vm
:
...