Predicates y PredicateValidations

Nota:

En Azure Active Directory B2C, las directivas personalizadas se han diseñado principalmente para abordar escenarios complejos. Para la mayoría de los escenarios, se recomienda usar flujos de usuario integrados. Si no lo ha hecho, obtenga información sobre el paquete de inicio de directivas personalizadas en Introducción a las directivas personalizadas en Active Directory B2C.

Los elementos Predicates y PredicateValidations le permiten realizar un proceso de validación para asegurarse de que solo se introducen datos con el formato adecuado en el inquilino de Azure Active Directory B2C (Azure AD B2C).

En el siguiente diagrama se muestra la relación entre los elementos:

Diagrama que muestra las relaciones de los elementos Predicates y PredicateValidations

Predicados

El elemento Predicate define una validación básica para comprobar el valor de un tipo de notificación y devuelve true o false. La validación se realiza mediante el uso de un elemento Method especificado y un conjunto de elementos Parameter relevantes para el método. Por ejemplo, un predicado puede comprobar si la longitud de un valor de notificación de cadena está dentro del intervalo de parámetros mínimos y máximos especificados, o si un valor de notificación de cadena contiene un juego de caracteres. Si se produce un error en la comprobación, el elemento UserHelpText proporciona un mensaje de error para los usuarios. El valor del elemento UserHelpText se puede localizar mediante la personalización de idioma.

El elemento Predicados debe aparecer directamente después del elemento ClaimsSchema en el elemento BuildingBlocks.

El elemento Predicates contiene el elemento siguiente:

Elemento Repeticiones Descripción
Predicate 1:n Una lista de predicados.

El elemento Predicate contiene los siguientes atributos:

Atributo Obligatorio Descripción
Identificador Un identificador que se usa para el predicado. Hay otros elementos que pueden usar este identificador en la directiva.
Método El tipo de método que se usará para la validación. Valores posibles: IsLengthRange, MatchesRegex, IncludesCharacters o IsDateRange.
HelpText No S se produce un error en la comprobación, un mensaje de error para los usuarios. Esta cadena se puede localizar con la personalización de idioma.

El elemento Predicate contiene los siguientes elementos:

Elemento Repeticiones Descripción
UserHelpText 0:1 (En desuso) Un mensaje de error para los usuarios si se produce un error en la comprobación.
Parámetros 1:1 Parámetros para el tipo de método de la validación de cadenas.

El elemento Parameters contiene los siguientes elementos:

Elemento Repeticiones Descripción
Parámetro 1:n Parámetros para el tipo de método de la validación de cadenas.

El elemento Parameter contiene los siguientes atributos:

Elemento Repeticiones Descripción
Identificador 1:1 Identificador del parámetro.

Métodos de predicado

IsLengthRange

El método IsLengthRange comprueba si la longitud de un valor de notificación de cadena está dentro del intervalo de parámetros mínimos y máximos especificados. Consulte la demo en directo de este método de predicado. El elemento de predicado admite los siguientes parámetros:

Parámetro Obligatorio Descripción
Máxima Número máximo de caracteres que se pueden especificar.
Mínima Número mínimo de caracteres que se deben especificar.

En el ejemplo siguiente se muestra un método IsLengthRange con los parámetros Minimum y Maximum que especifican el intervalo de longitud de la cadena:

<Predicate Id="IsLengthBetween8And64" Method="IsLengthRange" HelpText="The password must be between 8 and 64 characters.">
  <Parameters>
    <Parameter Id="Minimum">8</Parameter>
    <Parameter Id="Maximum">64</Parameter>
  </Parameters>
</Predicate>

MatchesRegex

El método MatchesRegex comprueba si un valor de notificación de cadena coincide con una expresión regular. Consulte la demo en directo de este método de predicado. El elemento de predicado admite los siguientes parámetros:

Parámetro Obligatorio Descripción
RegularExpression Patrón de expresión regular del que van a buscarse coincidencias.

En el ejemplo siguiente se muestra un método MatchesRegex con el parámetro RegularExpression que especifica una expresión regular:

<Predicate Id="PIN" Method="MatchesRegex" HelpText="The password must be numbers only.">
  <Parameters>
    <Parameter Id="RegularExpression">^[0-9]+$</Parameter>
  </Parameters>
</Predicate>

IncludesCharacters

El método IncludesCharacters comprueba si un valor de notificación de cadena contiene un juego de caracteres. Consulte la demo en directo de este método de predicado. El elemento de predicado admite los siguientes parámetros:

