Azure B2C自定义策略:带限时豁免的安全重认证流程实现指引
Azure B2C自定义策略实现带限时豁免的重认证流程
核心思路
不用跳转独立登录页,直接在现有用户旅程中嵌入重认证逻辑:通过会话管理记录用户上次完成强认证的时间,当用户触发高安全操作时,先判断会话中记录的时间是否在30分钟内,若超出则强制触发生物识别等强认证,否则直接豁免。
具体实现步骤
- 添加会话相关声明定义
在自定义策略的<ClaimsSchema>中添加用于记录重认证时间的声明:<ClaimType Id="lastStrongAuthTime"> <DisplayName>Last Strong Authentication Timestamp</DisplayName> <DataType>string</DataType> <UserHelpText>Timestamp when user last completed step-up authentication</UserHelpText> </ClaimType> - 配置会话管理技术配置文件
创建一个会话管理技术配置文件,用于持久化重认证时间到会话中,同时设置会话有效期为30分钟:<TechnicalProfile Id="SM-StepUpAuth"> <DisplayName>Session Management for Step-Up Authentication</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.SSO.DefaultSSOSessionProvider, Web.TPEngine, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /> <Metadata> <Item Key="SessionExpiryInSeconds">1800</Item> <!-- 30分钟,1800秒 --> <Item Key="SessionType">Persistent</Item> </Metadata> <PersistedClaims> <PersistedClaim ClaimTypeReferenceId="lastStrongAuthTime" /> </PersistedClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="lastStrongAuthTime" /> </OutputClaims> </TechnicalProfile> - 创建强认证技术配置文件
以生物识别(比如FIDO2)为例,定义强认证的技术配置文件:<TechnicalProfile Id="StrongAuth-FIDO2"> <DisplayName>FIDO2 Strong Authentication</DisplayName> <Protocol Name="OpenIdConnect" /> <Metadata> <Item Key="ProviderName">https://login.microsoftonline.com/{tenant}/v2.0</Item> <Item Key="METADATA">https://login.microsoftonline.com/{tenant}/v2.0/.well-known/openid-configuration</Item> <Item Key="response_types">code</Item> <Item Key="scope">openid profile</Item> <Item Key="UsePolicyInRedirectUri">false</Item> <Item Key="client_id">{your-b2c-app-client-id}</Item> <Item Key="IdTokenAudience">{your-b2c-app-client-id}</Item> <!-- 强制使用FIDO2认证 --> <Item Key="domain_hint">fido2</Item> </Metadata> <InputClaims> <InputClaim ClaimTypeReferenceId="loginName" PartnerClaimType="login_hint" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="objectId" /> <OutputClaim ClaimTypeReferenceId="lastStrongAuthTime" DefaultValue="{CurrentDateTime}" /> <!-- 记录当前时间作为重认证时间 --> </OutputClaims> <ValidationTechnicalProfiles> <ValidationTechnicalProfile ReferenceId="SM-StepUpAuth" /> <!-- 持久化到会话 --> </ValidationTechnicalProfiles> </TechnicalProfile> - 添加重认证条件判断逻辑
在用户旅程的高安全操作步骤前,添加一个Orchestration Step,用于判断是否需要触发重认证:<OrchestrationStep Order="X" Type="ClaimsExchange"> <Preconditions> <!-- 如果lastStrongAuthTime存在,且当前时间与该时间差小于30分钟,则跳过重认证 --> <Precondition Type="ClaimExists" ExecuteActionsIf="true"> <Value>lastStrongAuthTime</Value> <Action>SkipThisOrchestrationStep</Action> <Precondition Type="TimeCompare" ExecuteActionsIf="true"> <Value>lastStrongAuthTime</Value> <Value>CurrentDateTime</Value> <Value>00:30:00</Value> <Value>minute</Value> <Action>SkipThisOrchestrationStep</Action> </Precondition> </Precondition> </Preconditions> <ClaimsExchanges> <ClaimsExchange Id="StrongAuthExchange" TechnicalProfileReferenceId="StrongAuth-FIDO2" /> </ClaimsExchanges> </OrchestrationStep> - 整合到高安全操作的用户旅程
将上述步骤添加到更新个人信息、银行卡信息等操作对应的用户旅程中,确保在执行敏感操作前先完成重认证判断。
关键说明
- 会话有效期通过
SessionExpiryInSeconds设置为1800秒(30分钟),到期后会话中的lastStrongAuthTime会被清除,用户需重新完成强认证。 TimeCompare断言用于判断上次重认证时间与当前时间的差值,若小于30分钟则跳过重认证。- 强认证技术配置文件可根据实际需求替换为其他方式(比如短信验证码、硬件令牌等),只需保证输出
lastStrongAuthTime声明即可。
内容的提问来源于stack exchange,提问作者nullmicgo
相关产品推荐
相关产品推荐

