日期声明转换

重要

自 2025 年 5 月 1 日起,Azure AD B2C 将不再可供新客户购买。 在我们的常见问题解答中了解详细信息

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

AssertDateTimeIsGreaterThan

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

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

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

关系图显示如何使用 AssertStringClaimsAreEqual 声明转换。

AssertDateTimeIsGreaterThan 的示例

以下示例将 currentDateTime 声明与 approvedDateTime 声明进行比较。 如果晚于 currentDateTimeapprovedDateTime,则会引发错误。 如果值在 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,将引发错误。 默认值 AssertIfEqualTotrue.

  • 输入声明:
    • 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 日期 调用此声明转换后生成的声明类型。

ConvertDateTimeToDateClaim 的示例

以下示例演示如何将声明 systemDateTime (dateTime 数据类型)转换为另一个声明 systemDate (日期数据类型)。

<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 添加到日期。 查看此声明转换的实时演示

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

ConvertDateToDateTimeClaim 的示例

以下示例演示如何将声明 dateOfBirth (日期数据类型)转换为另一个声明 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) 要添加到第一个日期的 Timespan。 可能的值:范围为负 -2,147,483,648 到正 2,147,483,647。
InputParameter 操作员 字符串 以下值之一: samelater thanearlier than
OutputClaim 结果 布尔 调用此声明转换后生成的声明。

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
  • 输入参数:
    • 运算符:晚于
    • timeSpanInSeconds:7776000 (90 天)
  • 输出声明:
    • result: true

IsTermsOfUseConsentRequired

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

条目 TransformationClaimType 数据类型 注释
InputClaim termsOfUseConsentDateTime dateTime dateTime 检查其早于或晚于输入参数的 termsOfUseTextUpdateDateTime 声明类型。 未定义值返回 true 结果。
InputParameter termsOfUseTextUpdateDateTime dateTime dateTime 检查其早于或晚于输入声明的 termsOfUseConsentDateTime 声明类型。 日期的时间部分是可选的。
OutputClaim 结果 布尔 调用此声明转换后生成的声明类型。

使用此声明转换来确定声明类型是 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
  • 输出声明:
    • result: 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.00000000Z

后续步骤