azure - Azure B2 - jit 迁移无法在密码重置时对用户进行身份验证 - 全部使用自定义策略配置
问题描述
因此,我一直参与使用自定义策略实施 Azure B2C。
我试图从这个 git repo https://github.com/azure-ad-b2c/user-migration/tree/master/jit-migration-v2遵循 jit v2 迁移过程
所以遗留系统是 .net framework 4.6.2 和 MS SQL 数据库。在 owin 库的帮助下,我设法实现了 B2C 所需的所有功能。
因此,B2C 应该在忘记密码过程之后将用户重定向回我们的网站,并且它确实重定向但用户未经过身份验证。相反,我们得到了这个通用错误:
“OpenIdConnectMessage.Error 不为空,表示错误。错误:'server_error'。Error_Description(可能为空):'AADB2C90037:处理请求时发生错误。请联系您尝试访问的站点的管理员。相关 ID :d38ccb08-4c77-4716-97e0-465f0aebfeb6 时间戳:2021-08-09 08:34:22Z '。Error_Uri(可能为空):'error_uri 为空'。”
我需要说的是,当用户已经迁移到 B2C 时,使用经过身份验证的重定向返回的忘记密码过程一切正常。该问题仅在用户是非迁移用户时发生。除了某些 ValidationTechnicalProfile 以用户是否已迁移为条件外,这两种方案都使用相同的自定义策略。
这是我们负责密码重置过程的自定义策略的一部分:
<!-- PASSWORD RESET first page -->
<TechnicalProfile Id="PasswordResetFirstPage">
<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="EnforceEmailVerification">True</Item>
<Item Key="IpAddressClaimReferenceId">IpAddress</Item>
<Item Key="ContentDefinitionReferenceId">api.localaccountpasswordreset</Item>
<Item Key="UserMessageIfClaimsTransformationBooleanValueIsNotEqual">Your account has been locked. Contact your support person to unlock it, then try again.</Item>
</Metadata>
<CryptographicKeys>
<Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
</CryptographicKeys>
<IncludeInSso>false</IncludeInSso>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="email" PartnerClaimType="Verified.Email" Required="true" />
<OutputClaim ClaimTypeReferenceId="objectId" />
<OutputClaim ClaimTypeReferenceId="userPrincipalName" />
<OutputClaim ClaimTypeReferenceId="authenticationSource" />
</OutputClaims>
<!-- NOTE: Remove the validation technical profile to the extension policy -->
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="AAD-UserReadUsingEmailAddress" ContinueOnError="true" />
<ValidationTechnicalProfile ReferenceId="REST-UserMigration-LocalAccount-PasswordReset1" ContinueOnError="false" />
</ValidationTechnicalProfiles>
</TechnicalProfile>
<!-- PASSWORD RESET second page -->
<TechnicalProfile Id="PasswordResetSecondPage">
<DisplayName>Change password (username)</DisplayName>
<Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
<Metadata>
<Item Key="ContentDefinitionReferenceId">api.localaccountpasswordreset</Item>
</Metadata>
<CryptographicKeys>
<Key Id="issuer_secret" StorageReferenceId="B2C_1A_TokenSigningKeyContainer" />
</CryptographicKeys>
<InputClaims>
<InputClaim ClaimTypeReferenceId="objectId" />
</InputClaims>
<OutputClaims>
<OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
<OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
</OutputClaims>
<!-- NOTE: Remove the validation technical profile to the extension policy -->
<ValidationTechnicalProfiles>
<ValidationTechnicalProfile ReferenceId="AAD-UserWritePasswordUsingObjectId">
<!--Don't run this validation technical profile if objectId is not exists (migrated acccount)-->
<Preconditions>
<Precondition Type="ClaimsExist" ExecuteActionsIf="false">
<Value>objectId</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
<ValidationTechnicalProfile ReferenceId="REST-UserMigration-LocalAccount-PasswordReset2">
<!--Don't run this validation technical profile if objectId is exists (existing acccount)-->
<Preconditions>
<Precondition Type="ClaimsExist" ExecuteActionsIf="true">
<Value>objectId</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
<ValidationTechnicalProfile ReferenceId="AAD-MigrateUserUsingLogonEmail">
<!--Don't run this validation technical profile if objectId is exists (existing acccount)-->
<Preconditions>
<Precondition Type="ClaimsExist" ExecuteActionsIf="true">
<Value>objectId</Value>
<Action>SkipThisValidationTechnicalProfile</Action>
</Precondition>
</Preconditions>
</ValidationTechnicalProfile>
<ValidationTechnicalProfile ReferenceId="REST-UserMigration-PasswordUpdate" ContinueOnError="false" />
</ValidationTechnicalProfiles>
</TechnicalProfile>
一般来说,整个过程运行良好:用户迁移到 B2C 并重置密码,但实际重定向回我们的网站只是没有经过身份验证。到目前为止,我们设法实现的唯一解决方法是将用户重定向回登录页面,但最好了解正在发生的事情并修复它。
我还需要提及的是,相同的迁移步骤对于想要登录的非迁移用户来说效果很好,并且这种情况没有问题。
我们已经联系了 azure 支持,我们已经与他们打了几个电话,但看起来他们不知道为什么会发生这种情况,他们也无法帮助我们解决这个问题。
任何建议都非常受欢迎。
解决方案
推荐阅读
- reactjs - react-hook-form yup 解析器,reactStrap 解决子组件错误的问题
- java - Firebase 实时数据库未更新 // 数据未添加到 Firebase 实时数据库
- rspec - 如何在 rspec 中使用 capybara 点击导航栏中的链接?
- python - 如何尝试使用 python 记录到记录器的异常
- jquery - 尝试在 laravel 中使用 ajax 保存文件,但不知道我的代码有什么问题
- ansible - 在 sdout 中匹配通配符时如何使 Ansible 失败?
- dask - 为什么将 eofs.xarray.Eof 应用于分块数组时会引发错误?
- python - Python:获取不同于限制和零的值的索引
- excel - 试图通过将公式中的单元格锁定一段时间来将值复制到 Excel 中的一行?
- vba - 如何使用所有清晰的表单控件进入新记录