日期声明转换

本文提供了在 Azure Active Directory B2C (Azure AD B2C) 中使用标识体验框架架构的日期声明转换的示例。 有关详细信息,请参阅声明转换

AssertDateTimeIsGreaterThan

断言第一个日期晚于第二个日期。 确定 rightOperand 是否大于 leftOperand。 如果是,则引发异常。 查看此声明转换的实时演示

元素 TransformationClaimType 数据类型 说明
InputClaim leftOperand 字符串 第一个声明的类型,应晚于第二个声明。
InputClaim rightOperand 字符串 第二个声明的类型,应早于第一个声明。
InputParameter AssertIfEqualTo boolean 指定在左操作数等于右操作数时,此断言是否应引发错误。 可能的值为 true(默认)或 false
InputParameter AssertIfRightOperandIsNotPresent boolean 指定如果缺少右操作数,是否应传递此断言。
InputParameter TreatAsEqualIfWithinMillseconds int 指定将两个日期时间视为相等时允许两者之间相差的毫秒数(例如,用于说明时钟偏差)。

AssertDateTimeIsGreaterThan 声明转换始终从验证技术配置文件执行,该文件由自断言技术配置文件调用。 DateTimeGreaterThan 自断言技术配置文件元数据控制技术配置文件向用户呈现的错误消息。 可以将错误消息本地化

Diagrams shows how to use the AssertStringClaimsAreEqual claims transformation.

AssertDateTimeIsGreaterThan 示例

下面的示例比较 currentDateTime 声明与 approvedDateTime 声明。 如果 currentDateTime 晚于 approvedDateTime,则引发错误。 如果它们的差异在 5 分钟(30000 毫秒)内,则转换将值视为相等。 如果值相等,则不会引发错误,因为 AssertIfEqualTo 设置为 false

<ClaimsTransformation Id="AssertApprovedDateTimeLaterThanCurrentDateTime" TransformationMethod="AssertDateTimeIsGreaterThan">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="approvedDateTime" TransformationClaimType="leftOperand" />
    <InputClaim ClaimTypeReferenceId="currentDateTime" TransformationClaimType="rightOperand" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="AssertIfEqualTo" DataType="boolean" Value="false" />
    <InputParameter Id="AssertIfRightOperandIsNotPresent" DataType="boolean" Value="true" />
    <InputParameter Id="TreatAsEqualIfWithinMillseconds" DataType="int" Value="300000" />
  </InputParameters>
</ClaimsTransformation>

注意

在上面的示例中,如果删除 AssertIfEqualTo 输入参数,并且 currentDateTime 等于 approvedDateTime,则会引发错误。 AssertIfEqualTo 默认值为 true

  • 输入声明:
    • leftOperand:2022-01-01T15:00:00
    • rightOperand:2022-01-22T15:00:00
  • 输入参数:
    • AssertIfEqualTo:false
    • AssertIfRightOperandIsNotPresent:true
    • TreatAsEqualIfWithinMillseconds:300000(30 秒)
  • 结果:引发错误

调用声明转换

以下 Example-AssertDates 验证技术配置文件会调用 AssertApprovedDateTimeLaterThanCurrentDateTime 声明转换。

<TechnicalProfile Id="Example-AssertDates">
  <DisplayName>Unit test</DisplayName>
  <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.ClaimsTransformationProtocolProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="ComparisonResult" DefaultValue="false" />
  </OutputClaims>
  <OutputClaimsTransformations>
    <OutputClaimsTransformation ReferenceId="AssertDates" />
  </OutputClaimsTransformations>
  <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
</TechnicalProfile>

自断言技术配置文件调用验证 Example-AssertDates 技术配置文件。

<TechnicalProfile Id="SelfAsserted-AssertDateTimeIsGreaterThan">
  <DisplayName>User ID signup</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.selfasserted</Item>
    <Item Key="DateTimeGreaterThan">Custom error message if the provided right operand is greater than the right operand.</Item>
  </Metadata>
  ...
  <ValidationTechnicalProfiles>
    <ValidationTechnicalProfile ReferenceId="ClaimsTransformation-AssertDateTimeIsGreaterThan" />
  </ValidationTechnicalProfiles>
</TechnicalProfile>

ConvertDateTimeToDateClaim

DateTime 声明类型转换为 Date 声明类型。 声明转换将删除日期中的时间格式。 查看此声明转换的实时演示

元素 TransformationClaimType 数据类型 说明
InputClaim inputClaim dateTime 要转换的声明类型。
OutputClaim outputClaim date 调用此声明转换后生成的声明类型。

ConvertDateTimeToDateClaim 示例

以下示例演示了声明 systemDateTime(dateTime 数据类型)到另一种声明 systemDate(date 数据类型)的转换。

<ClaimsTransformation Id="ConvertToDate" TransformationMethod="ConvertDateTimeToDateClaim">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="systemDateTime" TransformationClaimType="inputClaim" />
  </InputClaims>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="systemDate" TransformationClaimType="outputClaim" />
  </OutputClaims>
</ClaimsTransformation>
  • 输入声明:
    • inputClaim:2022-01-03T11:34:22.0000000Z
  • 输出声明:
    • outputClaim:2022-01-03

ConvertDateToDateTimeClaim

Date 声明类型转换为 DateTime 声明类型。 该声明转换会转换时间格式并向日期添加 12:00:00 AM。 查看此声明转换的实时演示

元素 TransformationClaimType 数据类型 说明
InputClaim inputClaim date 要转换的声明类型。
OutputClaim outputClaim dateTime 调用此声明转换后生成的声明类型。

ConvertDateToDateTimeClaim 示例

