首页 > 解决方案 > 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 支持,我们已经与他们打了几个电话,但看起来他们不知道为什么会发生这种情况,他们也无法帮助我们解决这个问题。

任何建议都非常受欢迎。

标签: azuremigrationazure-ad-b2cjitazure-ad-b2c-custom-policy

解决方案


推荐阅读