基于历史记录或其他用户属性的密码规则

时间:2019-02-06 21:03:15

标签: azure-ad-b2c

AAD B2C中是否有任何设施可以阻止用户使用名称相同或以前曾被同一用户使用过的密码?我可以通过IEF策略和REST功能来实现前者吗? (我怀疑没有假设我的代码在任何阶段都无法访问pwd值,但也许我是错的,pwd声明只是另一种声明)

1 个答案:

答案 0 :(得分:2)

如果您要为此实施REST API,则自定义策略可以验证新密码。

例如,对于密码重置,您可以添加一个调用REST API的验证技术配置文件,以根据密码历史记录检查新密码是否对当前用户有效,而添加另一个验证技术配置文件,调用REST API来然后将当前用户的新密码保存在密码历史记录中:

<TechnicalProfile Id="LocalAccountWritePasswordUsingObjectId">
  <DisplayName>Change password (username)</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.SelfAssertedAttributeProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  ...
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="objectId" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="newPassword" Required="true" />
    <OutputClaim ClaimTypeReferenceId="reenterPassword" Required="true" />
  </OutputClaims>
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="API-CheckNewPassword" />
    <ValidationTechnicalProfile ReferenceId="AAD-UserWritePasswordUsingObjectId" />
    <ValidationTechnicalProfile ReferenceId="API-SaveNewPassword" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>

为了安全起见,最好在将新密码传递给REST API之前对其进行哈希处理(尽管这将限制REST API是否可以确定新密码是否包含用户名)。

您可以使用the Hash claims transformation对新密码进行哈希处理:

<ClaimsTransformation Id="HashNewPassword" TransformationMethod="Hash">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="newPassword" TransformationClaimType="plaintext" />
    <InputClaim ClaimTypeReferenceId="objectId" TransformationClaimType="salt" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="randomizerSecret" DataType="string" Value="B2C_1A_MyRandomizerSecret" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="newPasswordHash" TransformationClaimType="hash" />
  </OutputClaims>
</ClaimsTransformation>
<ClaimsProvider>
  <DisplayName>APIs</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="API-CheckNewPassword">
      <DisplayName>Check New Password API</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      ...
      <InputClaimTransformations>
        <InputClaimTransformation ReferenceId="HashNewPassword" />
      </InputClaimTransformations>
      <InputClaims>
        <InputClaim ClaimTypeReferenceId="objectId" />
        <InputClaim ClaimTypeReferenceId="newPasswordHash" />
      </InputClaims>
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>