如何从SM-AAD持久化声明中读取会话的objectId?
从SM-AAD会话持久化声明中读取objectId的实现方法
核心思路
当你的登录技术配置文件使用UseTechnicalProfileForSessionManagement = SM-AAD时,登录后SM-AAD会将指定的声明持久化到会话中。要在修改密码流程中获取objectId,只需确保该声明被正确持久化,并在后续流程中从会话提取即可。
具体步骤
确保登录流程持久化objectId
在登录技术配置文件中,明确输出objectId声明,并在SM-AAD会话管理配置中指定持久化该声明:<!-- 登录技术配置文件 --> <TechnicalProfile Id="Login-NonInteractive"> <DisplayName>本地账户登录</DisplayName> <Protocol Name="OpenIdConnect"/> <Metadata> <Item Key="UseTechnicalProfileForSessionManagement">SM-AAD</Item> </Metadata> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId"/> <!-- 其他必要输出声明,如用户名、邮箱等 --> </OutputClaims> </TechnicalProfile> <!-- SM-AAD会话管理配置 --> <TechnicalProfile Id="SM-AAD"> <DisplayName>会话管理提供者</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> <Metadata> <Item Key="SessionExpiryType">Absolute</Item> <Item Key="SessionExpiryInSeconds">86400</Item> <Item Key="DataPersistedOnClaim">objectId</Item> <!-- 多个声明用逗号分隔,如"objectId,displayName" --> </Metadata> </TechnicalProfile>在修改密码流程中读取会话中的objectId
在修改密码的用户旅程里,先添加一个读取会话声明的步骤,将objectId提取出来,再传入修改密码的技术配置文件:<!-- 修改密码用户旅程 --> <UserJourney Id="PasswordReset"> <OrchestrationSteps> <!-- 步骤1:从会话读取objectId --> <OrchestrationStep Order="1" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="ReadSessionObjectId" TechnicalProfileReferenceId="SM-AAD-SessionRead"/> </ClaimsExchanges> </OrchestrationStep> <!-- 步骤2:调用修改密码接口,传入objectId --> <OrchestrationStep Order="2" Type="ClaimsExchange"> <ClaimsExchanges> <ClaimsExchange Id="PasswordResetExchange" TechnicalProfileReferenceId="AAD-UserPasswordReset"/> </ClaimsExchanges> </OrchestrationStep> <!-- 后续收尾步骤 --> </OrchestrationSteps> </UserJourney> <!-- 读取会话声明的技术配置文件 --> <TechnicalProfile Id="SM-AAD-SessionRead"> <DisplayName>读取会话声明</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId"/> </OutputClaims> </TechnicalProfile> <!-- 修改密码技术配置文件 --> <TechnicalProfile Id="AAD-UserPasswordReset"> <DisplayName>重置密码</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.AzureActiveDirectoryProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> <Metadata> <Item Key="Operation">ChangePassword</Item> <Item Key="RaiseErrorIfClaimsPrincipalDoesNotExist">true</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="objectId" Required="true"/> <!-- 其他输入声明,如新密码、确认密码等 --> </InputClaims> <OutputClaims/> <UseTechnicalProfileForSessionManagement ReferenceId="SM-AAD"/> </TechnicalProfile>简化已有查询步骤的处理
如果你已经有查询AD获取objectId的步骤,只需确保该步骤的输出声明包含objectId,并通过SM-AAD持久化后,后续流程直接从会话读取即可,无需重复查询AD。
内容的提问来源于stack exchange,提问作者The Chos3n Ron
相关产品推荐
相关产品推荐

