I have tried everything to resolve this error message when typing to upload this custom extension policy. The error message is not reflecting what is really happening. All of the claims have a DataType.
Error:
Validation failed: 1 validation error(s) found in policy "B2C_1A_TRUSTFRAMEWORKEXTENSIONS" of tenant "testtentant.onmicrosoft.com".Schema validation error found at line 34 col 12 in policy "B2C_1A_TRUSTFRAMEWORKEXTENSIONS" of tenant "testtentant.onmicrosoft.com": The required attribute 'DataType' is missing.Schema validation error found at line 34 col 12 in policy "B2C_1A_TRUSTFRAMEWORKEXTENSIONS" of tenant "testtentant.onmicrosoft.com": The required attribute 'DataType' is missing.
Config:
<BuildingBlocks>
<ClaimsSchema>
<ClaimType Id="email">
<DisplayName>Email Address</DisplayName>
<DataType>string</DataType>
<DefaultPartnerClaimTypes>
<Protocol Name="OAuth2" PartnerClaimType="email"/>
</DefaultPartnerClaimTypes>
<UserHelpText>Email used to sign in</UserHelpText>
</ClaimType>
<ClaimType Id="inviteToken">
<DisplayName>Invite Token</DisplayName>
<DataType>string</DataType>
<UserHelpText>Invite token for registration</UserHelpText>
</ClaimType>
<ClaimType Id="accountName">
<DisplayName>Account Name</DisplayName>
<DataType>string</DataType>
<UserHelpText>The account you're being invited to</UserHelpText>
</ClaimType>
<ClaimType Id="contactName">
<DisplayName>Contact Name</DisplayName>
<DataType>string</DataType>
<UserHelpText>Your name as a contact</UserHelpText>
</ClaimType>
</ClaimsSchema>
<ClaimsTransformations>
<ClaimsTransformation Id="SetEmailReadOnly" TransformationMethod="FormatString">
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim"/>
</InputClaims>
<InputParameters>
<InputParameter Id="stringFormat">{0}</InputParameter>
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="outputClaim"/>
</OutputClaims>
</ClaimsTransformation>
</ClaimsTransformations>
</BuildingBlocks>
<ClaimsProviders>
<ClaimsProvider>
<DisplayName>REST API</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="REST-GetEmailFromInviteToken">
<DisplayName>Get Email From Invite Token</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider"/>
<Metadata>
<Item Key="ServiceUrl">https://function7267.ngrok.io/api/ContactInviteSignUp</Item>
<Item Key="SendClaimsIn">Body</Item>
<Item Key="AuthenticationType">None</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="inviteToken" Required="true"/>
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email"/>
<OutputClaim ClaimTypeReferenceId="accountName"/>
<OutputClaim ClaimTypeReferenceId="contactName"/>
</OutputClaims>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
<ClaimsProvider>
<DisplayName>Self Asserted</DisplayName>
<TechnicalProfiles>
<TechnicalProfile Id="SelfAsserted-LocalAccountSignUp-ReadOnlyEmail">
<DisplayName>Local Account Sign Up (ReadOnly Email)</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider"/>
<Metadata>
<Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
<Item Key="ReadOnlyClaimNames">email,accountName,contactName</Item>
</Metadata>
<InputClaims>
<InputClaim ClaimTypeReferenceId="email"/>
<InputClaim ClaimTypeReferenceId="inviteToken"/>
<InputClaim ClaimTypeReferenceId="accountName"/>
<InputClaim ClaimTypeReferenceId="contactName"/>
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" Required="true"/>
<OutputClaim ClaimTypeReferenceId="newPassword" Required="true"/>
<OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true"/>
<OutputClaim ClaimTypeReferenceId="inviteToken"/>
<OutputClaim ClaimTypeReferenceId="accountName"/>
<OutputClaim ClaimTypeReferenceId="contactName"/>
</OutputClaims>
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="AAD-UserWriteUsingLogonEmail"/>
</ValidationTechnicalProfiles>
</TechnicalProfile>
</TechnicalProfiles>
</ClaimsProvider>
</ClaimsProviders>
<UserJourneys>
<UserJourney Id="SignUpWithInviteToken">
<OrchestrationSteps>
<OrchestrationStep Order="1" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="GetEmailFromInviteToken" TechnicalProfileReferenceId="REST-GetEmailFromInviteToken"/>
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="2" Type="ClaimsExchange">
<ClaimsExchanges>
<ClaimsExchange Id="SignUpWithReadOnlyEmail" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignUp-ReadOnlyEmail"/>
</ClaimsExchanges>
</OrchestrationStep>
<OrchestrationStep Order="3" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer"/>
</OrchestrationSteps>
</UserJourney>
</UserJourneys>
<ClaimsTransformation Id="SetEmailReadOnly" TransformationMethod="FormatString">
<InputClaims>
<InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim"/>
</InputClaims>
<InputParameters>
<InputParameter Id="stringFormat" DataType="string" Value="{0}"/>
</InputParameters>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" TransformationClaimType="outputClaim"/>
</OutputClaims>
</ClaimsTransformation>