您可以在Azure AD B2C自定义策略的步骤之间传递密码声明吗?

时间:2018-08-17 09:59:37

标签: azure azure-ad-b2c

您可以在Azure AD B2C自定义策略的步骤之间传递密码声明吗?

我的症状是,使用多页自定义策略进行注册后,用户只有在重置密码后才能登录。

我问这个问题是因为我花了很多时间来调试一个原来无法修复的问题。我在另一个问题(Azure AD B2C Multi steps custom policy)下找到了答案,这个问题的措词不同,但症状相似。

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

2 个答案:

答案 0 :(得分:1)

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

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

  <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"/>

答案 1 :(得分:0)

简而言之,不。参见Azure AD B2C Multi steps custom policy

  

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