具有用户名登录的Azure AD B2C自定义策略

时间:2018-10-09 18:03:56

标签: azure-ad-b2c

我们已根据Custom B2C Policy for Username based Local Accounts答案中的说明在Azure AD B2C中创建了自定义IEF策略,以允许使用用户名标识的本地帐户进行注册和登录。尝试从IEF运行SignUpOrSignIn策略时,它在登录UI上显示以下异常。

  

AADB2C:发生异常。

启用Application Insights日志记录后,我们捕获了以下致命异常:

  

租户'xxxxxxxxxx.onmicrosoft.com'的策略'B2C_1A_signup_signin中的编排步骤'1'指定了多个启用的确认声明交换

编排步骤配置如下:

<UserJourney Id="SignUpOrSignIn">
    <OrchestrationSteps>
        <OrchestrationStep Order="1" Type="CombinedSignInAndSignUp" ContentDefinitionReferenceId="api.signuporsignin">
            <ClaimsProviderSelections>
                <ClaimsProviderSelection ValidationClaimsExchangeId="LocalAccountSigninUsernameExchange" />
            </ClaimsProviderSelections>
            <ClaimsExchanges>
                <ClaimsExchange Id="LocalAccountSigninUsernameExchange" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignin-Username" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="2" Type="ClaimsExchange">
            <Preconditions>
                <Precondition Type="ClaimsExist" ExecuteActionsIf="true">
                    <Value>objectId</Value>
                    <Action>SkipThisOrchestrationStep</Action>
                </Precondition>
            </Preconditions>
            <ClaimsExchanges>
                <ClaimsExchange Id="SignUpWithLogonUsernameExchange" TechnicalProfileReferenceId="LocalAccountSignUpWithLogonName" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <!-- This step reads any user attributes that we may not have received when in the token. -->
        <OrchestrationStep Order="3" Type="ClaimsExchange">
            <ClaimsExchanges>
                <ClaimsExchange Id="AADUserReadWithObjectId" TechnicalProfileReferenceId="AAD-UserReadUsingObjectId" />
            </ClaimsExchanges>
        </OrchestrationStep>
        <OrchestrationStep Order="4" Type="SendClaims" CpimIssuerTechnicalProfileReferenceId="JwtIssuer" />
    </OrchestrationSteps>
    <ClientDefinition ReferenceId="DefaultWeb" />
</UserJourney>

参考技术资料如下:

<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Username">
    <DisplayName>Local Account Signin</DisplayName>
    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
    <Metadata>
        <Item Key="SignUpTarget">SignUpWithLogonUsernameExchange</Item>
        <Item Key="setting.operatingMode">Username</Item>
        <Item Key="ContentDefinitionReferenceId">api.selfasserted</Item>
    </Metadata>
    <IncludeInSso>false</IncludeInSso>
    <InputClaims>
        <InputClaim ClaimTypeReferenceId="signInName" />
    </InputClaims>
    <OutputClaims>
        <OutputClaim ClaimTypeReferenceId="signInName" Required="true" />
        <OutputClaim ClaimTypeReferenceId="password" Required="true" />
        <OutputClaim ClaimTypeReferenceId="objectId" />
        <OutputClaim ClaimTypeReferenceId="authenticationSource" />
    </OutputClaims>
    <ValidationTechnicalProfiles>
        <ValidationTechnicalProfile ReferenceId="login-NonInteractive" />
    </ValidationTechnicalProfiles>
    <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD" />
</TechnicalProfile>

我们无法在Google或SO上找到对此错误的任何引用,并且无法找出在哪里可以进行多个启用的验证声明交换?最好的发现是,基本配置的某些部分没有被扩展配置适当地覆盖,因此它会看到重复的内容?

1 个答案:

答案 0 :(得分:0)

您是对的,基本配置没有被覆盖。我们做了以下修复。

在TrustFrameworkExtensions.xml

将ID更改为其他内容

<UserJouney id="SignUpOrSignInUsername">
  ...OrchestrationSteps
</UserJourney>

然后在SignUpOrSignIn.xml中导航

将referenceid更改为您在extenstions.xml中放置的内容

<DefaultUserJourney ReferenceId="SignUpOrSignInUsername" />