Parámetro Obligatorio Descripción
CharacterSet El conjunto de caracteres que se pueden especificar. Por ejemplo, caracteres en minúscula a-z, caracteres en mayúscula A-Z, dígitos 0-9 o una lista de símbolos, como @#$%^&amp;*\-_+=[]{}|\\:',?/~"();!.

En el ejemplo siguiente se muestra un método IncludesCharacters con el parámetro CharacterSet que especifica un juego de caracteres:

<Predicate Id="Lowercase" Method="IncludesCharacters" HelpText="a lowercase letter">
  <Parameters>
    <Parameter Id="CharacterSet">a-z</Parameter>
  </Parameters>
</Predicate>

IsDateRange

El método IsDateRange comprueba si un valor de notificación de fecha se encuentra dentro de un intervalo de parámetros mínimos y máximos especificados. Consulte la demo en directo de este método de predicado. El elemento de predicado admite los siguientes parámetros:

Parámetro Obligatorio Descripción
Máxima La fecha más larga posible que se puede especificar. El formato de la fecha sigue la convención yyyy-mm-dd o Today.
Mínima La fecha más corta posible que se puede especificar. El formato de la fecha sigue la convención yyyy-mm-dd o Today.

En el ejemplo siguiente se muestra un método IsDateRange con los parámetros Minimum y Maximum que especifican el intervalo de fechas con un formato de yyyy-mm-dd y Today.

<Predicate Id="DateRange" Method="IsDateRange" HelpText="The date must be between 1970-01-01 and today.">
  <Parameters>
    <Parameter Id="Minimum">1970-01-01</Parameter>
    <Parameter Id="Maximum">Today</Parameter>
  </Parameters>
</Predicate>

PredicateValidations

Mientras que los predicados definen la validación que se va a comparar con un tipo de notificación, PredicateValidations agrupa un conjunto de predicados para formar una validación de entrada de usuario que se puede aplicar a un tipo de notificación. Cada elemento PredicateValidation contiene un conjunto de elementos PredicateGroup que contienen un conjunto de elementos PredicateReference que dirigen a un elemento Predicate. Para pasar la validación, el valor de la notificación debe superar todas las pruebas de cualquier predicado en todo el PredicateGroup con su conjunto de elementos PredicateReference.

El elemento PredicateValidations debe aparecer directamente después del elemento Predicados en el elemento BuildingBlocks.

<PredicateValidations>
  <PredicateValidation Id="">
    <PredicateGroups>
      <PredicateGroup Id="">
        <UserHelpText></UserHelpText>
        <PredicateReferences MatchAtLeast="">
          <PredicateReference Id="" />
          ...
        </PredicateReferences>
      </PredicateGroup>
      ...
    </PredicateGroups>
  </PredicateValidation>
...
</PredicateValidations>

El elemento PredicateValidations contiene el elemento siguiente:

Elemento Repeticiones Descripción
PredicateValidation 1:n Una lista de validación de predicados.

El elemento PredicateValidation contiene el atributo siguiente:

Atributo Obligatorio Descripción
Identificador Un identificador que se usa para la validación del predicado. El elemento ClaimType puede usar este identificador en la directiva.

El elemento PredicateValidation contiene el elemento siguiente:

Elemento Repeticiones Descripción
PredicateGroups 1:n Una lista de grupos de predicados.

El elemento PredicateGroups contiene el elemento siguiente:

Elemento Repeticiones Descripción
PredicateGroup 1:n Una lista de predicados.

El elemento PredicateGroup contiene el atributo siguiente:

Atributo Obligatorio Descripción
Identificador Un identificador que se usa para el grupo de predicados.

El elemento PredicateGroup contiene los elementos siguientes:

Elemento Repeticiones Descripción
UserHelpText 0:1 Una descripción del predicado que puede ser útil para que los usuarios sepan qué valor deben introducir.
PredicateReferences 1:n Una lista de referencias de predicados.

El elemento PredicateReferences contiene los siguientes atributos:

Atributo Obligatorio Descripción
MatchAtLeast No Especifica que el valor debe coincidir por lo menos con ese número de definiciones de predicado para que la entrada se acepte. Si no se especifica, el valor debe coincidir con todas las definiciones de predicado.

El elemento PredicateReferences contiene los siguientes elementos:

Elemento Repeticiones Descripción
PredicateReference 1:n Una referencia a un predicado.

El elemento PredicateReference contiene los siguientes atributos:

Atributo Obligatorio Descripción
Identificador Un identificador que se usa para la validación del predicado.

Configurar la complejidad de la contraseña

