【问题标题】:Can you pass password claims between steps in Azure AD B2C Custom Policies?能否在 Azure AD B2C 自定义策略中的步骤之间传递密码声明?
【发布时间】:2018-08-17 09:59:36
【问题描述】:

能否在 Azure AD B2C 自定义策略中的步骤之间传递密码声明?

我的症状是,在使用多页自定义策略注册后,用户在重置密码之前无法登录。

我问这个问题是因为我花了很多时间调试一个问题,结果发现它无法解决。我在另一个措辞不同但症状相似的问题 (Azure AD B2C Multi steps custom policy) 下找到了答案。

我在这里发帖是希望它更容易找到并对其他人有所帮助。如果您认为这是重复的,请道歉。

【问题讨论】:

    标签: azure azure-ad-b2c


    【解决方案1】:

    简而言之,没有。见Azure AD B2C Multi steps custom policy

    密码声明被“限定”到给定的步骤。这意味着从最终用户收集密码声明的编排步骤必须与将其写入用户对象的步骤相同。

    【讨论】:

      【解决方案2】:

      我一直在寻找相同的方法,并找到了一种进行多步骤注册的方法。我尝试了几种方法,包括将密码存储在另一个声明中的 outputclaims 转换,但没有成功。因为我已经需要对 API 进行一些输入验证,所以我找到了一种将密码复制到新声明(plaintextPassword)的方法,该声明不限于一个编排步骤。此声明可用于后续步骤,以使用 plaintextPassword 声明提供的密码创建用户帐户。

      创建具有输入声明(密码)和验证技术配置文件的自我声明技术配置文件。在验证技术配置文件中,您可以使用 inputclaims 转换将密码复制到字符串类型的声明。然后将新声明作为 outputclaim 添加到验证配置文件和技术配置文件中。示例见以下代码:

        <ClaimType Id="plaintextPassword">
          <DisplayName>password</DisplayName>
          <DataType>string</DataType>
          <UserInputType>TextBox</UserInputType>
        </ClaimType>
      
        <ClaimType Id="password">
          <DisplayName>Your password</DisplayName>
          <DataType>string</DataType>
          <UserHelpText>Your password</UserHelpText>
          <UserInputType>Password</UserInputType>
        </ClaimType>
      
        <ClaimsTransformation Id="CopyPassword" TransformationMethod="FormatStringClaim">
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="password" TransformationClaimType="inputClaim" />
          </InputClaims>
          <InputParameters>
            <InputParameter Id="stringFormat" DataType="string" Value="{0}" />
          </InputParameters>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="plaintextPassword" TransformationClaimType="outputClaim" />
          </OutputClaims>
        </ClaimsTransformation>
      
        <TechnicalProfile Id="SignUp-PasswordValidation">
          <DisplayName>Email signup</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="ServiceUrl">url</Item>
            <Item Key="AuthenticationType">ClientCertificate</Item>
            <Item Key="SendClaimsIn">Body</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="ClientCertificate" StorageReferenceId="B2C_1A_ClientCertificate" />
          </CryptographicKeys>
          <InputClaimsTransformations>
            <InputClaimsTransformation ReferenceId="CopyPassword" />
          </InputClaimsTransformations>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="claim_to_validate" PartnerClaimType="claim_to_validate" />
          </InputClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="plaintextPassword" />
          </OutputClaims>
          <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
        </TechnicalProfile>
      
        <TechnicalProfile Id="SignUp">
          <DisplayName>Email signup</DisplayName>
          <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
          <Metadata>
            <Item Key="IpAddressClaimReferenceId">IpAddress</Item>
            <Item Key="ContentDefinitionReferenceId">api.localaccountsignup</Item>
            <Item Key="setting.retryLimit">3</Item>
          </Metadata>
          <CryptographicKeys>
            <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
          </CryptographicKeys>
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="email" />
          </InputClaims>
          <OutputClaims>
            <OutputClaim ClaimTypeReferenceId="email" Required="true" />
            <OutputClaim ClaimTypeReferenceId="claim_to_validate" Required="true" />
            <OutputClaim ClaimTypeReferenceId="password" Required="true" />
            <OutputClaim ClaimTypeReferenceId="executed-SelfAsserted-Input" DefaultValue="true" />
            <OutputClaim ClaimTypeReferenceId="plaintextPassword" />
          </OutputClaims>
          <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="SignUp-Validation" />
          </ValidationTechnicalProfiles>
        </TechnicalProfile>
      

      在您在 AAD 中创建用户的技术配置文件中添加以下行:

        <PersistedClaim ClaimTypeReferenceId="plaintextPassword" PartnerClaimType="password"/>
      

      【讨论】:

        【解决方案3】:

        我能够解决问题。当我们必须添加用户信息 (LocalAccountSignUpWithLogonEmail) 时,我删除了调用 AAD 中编写的技术配置文件的验证,我将其更改为调用另一个技术配置文件的验证。这将通过 ClaimsTransformation 复制我们的密码,该转换会将我们的密码保存在另一个 InputClaim 中,以便在我们流程的任何其他步骤中可见。

        <ClaimType Id="plaintextPassword">
            <DisplayName>password</DisplayName>
            <DataType>string</DataType>
        </ClaimType>
        
        <ClaimType Id="passwordTransformation">
            <DisplayName>requestSocialRestSecondCall</DisplayName>
            <DataType>string</DataType>
        </ClaimType>
        
        <ValidationTechnicalProfiles>
            <ValidationTechnicalProfile ReferenceId="TransformationPassword" />
        </ValidationTechnicalProfiles>
        
        
        <ClaimsProvider> <!-- Copy Password-->
            <DisplayName>Copy Password</DisplayName>
            <TechnicalProfiles> 
        
                <TechnicalProfile Id="TransformationPassword">
                    <DisplayName>Copy Pass</DisplayName>
                    <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
                    <InputClaims>
                        <InputClaim ClaimTypeReferenceId="passwordTransformation" />
                    </InputClaims>
                    <OutputClaims>
                        <OutputClaim ClaimTypeReferenceId="passwordTransformation" />
                    </OutputClaims>
                    <OutputClaimsTransformations>
                        <OutputClaimsTransformation ReferenceId="Generate_TranformationPassword" />
                    </OutputClaimsTransformations>
                </TechnicalProfile>
        
            </TechnicalProfiles>
        </ClaimsProvider>
        
        
        
         <ClaimsTransformation Id="Generate_TranformationPassword" TransformationMethod="CopyClaim">
            <InputClaims>
                <InputClaim ClaimTypeReferenceId="newPassword" TransformationClaimType="inputClaim" />
            </InputClaims>
            <OutputClaims>
                <OutputClaim ClaimTypeReferenceId="plaintextPassword" TransformationClaimType="outputClaim" />
            </OutputClaims>
        </ClaimsTransformation>

        【讨论】:

          【解决方案4】:

          我删除了调用 AAD 中编写的技术配置文件的验证,并将其更改为调用另一个技术配置文件的验证。

          这将通过 ClaimsTransformation 复制密码,该转换会将我们的密码保存在另一个 InputClaim 中,以便在我们流程的任何其他步骤中可见。

          <TechnicalProfile Id="SignUp-PasswordValidation">
           <Metadata>
                <Item Key="ServiceUrl">url</Item>
                <Item Key="AuthenticationType">ClientCertificate</Item>
                <Item Key="SendClaimsIn">Body</Item>
           </Metadata>
          
          What is the url you used?
          
          <CryptographicKeys>
              <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
          </CryptographicKeys>
          
          What was you application to create the Secret?

          【讨论】:

          • 您能否添加说明,即使它很短。解释这如何解决问题以及应如何/在何处添加此代码。
          • 您好,我能够解决问题。当我们必须添加用户信息 (LocalAccountSignUpWithLogonEmail) 时,我删除了调用 AAD 中编写的技术配置文件的验证,我将其更改为调用另一个技术配置文件的验证。这将通过 ClaimsTransformation 复制我们的密码,该转换会将我们的密码保存在另一个 InputClaim 中,以便在我们流程的任何其他步骤中可见。
          猜你喜欢
          • 1970-01-01
          • 2018-03-28
          • 2019-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多