如何取消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
相关产品推荐
相关产品推荐

