I was able to resolve this on my own. I discovered a way to separate the authentication type selection (send code vs call me options) and verification pieces. To do this, I created a self asserted page for selecting a phone authentication type and based on that output, it either calls the SMS phone factor technical profile or the call phone factor technical profile. Doing this allows me to include a bypass mechanism on the authentication type selection step and move to another subjourney.
Providing the full sample of my generalized code (note: I have not tested this generalized version).
First, I created a phoneMfaChoice claim and a self asserted technical profile for the selection of SMS or voice call using the mentioned claim. The skipPhoneFactor claim is a boolean that utilizes JavaScript to mark a hidden checkbox if a link/button is clicked client side.
<ClaimType Id="phoneMfaChoice">
<DisplayName>Phone Authentication Type </DisplayName>
<DataType>string</DataType>
<UserInputType>RadioSingleSelect</UserInputType>
<Restriction>
<Enumeration Text="Text Message (SMS)" Value="sms" SelectByDefault="true" />
<Enumeration Text="Voice Call" Value="phone" SelectByDefault="false" />
</Restriction>
</ClaimType>
<TechnicalProfile Id="PhoneFactor-Selection">
<DisplayName>Allow user to choose an option for phone verification</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ContentDefinitionReferenceId">api.phoneMfaChoice</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="phoneNumber" PartnerClaimType="phoneNumber" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="phoneNumber" />
<OutputClaim ClaimTypeReferenceId="phoneMfaChoice" />
<OutputClaim ClaimTypeReferenceId="skipPhoneFactor" DefaultValue="False" />
</OutputClaims>
</TechnicalProfile>
Next, I set up a technical profile for verifying the SMS text message authentication type. This is using the MS Phone Factor technical profile found here: https://learn.microsoft.com/en-us/azure/active-directory-b2c/phone-factor-technical-profile. IMPORTANT: this utilizes the options for setting.authenticationMode "sms" and setting.autodial "true" in order to go from selection page to entering verification code page.
<TechnicalProfile Id="PhoneFactor-VerifySms">
<DisplayName>Phone factor verification via text message (SMS)</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.PhoneFactorProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ContentDefinitionReferenceId">api.phonefactor</Item>
<Item Key="setting.authenticationMode">sms</Item>
<Item Key="setting.autodial">true</Item>
</Metadata>
<InputClaimsTransformations>
<InputClaimsTransformation ReferenceId="CreateUserIdForMFA" />
</InputClaimsTransformations>
<InputClaims>
<InputClaim ClaimTypeReferenceId="userIdForMFA" PartnerClaimType="UserId" />
<InputClaim ClaimTypeReferenceId="phoneNumber" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="Verified.strongAuthenticationPhoneNumber" PartnerClaimType="Verified.OfficePhone" />
<OutputClaim ClaimTypeReferenceId="phoneNumber" PartnerClaimType="phoneNumber" />
</OutputClaims>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-MFA" />
</TechnicalProfile>
Similarly, I set up a technical profile for verifying the phone call authentication type.
<TechnicalProfile Id="PhoneFactor-VerifyCall">
<DisplayName>Phone factor verification via voice call</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.PhoneFactorProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ContentDefinitionReferenceId">api.phonefactor</Item>
<Item Key="setting.authenticationMode">phone</Item>
<Item Key="setting.autodial">true</Item>
</Metadata>
<InputClaimsTransformations>
<InputClaimsTransformation ReferenceId="CreateUserIdForMFA" />
</InputClaimsTransformations>
<InputClaims>
<InputClaim ClaimTypeReferenceId="userIdForMFA" PartnerClaimType="UserId" />
<InputClaim ClaimTypeReferenceId="phoneNumber" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="Verified.strongAuthenticationPhoneNumber" PartnerClaimType="Verified.OfficePhone" />
<OutputClaim ClaimTypeReferenceId="phoneNumber" PartnerClaimType="phoneNumber" />
</OutputClaims>
<UseTechnicalProfileForSessionManagement ReferenceId="SM-MFA" />
</TechnicalProfile>
Below is the full SubJourney for phone verification. The orchestration steps utilize the phoneMfaChoice to pick one or the other for SMS or call. Additionally, there is a precondition to check if skipPhoneFactor is true in order to properly bypass the orchestration steps and move to the next SubJourney.
<SubJourney Id="PhoneFactor-Verification" Type="Call">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="PhoneFactorSelection" TechnicalProfileReferenceId="PhoneFactor-Selection" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="false">
<Value>phoneMfaChoice</Value>
<Value>sms</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
<Precondition Type="ClaimEquals" ExecuteActionsIf="true">
<Value>skipPhoneFactor</Value>
<Value>True</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="PhoneFactorVerifySms" TechnicalProfileReferenceId="PhoneFactor-VerifySms" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimEquals" ExecuteActionsIf="false">
<Value>phoneMfaChoice</Value>
<Value>phone</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
<Precondition Type="ClaimEquals" ExecuteActionsIf="true">
<Value>skipPhoneFactor</Value>
<Value>True</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="PhoneFactorVerifyCall" TechnicalProfileReferenceId="PhoneFactor-VerifyCall" />
</ClaimsExchanges>
</OrchestrationStep>
</OrchestrationSteps>
</SubJourney>