You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何取消AAD B2C邀请链接并让注册策略提前验证邀请有效性?

实现AAD B2C邀请链接表单加载前有效性验证的策略配置方案

核心思路

通过在注册用户旅程的初始环节添加REST API验证步骤,在显示注册表单前调用自定义后端接口,完成三项验证:JWT签名有效性、JWT是否过期、邀请是否被取消。验证不通过则直接返回错误,阻止表单加载。

具体配置步骤

1. 定义REST API技术配置

在自定义策略的<ClaimsProviders>节点中添加REST API的连接配置,指定接口地址与认证方式:

<ClaimsProvider>
  <DisplayName>REST API Validation</DisplayName>
  <TechnicalProfiles>
    <TechnicalProfile Id="REST-ValidateInvitation">
      <DisplayName>Validate Invitation Status</DisplayName>
      <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      <Metadata>
        <Item Key="ServiceUrl">https://your-backend-api.com/api/validate-invitation</Item>
        <Item Key="AuthenticationType">Basic</Item>
        <Item Key="SendClaimsIn">Body</Item>
      </Metadata>
      <CryptographicKeys>
        <Key Id="BasicAuthenticationUsername" StorageReferenceId="B2C_1A_RestApiUsername" />
        <Key Id="BasicAuthenticationPassword" StorageReferenceId="B2C_1A_RestApiPassword" />
      </CryptographicKeys>
      <InputClaims>
        <!-- 传递邀请链接中的JWT和预填邮箱 -->
        <InputClaim ClaimTypeReferenceId="invitationToken" />
        <InputClaim ClaimTypeReferenceId="readOnlyEmail" />
      </InputClaims>
      <OutputClaims>
        <!-- API返回验证结果 -->
        <OutputClaim ClaimTypeReferenceId="isInvitationValid" />
        <OutputClaim ClaimTypeReferenceId="invitationErrorMsg" />
      </OutputClaims>
      <UseTechnicalProfileForSessionManagement ReferenceId="SM-Noop" />
    </TechnicalProfile>
  </TechnicalProfiles>
</ClaimsProvider>

2. 补充验证所需的声明类型

在<BuildingBlocks>的<ClaimsSchema>中添加新的声明字段:

<ClaimsSchema>
  <!-- 基于已有readOnlyEmail补充 -->
  <ClaimType Id="invitationToken">
    <DisplayName>Invitation JWT Token</DisplayName>
    <DataType>string</DataType>
  </ClaimType>
  <ClaimType Id="isInvitationValid">
    <DisplayName>Is Invitation Valid</DisplayName>
    <DataType>boolean</DataType>
  </ClaimType>
  <ClaimType Id="invitationErrorMsg">
    <DisplayName>Invitation Error Message</DisplayName>
    <DataType>string</DataType>
  </ClaimType>
</ClaimsSchema>

3. 修改用户旅程,插入前置验证流程

找到注册对应的<UserJourney>,在显示表单的步骤前添加验证逻辑:

<UserJourney Id="SignUpInvitedUser">
  <OrchestrationSteps>
    <!-- 步骤1:从邀请链接提取JWT和邮箱声明 -->
    <OrchestrationStep Order="1" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="IdTokenHint_Extract" TechnicalProfileReferenceId="IdTokenHint_ExtractClaims" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <!-- 步骤2:调用API验证邀请有效性 -->
    <OrchestrationStep Order="2" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="ValidateInvitation" TechnicalProfileReferenceId="REST-ValidateInvitation" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <!-- 步骤3:验证不通过则抛出错误,终止流程 -->
    <OrchestrationStep Order="3" Type="ClaimsTransformation">
      <Preconditions>
        <Precondition Type="ClaimEquals" ExecuteActionsIf="true">
          <Value>isInvitationValid</Value>
          <Value>True</Value>
          <Action>SkipThisOrchestrationStep</Action>
        </Precondition>
      </Preconditions>
      <ClaimsTransformations>
        <ClaimsTransformation Id="ThrowInvitationError" TransformationMethod="ThrowClaimException">
          <InputClaims>
            <InputClaim ClaimTypeReferenceId="invitationErrorMsg" TransformationClaimType="exceptionMessage" />
          </InputClaims>
        </ClaimsTransformation>
      </ClaimsTransformations>
    </OrchestrationStep>

    <!-- 步骤4:显示注册表单(原有步骤) -->
    <OrchestrationStep Order="4" Type="ClaimsExchange">
      <ClaimsExchanges>
        <ClaimsExchange Id="LocalAccountSignUpWithReadOnlyEmail" TechnicalProfileReferenceId="SelfAsserted-LocalAccountSignup-ReadOnlyEmail" />
      </ClaimsExchanges>
    </OrchestrationStep>

    <!-- 后续原有步骤... -->
  </OrchestrationSteps>
</UserJourney>

4. 后端API验证逻辑实现

你的后端API需要完成以下操作:

  • 解析传入的invitationToken,验证JWT签名和exp过期字段
  • 根据readOnlyEmail查询应用存储的邀请记录,检查是否已被取消
  • 返回isInvitationValid(布尔值)和invitationErrorMsg(错误描述,如"邀请已过期"、"邀请已被取消")

5. 配置错误提示文案

在<Localization>中添加对应的错误提示,让用户看到明确信息:

<Localization>
  <SupportedLanguages DefaultLanguage="zh-CN" MergeBehavior="ReplaceAll">
    <SupportedLanguage>zh-CN</SupportedLanguage>
  </SupportedLanguages>
  <LocalizedResources Id="api.error.invitation">
    <LocalizedStrings>
      <LocalizedString ElementType="ErrorMessage" StringId="ClaimException">{0}</LocalizedString>
    </LocalizedStrings>
  </LocalizedResources>
</Localization>

额外注意事项

  • 邀请链接中的JWT必须包含readOnlyEmail和exp字段,确保策略能提取并传递给API
  • REST API超时建议设置在5秒内,避免用户等待过久
  • 可在API中加入缓存机制,减少重复查询应用存储的压力

内容的提问来源于stack exchange,提问作者ancsjs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 19:20:27