下面的示例演示声明 dateOfBirth(date 数据类型)到另一个声明 dateOfBirthWithTime(dateTime 数据类型)的转换。

  <ClaimsTransformation Id="ConvertToDateTime" TransformationMethod="ConvertDateToDateTimeClaim">
    <InputClaims>
      <InputClaim ClaimTypeReferenceId="dateOfBirth" TransformationClaimType="inputClaim" />
    </InputClaims>
    <OutputClaims>
      <OutputClaim ClaimTypeReferenceId="dateOfBirthWithTime" TransformationClaimType="outputClaim" />
    </OutputClaims>
  </ClaimsTransformation>
  • 输入声明:
    • inputClaim:2022-01-03
  • 输出声明:
    • outputClaim:2022-01-03T00:00:00.0000000Z

DateTimeComparison

比较两个日期并确定第一个日期是晚于、早于还是等于另一个日期。 结果是新布尔型声明,值为 truefalse。 查看此声明转换的实时演示

元素 TransformationClaimType 数据类型 说明
InputClaim firstDateTime dateTime 要比较其晚于、早于还是等于第二个日期的第一个日期。 Null 值会引发异常。
InputClaim secondDateTime dateTime 要比较的第二个日期。 NULL 值被视为当前日期和时间。
InputParameter timeSpanInSeconds int 要添加到第一个日期的时间跨度。 可能的值:范围从 -2,147,483,648 到 2,147,483,647。
InputParameter 运算符后的表达式 字符串 以下值之一:samelater thanearlier than
OutputClaim result boolean 调用此声明转换后生成的声明。

DateTimeComparison 示例

使用此声明转换确定第一个日期加上 timeSpanInSeconds 参数后是晚于、早于还是等于另一个日期。 以下示例显示第一个日期 (2022-01-01T00:00:00) 加 90 天晚于第二个日期 (2022-03-16T00:00:00)。

<ClaimsTransformation Id="CompareLastTOSAcceptedWithCurrentDateTime" TransformationMethod="DateTimeComparison">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_LastTOSAccepted" TransformationClaimType="secondDateTime" />
    <InputClaim ClaimTypeReferenceId="currentDateTime" TransformationClaimType="firstDateTime" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="operator" DataType="string" Value="later than" />
    <InputParameter Id="timeSpanInSeconds" DataType="int" Value="7776000" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="isLastTOSAcceptedGreaterThanNow" TransformationClaimType="result" />
  </OutputClaims>
</ClaimsTransformation>
  • 输入声明:
    • firstDateTime:2022-01-01T00:00:00.100000Z
    • secondDateTime:2022-03-16T00:00:00.100000Z
  • 输入参数:
    • operator: later than
    • timeSpanInSeconds:7776000(90 天)
  • 输出声明:
    • 结果:true

IsTermsOfUseConsentRequired

确定 dateTime 声明类型是早于还是晚于特定日期。 结果是新布尔型声明,值为 truefalse。 查看此声明转换的实时演示

Item TransformationClaimType 数据类型 说明
InputClaim termsOfUseConsentDateTime dateTime 要检查它是早于还是晚于 termsOfUseTextUpdateDateTime 输入参数的 dateTime 声明类型。 未定义值返回 true 结果。
InputParameter termsOfUseTextUpdateDateTime dateTime 要检查它是早于还是晚于 termsOfUseConsentDateTime 输入声明的 dateTime 声明类型。 日期的时间部分可选。
OutputClaim result boolean 调用此声明转换后生成的声明类型。

使用声明转换,确定 dateTime 声明类型是早于还是晚于特定日期。 例如,检查用户是否已同意最新版本的使用条款 (TOU) 或服务条款。 若要检查用户上次同意的时间,请在扩展属性中存储用户上次接受 TOU 的时间。 当 TOU 文字更改时,使用更改时间更新 termsOfUseTextUpdateDateTime 输入参数。 然后,调用此声明转换来比较日期。 如果声明转换返回 true,则 termsOfUseConsentDateTime 值早于 termsOfUseTextUpdateDateTime 值,可以要求用户接受更新的 TOU。

<ClaimsTransformation Id="IsTermsOfUseConsentRequired" TransformationMethod="IsTermsOfUseConsentRequired">
  <InputClaims>
    <InputClaim ClaimTypeReferenceId="extension_termsOfUseConsentDateTime" TransformationClaimType="termsOfUseConsentDateTime" />
  </InputClaims>
  <InputParameters>
    <InputParameter Id="termsOfUseTextUpdateDateTime" DataType="dateTime" Value="2021-11-15T00:00:00" />
  </InputParameters>
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="termsOfUseConsentRequired" TransformationClaimType="result" />
  </OutputClaims>
</ClaimsTransformation>

IsTermsOfUseConsentRequired 示例

  • 输入声明:
    • termsOfUseConsentDateTime:2020-03-09T09:15:00
  • 输入参数:
    • termsOfUseTextUpdateDateTime:2021-11-15
  • 输出声明:
    • 结果:true

GetCurrentDateTime

获取当前 UTC 日期和时间,并将值添加到声明类型。 查看此声明转换的实时演示

元素 TransformationClaimType 数据类型 说明
OutputClaim currentDateTime dateTime 调用此声明转换后生成的声明类型。

GetCurrentDateTime 示例

以下示例演示如何获取当前数据和时间:

<ClaimsTransformation Id="GetSystemDateTime" TransformationMethod="GetCurrentDateTime">
  <OutputClaims>
    <OutputClaim ClaimTypeReferenceId="systemDateTime" TransformationClaimType="currentDateTime" />
  </OutputClaims>
</ClaimsTransformation>
  • 输出声明:
    • currentDateTime:2022-01-14T11:40:35.0000000Z

后续步骤