5

是否可以创建自定义策略来重置已知电子邮件的密码?

我使用 Graph API 创建用户并将邀请电子邮件发送到指定的电子邮件地址。

我希望用户单击该电子邮件中的链接并为其帐户设置密码。

我可以使用此电子邮件声明创建签名令牌,并将其作为断言发送到我的自定义策略。因此,策略将电子邮件作为输入声明。我在跟踪中看到它。

但我无法绕过密码重置过程中的电子邮件验证步骤 - 当我删除它时,我收到 500 服务器错误而没有其他详细信息。

我也尝试将用户的 objectId 作为输入声明发送,但它也无济于事。

有没有办法跳过电子邮件验证?

4

1 回答 1

6

您有以下选项可以改变用户体验:

  1. 将电子邮件地址显示为只读字段并删除电子邮件验证要求。
  2. 删除电子邮件验证步骤。

将电子邮件地址显示为只读字段

1)创建readOnlyEmail索赔类型:

<ClaimType Id="readOnlyEmail">
  <DisplayName>Email Address</DisplayName>
  <DataType>string</DataType>
  <UserInputType>Readonly</UserInputType>
</ClaimType>

2) 创建一个从声明复制到声明的声明email转换readOnlyEmail

<ClaimsTransformation Id="CopyFromEmailToReadOnlyEmail" TransformationMethod="FormatStringClaim">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="email" TransformationClaimType="inputClaim" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="stringFormat" DataType="string" Value="{0}" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="readOnlyEmail" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>

3) 将CopyFromEmailToReadOnlyEmail声明转换作为输入声明转换添加到LocalAccountDiscoveryUsingEmailAddress技术配置文件,然后将email声明类型替换readOnlyemail为作为此技术配置文件的输入和输出声明:

<TechnicalProfile Id="LocalAccountDiscoveryUsingEmailAddress">
  <DisplayName>Reset password using email address</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.localaccountpasswordreset</Item>
  </Metadata>
  <CryptographicKeys>
    <Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
  </CryptographicKeys>
  <IncludeInSso>false</IncludeInSso>
  <InputClaimsTransformations>
    <InputClaimsTransformation ReferenceId="CopyFromEmailToReadOnlyEmail" />
  </InputClaimsTransformations>
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="readOnlyEmail" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="readOnlyEmail" Required="true" />
    <OutputClaim ClaimTypeReferenceId="objectId" />
    <OutputClaim ClaimTypeReferenceId="userPrincipalName" />
    <OutputClaim ClaimTypeReferenceId="authenticationSource" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>

删除电子邮件验证步骤

PasswordReset1) 将旅程的第一步从:

<OrchestrationStep Order="1" Type="ClaimsExchange">
  <ClaimsExchanges>
    <ClaimsExchange Id="PasswordResetUsingEmailAddressExchange" TechnicalProfileReferenceId="LocalAccountDiscoveryUsingEmailAddress" />
  </ClaimsExchanges>
</OrchestrationStep>

至:

<OrchestrationStep Order="1" Type="ClaimsExchange">
  <ClaimsExchanges>
    <ClaimsExchange Id="UserReadUsingEmailAddressExchange" TechnicalProfileReferenceId="AAD-UserReadUsingEmailAddress" />
  </ClaimsExchanges>
</OrchestrationStep>
于 2018-04-19T23:18:19.703 回答