没有电子邮件验证步骤的 Azure AD B2C 密码重置策略
Azure AD B2C Password Reset policy without email verification step
是否可以创建自定义策略来为已知电子邮件重置密码?
我使用 Graph API 创建用户并将邀请电子邮件发送到指定的电子邮件
地址。
我希望用户单击该电子邮件中的 link 并为其帐户设置密码。
我可以使用此电子邮件声明创建签名令牌并将其作为声明发送到我的自定义策略。因此政策将电子邮件作为输入声明。我在痕迹中看到了它。
但我无法绕过密码重置过程中的电子邮件验证步骤 - 当我删除它时,我收到 500 服务器错误,没有其他详细信息。
我也尝试为用户发送 objectId 作为输入声明,但这也无济于事。
有没有办法跳过邮箱验证?
您有以下选项可以改变用户体验:
- 将电子邮件地址显示为只读字段并删除电子邮件验证要求。
- 删除电子邮件验证步骤。
将电子邮件地址显示为只读字段
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>
删除电子邮件验证步骤
1) 将 PasswordReset
旅程的第一步更改为:
<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>
是否可以创建自定义策略来为已知电子邮件重置密码?
我使用 Graph API 创建用户并将邀请电子邮件发送到指定的电子邮件 地址。
我希望用户单击该电子邮件中的 link 并为其帐户设置密码。
我可以使用此电子邮件声明创建签名令牌并将其作为声明发送到我的自定义策略。因此政策将电子邮件作为输入声明。我在痕迹中看到了它。
但我无法绕过密码重置过程中的电子邮件验证步骤 - 当我删除它时,我收到 500 服务器错误,没有其他详细信息。
我也尝试为用户发送 objectId 作为输入声明,但这也无济于事。
有没有办法跳过邮箱验证?
您有以下选项可以改变用户体验:
- 将电子邮件地址显示为只读字段并删除电子邮件验证要求。
- 删除电子邮件验证步骤。
将电子邮件地址显示为只读字段
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>
删除电子邮件验证步骤
1) 将 PasswordReset
旅程的第一步更改为:
<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>