<div dir="ltr">David is correct. Apologies for the lack of detail. Any user, regardless of their MFA enrollment status, will encounter that error when they try to log into an SP that is requesting the MFA profile. Here is how our flow looks today(largely adapted from our 2.x environment that used this as a reference: <a href="https://wiki.shibboleth.net/confluence/pages/viewpage.action?pageId=32112643" target="_blank">https://wiki.shibboleth.net/confluence/pages/viewpage.action?pageId=32112643</a> )<div><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"> <font face="monospace"> <util:map id="shibboleth.authn.MFA.TransitionMap"><br> <!-- First rule runs the authn/Password login flow. --><br> <entry key=""><br> <bean parent="shibboleth.authn.MFA.Transition" p:nextFlow="authn/Password" /><br> </entry><br> <br> <!--<br> Second rule runs a function if authn/Password succeeds, to determine whether an additional<br> factor is required.<br> --><br> <entry key="authn/Password"><br> <bean parent="shibboleth.authn.MFA.Transition" p:nextFlowStrategy-ref="checkSecondFactor" /><br> </entry><br> <br> <!-- An implicit final rule will return whatever the final flow returns. --><br> </util:map><br><br> <bean id="checkSecondFactor" parent="shibboleth.ContextFunctions.Scripted" factory-method="inlineScript"<br> p:customObject-ref="shibboleth.AttributeResolverService"><br> <constructor-arg><br> <value><br> <![CDATA[<br> nextFlow = null;<br><br> // Go straight to second factor if we have to, or set up for an attribute lookup first.<br> authCtx = input.getSubcontext("net.shibboleth.idp.authn.context.AuthenticationContext");<br> mfaCtx = authCtx.getSubcontext("net.shibboleth.idp.authn.context.MultiFactorAuthenticationContext");<br> if (mfaCtx.isAcceptable()) {<br> // Attribute check is required to decide if first factor alone is enough.<br> resCtx = input.getSubcontext(<br> "net.shibboleth.idp.attribute.resolver.context.AttributeResolutionContext", true);<br> resCtx.setPrincipal(input.getSubcontext(<br> "net.shibboleth.idp.authn.context.SubjectCanonicalizationContext").getPrincipalName());<br> resCtx.getRequestedIdPAttributeNames().add("ADmemberOf");<br> resCtx.resolveAttributes(custom);<br> <br> // Check for an attribute that authorizes use of first factor.<br> attribute = resCtx.getResolvedIdPAttributes().get("ADmemberOf");<br> valueType = Java.type("net.shibboleth.idp.attribute.StringAttributeValue");<br> if (attribute != null && attribute.getValues().contains(new valueType("CN=duoActiveUsers,OU=are,OU=here,O=uncg"))) {<br> nextFlow = "authn/Duo";<br> }<br> <br> input.removeSubcontext(resCtx); // cleanup<br> }<br> <br> nextFlow; // pass control to second factor or end with the first<br> ]]><br> </value><br> </constructor-arg><br> </bean></font><br></blockquote><div><br></div><div>Based on it's behavior, it looks like it's making a non-proceed decision after the first factor without proceeding to the checkSecondFactor(where the MFA magic happens). I can provide more configs if it helps.</div></div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Sep 17, 2019 at 12:58 PM Jeffrey Williams <<a href="mailto:jfwillia@uncg.edu" target="_blank">jfwillia@uncg.edu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div>I'm looking for guidance on the best approach to a request.</div><div><br></div>We're currently running 3.3.3 using the native Duo plugin and the IDP has only one flow. It's scripted to check to see if the user is enrolled in MFA before presenting authn/Duo. <div><br></div><div>We have a vendor using Shibboleth SP that we're looking to integrate with and one of the requirements is that authorized users must MFA into the service. My first thought was to have the SP configured their
<code style="color:rgb(23,43,77);font-size:14px">authnContextClassRef</code><span style="color:rgb(23,43,77);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Oxygen,Ubuntu,"Fira Sans","Droid Sans","Helvetica Neue",sans-serif;font-size:14px"> </span> to our MFA value ("<font face="monospace"><a href="https://refeds.org/profile/mfa" target="_blank">https://refeds.org/profile/mfa</a></font>"). However, it seems that the IdP's authentication flow short-circuits after 1FA and sends an error back to the SP saying:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><br>SAML response reported an IdP error.<br>Error from identity provider:<br><strong>Sub-Status:</strong> urn:oasis:names:tc:SAML:2.0:status:NoAuthnContext<br><strong>Message:</strong> An error occurred.<br></blockquote>
<blockquote>
<strong>Status:</strong> urn:oasis:names:tc:SAML:2.0:status:Requester<br></blockquote><div><div>With the following in the IdP logs:</div><div><br></div><div><font face="monospace">2019-09-16 19:21:30,180 - INFO [net.shibboleth.idp.authn.impl.ValidateUsernamePasswordAgainstLDAP:152] - Profile Action ValidateUsernamePasswordAgainstLDAP: Login by 'jfwillia' succeeded<br>2019-09-16 19:21:30,191 - DEBUG [net.shibboleth.idp.session.impl.DetectIdentitySwitch:148] - Profile Action DetectIdentitySwitch: No previous session found, nothing to do<br>2019-09-16 19:21:30,191 - WARN [net.shibboleth.idp.authn.impl.FinalizeAuthentication:179] - Profile Action FinalizeAuthentication: Authentication result for flow authn/MFA did not satisfy the request<br>2019-09-16 19:21:30,195 - WARN [org.opensaml.profile.action.impl.LogEvent:105] - A non-proceed event occurred while processing the request: RequestUnsupported</font><br></div><div><font face="monospace"><br></font></div><div><font face="arial, sans-serif">This is regardless of MFA enrollment. </font></div><div><font face="arial, sans-serif"><br></font></div><div><font face="arial, sans-serif">I checked through the docs and didn't find anything that seemed to answer the question. Is there a way to maintain the single authentication flow and have it only authenticate MFA users for this SP?</font></div><div><font face="monospace"><br></font></div>-- <br><div dir="ltr" class="gmail-m_-3909351219914740749gmail-m_-5631630486695327573m_-451548204329762626m_5808403822012160684gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><div dir="ltr">Jeffrey Williams </div><div dir="ltr">Identity Engineer<br>Identity & Access Services<br><a href="https://its.uncg.edu" target="_blank">https://its.uncg.edu</a></div></div><div dir="ltr"><br></div><div dir="ltr"><img src="https://uncgcdn.blob.core.windows.net/email/UNCGLogo.png"><br></div></div></div></div></div></div></div></div></div></div></div></div>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail-m_-3909351219914740749gmail_signature"><div dir="ltr"><div><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div><div dir="ltr">Jeffrey Williams </div><div dir="ltr">Identity Engineer<br>Identity & Access Services<br><a href="https://its.uncg.edu" target="_blank">https://its.uncg.edu</a></div></div><div dir="ltr"><br></div><div dir="ltr"><img src="https://uncgcdn.blob.core.windows.net/email/UNCGLogo.png"><br></div></div></div></div></div></div></div></div></div>