Con Predicates y PredicateValidationsInput puede controlar los requisitos de complejidad para las contraseñas proporcionadas por un usuario al crear una cuenta. De forma predeterminada, Azure AD B2C utiliza contraseñas seguras. Azure AD B2C también admite opciones de configuración para controlar la complejidad de las contraseñas que los clientes pueden usar. Puede definir la complejidad de la contraseña mediante el uso de estos predicados:

  • IsLengthBetween8And64 con el método IsLengthRange valida que la contraseña debe tener entre 8 y 64 caracteres.
  • Lowercase con el método IncludesCharacters valida que la contraseña contiene una letra minúscula.
  • Uppercase con el método IncludesCharacters valida que la contraseña contiene una letra mayúscula.
  • Number con el método IncludesCharacters valida que la contraseña contiene un dígito.
  • Symbol con el método IncludesCharacters valida que la contraseña contiene uno de los diversos caracteres de símbolos.
  • PIN con el método MatchesRegex valida que la contraseña solo contiene números.
  • AllowedAADCharacters con el método MatchesRegex valida que se ha proporcionado el único carácter no válido de la contraseña.
  • DisallowedWhitespace con el método MatchesRegex valida que la contraseña no empiece ni termine con un carácter de espacio en blanco.
<Predicates>
  <Predicate Id="IsLengthBetween8And64" Method="IsLengthRange" HelpText="The password must be between 8 and 64 characters.">
    <Parameters>
      <Parameter Id="Minimum">8</Parameter>
      <Parameter Id="Maximum">64</Parameter>
    </Parameters>
  </Predicate>

  <Predicate Id="Lowercase" Method="IncludesCharacters" HelpText="a lowercase letter">
    <Parameters>
      <Parameter Id="CharacterSet">a-z</Parameter>
    </Parameters>
  </Predicate>

  <Predicate Id="Uppercase" Method="IncludesCharacters" HelpText="an uppercase letter">
    <Parameters>
      <Parameter Id="CharacterSet">A-Z</Parameter>
    </Parameters>
  </Predicate>

  <Predicate Id="Number" Method="IncludesCharacters" HelpText="a digit">
    <Parameters>
      <Parameter Id="CharacterSet">0-9</Parameter>
    </Parameters>
  </Predicate>

  <Predicate Id="Symbol" Method="IncludesCharacters" HelpText="a symbol">
    <Parameters>
      <Parameter Id="CharacterSet">@#$%^&amp;*\-_+=[]{}|\\:',.?/`~"();!</Parameter>
    </Parameters>
  </Predicate>

  <Predicate Id="PIN" Method="MatchesRegex" HelpText="The password must be numbers only.">
    <Parameters>
      <Parameter Id="RegularExpression">^[0-9]+$</Parameter>
    </Parameters>
  </Predicate>

  <Predicate Id="AllowedAADCharacters" Method="MatchesRegex" HelpText="An invalid character was provided.">
    <Parameters>
      <Parameter Id="RegularExpression">(^([0-9A-Za-z\d@#$%^&amp;*\-_+=[\]{}|\\:',?/`~"();! ]|(\.(?!@)))+$)|(^$)</Parameter>
    </Parameters>
  </Predicate>

  <Predicate Id="DisallowedWhitespace" Method="MatchesRegex" HelpText="The password must not begin or end with a whitespace character.">
    <Parameters>
      <Parameter Id="RegularExpression">(^\S.*\S$)|(^\S+$)|(^$)</Parameter>
    </Parameters>
  </Predicate>

Después de definir las validaciones básicas, puede combinarlas y crear un conjunto de directivas de contraseña que puede usar en la directiva:

  • SimplePassword valida los predicados DisallowedWhitespace, AllowedAADCharacters y IsLengthBetween8And64.
  • StrongPassword valida los predicados DisallowedWhitespace, AllowedAADCharacters y IsLengthBetween8And64. El último grupo CharacterClasses ejecuta un conjunto adicional de predicados con MatchAtLeast establecido en 3. La contraseña del usuario debe tener entre 8 y 16 caracteres, y estar formado por los siguientes caracteres: minúsculas, mayúsculas, número o símbolo.
  • CustomPassword solo valida DisallowedWhitespace y AllowedAADCharacters. Por lo tanto, el usuario puede proporcionar cualquier contraseña de cualquier longitud, siempre y cuando los caracteres sean válidos.
<PredicateValidations>
  <PredicateValidation Id="SimplePassword">
    <PredicateGroups>
      <PredicateGroup Id="DisallowedWhitespaceGroup">
        <PredicateReferences>
          <PredicateReference Id="DisallowedWhitespace" />
        </PredicateReferences>
      </PredicateGroup>
      <PredicateGroup Id="AllowedAADCharactersGroup">
        <PredicateReferences>
          <PredicateReference Id="AllowedAADCharacters" />
        </PredicateReferences>
      </PredicateGroup>
      <PredicateGroup Id="LengthGroup">
        <PredicateReferences>
          <PredicateReference Id="IsLengthBetween8And64" />
        </PredicateReferences>
      </PredicateGroup>
    </PredicateGroups>
  </PredicateValidation>

  <PredicateValidation Id="StrongPassword">
    <PredicateGroups>
      <PredicateGroup Id="DisallowedWhitespaceGroup">
        <PredicateReferences>
          <PredicateReference Id="DisallowedWhitespace" />
       </PredicateReferences>
      </PredicateGroup>
      <PredicateGroup Id="AllowedAADCharactersGroup">
        <PredicateReferences>
          <PredicateReference Id="AllowedAADCharacters" />
        </PredicateReferences>
      </PredicateGroup>
      <PredicateGroup Id="LengthGroup">
        <PredicateReferences>
          <PredicateReference Id="IsLengthBetween8And64" />
        </PredicateReferences>
      </PredicateGroup>
      <PredicateGroup Id="CharacterClasses">
        <UserHelpText>The password must have at least 3 of the following:</UserHelpText>
        <PredicateReferences MatchAtLeast="3">
          <PredicateReference Id="Lowercase" />
          <PredicateReference Id="Uppercase" />
          <PredicateReference Id="Number" />
          <PredicateReference Id="Symbol" />
        </PredicateReferences>
      </PredicateGroup>
    </PredicateGroups>
  </PredicateValidation>

  <PredicateValidation Id="CustomPassword">
    <PredicateGroups>
      <PredicateGroup Id="DisallowedWhitespaceGroup">
        <PredicateReferences>
          <PredicateReference Id="DisallowedWhitespace" />
        </PredicateReferences>
      </PredicateGroup>
      <PredicateGroup Id="AllowedAADCharactersGroup">
        <PredicateReferences>
          <PredicateReference Id="AllowedAADCharacters" />
        </PredicateReferences>
      </PredicateGroup>
    </PredicateGroups>
  </PredicateValidation>
</PredicateValidations>

En el tipo de notificación, agregue el elemento PredicateValidationReference y especifique el identificador como una de las validaciones de predicado, como SimplePassword, StrongPassword o CustomPassword.

<ClaimType Id="password">
  <DisplayName>Password</DisplayName>
  <DataType>string</DataType>
  <AdminHelpText>Enter password</AdminHelpText>
  <UserHelpText>Enter password</UserHelpText>
  <UserInputType>Password</UserInputType>
  <PredicateValidationReference Id="StrongPassword" />
</ClaimType>

A continuación, se muestra cómo se organizan los elementos cuando Azure AD B2C muestra el mensaje de error siguiente:

Diagrama de ejemplo de la complejidad de la contraseña de los elementos Predicate y PredicateGroup

Configurar un intervalo de fechas

Con los elementos Predicates y PredicateValidations puede controlar los valores de fecha mínimos y máximos de UserInputType utilizando DateTimeDropdown. Para ello, cree un Predicate con el método IsDateRange y especifique los parámetros mínimos y máximos.

<Predicates>
  <Predicate Id="DateRange" Method="IsDateRange" HelpText="The date must be between 01-01-1980 and today.">
    <Parameters>
      <Parameter Id="Minimum">1980-01-01</Parameter>
      <Parameter Id="Maximum">Today</Parameter>
    </Parameters>
  </Predicate>
</Predicates>

Agregue un PredicateValidation con una referencia al predicado DateRange.

<PredicateValidations>
  <PredicateValidation Id="CustomDateRange">
    <PredicateGroups>
      <PredicateGroup Id="DateRangeGroup">
        <PredicateReferences>
          <PredicateReference Id="DateRange" />
        </PredicateReferences>
      </PredicateGroup>
    </PredicateGroups>
  </PredicateValidation>
</PredicateValidations>

En el tipo de notificación, agregue el elemento PredicateValidationReference y especifique el identificador como CustomDateRange.

<ClaimType Id="dateOfBirth">
  <DisplayName>Date of Birth</DisplayName>
  <DataType>date</DataType>
  <AdminHelpText>The user's date of birth.</AdminHelpText>
  <UserHelpText>Your date of birth.</UserHelpText>
  <UserInputType>DateTimeDropdown</UserInputType>
  <PredicateValidationReference Id="CustomDateRange" />
</ClaimType>

Pasos siguientes