Sub journeys
Sub journeys can be used to organize and simplify the flow of orchestration steps within a user journey. User journeys specify explicit paths through which a policy allows a relying party application to obtain the desired claims for a user. The user is taken through these paths to retrieve the claims that are to be presented to the relying party. In other words, user journeys define the business logic of what an end user goes through as the Azure AD B2C Identity Experience Framework processes the request. A user journey is represented as an orchestration sequence that must be followed through for a successful transaction. The ClaimsExchange element of an orchestration step is tied to a single technical profile that executes.
A sub journey is a grouping of orchestration steps that can be invoked at any point within a user journey. You can use sub journeys to create reusable step sequences or implement branching to better represent the business logic.
User journey branching
Sub journeys behave like user journeys, as both are represented as an orchestration sequence that must be followed through for a successful transaction. User journeys can be invoked on their own and require a SendClaims step to execute. Sub journeys are components of user journeys and cannot be invoked independently, and are always called from a user journey.
The key component of branching is to allow for better business logic processing in a user journey. Common orchestration steps are grouped into individual pieces to be invoked separately. A sub journey can simplify a journey where multiple orchestration steps are coupled together (having same preconditions). A sub journey is called only from a user journey, it shouldn't call another sub journey.
There are two types of sub journeys:
- Call - Returns control to the caller. The sub journey executes, and then control is returned to the orchestration step that is currently executing within the user journey.
- Transfer - Transfers control to the sub journey (irreversible branching). The sub journey must have a SendClaims step to return the claims back to the relying party application.
Example scenarios
Call sub journey
A Call sub journey is useful in the following scenarios:
- Age Gating: For age gating, there are many shared components among the user journeys. Branching allows to compile the common elements into sharable components.
- Parental Consent: Branching allows convenience in the parental consent design by allowing us to access claims from the user journey the minor executed, along with being able to branch into a parental consent user journey after finding the user requires consent.
- Sign up to sign in: Consider a scenario where a user already exists in the directory but may have forgotten that they had in fact created an account. It may be desirable in such a case that instead of telling the user that the credentials they have entered already exists and forcing the user to restart the journey that the policy is able to perform a switch from a sign up flow to a sign in flow for that user.
Transfer sub journey
A Transfer sub journey is useful in the following scenarios:
- Showing a block page.
- A/B testing by routing the request to a sub journey to execute and issue a token.
Adding a SubJourneys element
The following is an example of a SubJourney
element of type Call
, which returns control back to the user journey.
<SubJourneys>
<SubJourney Id="ConditionalAccess_Evaluation" Type="Call">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="ConditionalAccessEvaluation" TechnicalProfileReferenceId="ConditionalAccessEvaluation" />
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<Preconditions>
<Precondition Type="ClaimsExist" ExecuteActionsIf="false">
<Value>conditionalAccessClaimCollection</Value>
<Action>SkipThisOrchestrationStep</Action>
</Precondition>
</Preconditions>
<ClaimsExchanges>
<ClaimsExchange Id="GenerateCAClaimFlags" TechnicalProfileReferenceId="GenerateCAClaimFlags" />
</ClaimsExchanges>
</OrchestrationStep>
</OrchestrationSteps>
</SubJourney>
</SubJourneys>
The following is an example of a SubJourney
element of type Transfer
, which returns a token back to the relying party application.
<SubJourneys>
<SubJourney Id="B" Type="Transfer">
<OrchestrationSteps>
...
<OrchestrationStep Order="5" Type="SendClaims">
</OrchestrationSteps>
</SubJourney>
</SubJourneys>
Invoke a sub journey step
A new orchestration step of type InvokeSubJourney
is used to execute a sub journey. The following is an example showing all the execution elements of this orchestration step.
<OrchestrationStep Order="5" Type="InvokeSubJourney">
<JourneyList>
<Candidate SubJourneyReferenceId="ConditionalAccess_Evaluation" />
</JourneyList>
</OrchestrationStep>
Components
To define the sub journeys supported by the policy, add a SubJourneys element under the top-level element of the policy file.
The SubJourneys element contains the following element:
Element | Occurrences | Description |
---|---|---|
SubJourney | 1:n | A sub journey that defines all of the constructs necessary for a complete user flow. |
The SubJourneys element contains the following attributes:
Attribute | Required | Description |
---|---|---|
Id | Yes | The sub journey identifier that can be used to by the user journey to reference the sub journey in the policy. The SubJourneyReferenceId element of the Candidate element points to this attribute. |
Type | Yes | Possible values: Call , or Transfer . For more information, see User journey branching |
The SubJourney element contains the following element:
Element | Occurrences | Description |
---|---|---|
OrchestrationSteps | 1:n | An orchestration sequence that must be followed through for a successful transaction. Every user journey consists of an ordered list of orchestration steps that are executed in sequence. If any step fails, the transaction fails. |
OrchestrationSteps
For the complete list of orchestration step elements, see UserJourneys.
Next steps
Learn about UserJourneys