如何在SelfAsserted-LocalAccountSignin-Email中传参至自定义验证配置文件及AD查询传参至REST API
针对你提出的两个需求,我会分别给出具体的配置步骤,都是基于Azure AD B2C自定义策略的常规操作:
1. 将额外输入传递至SelfAsserted-LocalAccountSignin-Email的自定义验证配置文件
要实现这个需求,核心是在自定义策略中声明额外的Claim,并在各个环节传递:
步骤1:定义额外的ClaimType
在TrustFrameworkExtensions.xml中添加你需要的额外字段声明,比如一个名为extension_extraInput的文本输入:<BuildingBlocks> <ClaimsSchema> <ClaimType Id="extension_extraInput"> <DisplayName>额外输入字段</DisplayName> <DataType>string</DataType> <UserInputType>TextBox</UserInputType> <UserHelpText>请输入额外信息</UserHelpText> </ClaimType> </ClaimsSchema> </BuildingBlocks>步骤2:在
SelfAsserted-LocalAccountSignin-Email中添加输入声明
修改这个技术配置文件,把额外Claim加入到用户输入和输入声明列表中,让用户能在登录页面输入这个字段:<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email"> <InputClaims> <InputClaim ClaimTypeReferenceId="extension_extraInput" /> </InputClaims> <UserInputClaims> <UserInputClaim ClaimTypeReferenceId="extension_extraInput" /> </UserInputClaims> <!-- 保留原有配置 --> </TechnicalProfile>步骤3:在自定义验证配置文件中接收这个Claim
不管你的自定义验证是用REST API还是自定义代码,只要在验证技术配置文件的<InputClaims>里包含这个Claim,就能拿到用户输入的值:<TechnicalProfile Id="Your-Custom-Validation-TP"> <InputClaims> <InputClaim ClaimTypeReferenceId="extension_extraInput" /> <!-- 其他需要的Claim,比如用户名、密码 --> </InputClaims> <!-- 保留原有配置 --> </TechnicalProfile>
2. 将额外参数(用户输入/AD字段)传递至REST API验证配置文件
这里分两种场景处理:
场景A:传递用户输入的额外参数
这个其实是需求1的延伸,只需要在REST API的技术配置文件中映射这些额外Claim到API的参数即可:
<TechnicalProfile Id="REST-Signin-Validation"> <DisplayName>登录验证REST API</DisplayName> <Protocol Name="Proprietary" Handler="Web.TPEngine.Providers.RestfulProvider, Web.TPEngine" /> <Metadata> <Item Key="ServiceUrl">https://your-api-domain.com/api/validate-signin</Item> <Item Key="SendClaimsIn">Body</Item> </Metadata> <InputClaims> <!-- 用户名和密码映射 --> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="username" /> <InputClaim ClaimTypeReferenceId="password" PartnerClaimType="password" /> <!-- 额外输入字段映射 --> <InputClaim ClaimTypeReferenceId="extension_extraInput" PartnerClaimType="extra_input" /> </InputClaims> <!-- 其他配置(比如输出Claim、错误处理) --> </TechnicalProfile>
这样当调用这个REST API时,用户输入的额外值会以extra_input参数的形式发送到API接口。
场景B:从AD查询额外字段并传递
如果需要从AD获取用户的额外属性(比如部门、职位)并传给REST API,需要调整验证流程的顺序:
步骤1:确保AD属性已映射到Claim
在TrustFrameworkBase.xml或Extensions.xml的AAD技术配置文件中,添加需要查询的AD属性对应的输出Claim。比如要获取用户的部门:<TechnicalProfile Id="AAD-UserReadUsingEmailAddress"> <OutputClaims> <OutputClaim ClaimTypeReferenceId="department" /> <!-- 保留原有输出Claim --> </OutputClaims> </TechnicalProfile>注意:
department这个ClaimType需要提前在<ClaimsSchema>中定义。步骤2:调整验证流程顺序
在SelfAsserted-LocalAccountSignin-Email的<ValidationTechnicalProfiles>中,先调用AAD的登录验证(读取用户AD属性),再调用REST API:<TechnicalProfile Id="SelfAsserted-LocalAccountSignin-Email"> <ValidationTechnicalProfiles> <!-- 先验证用户名密码,同时读取AD属性 --> <ValidationTechnicalProfile ReferenceId="login-NonInteractive" /> <!-- 再调用REST API,此时AD属性已经在Claim集合中 --> <ValidationTechnicalProfile ReferenceId="REST-Signin-Validation" /> </ValidationTechnicalProfiles> </TechnicalProfile>步骤3:在REST API配置中添加AD属性的输入Claim
回到REST API的技术配置文件,添加AD属性对应的输入Claim映射:<InputClaims> <InputClaim ClaimTypeReferenceId="signInName" PartnerClaimType="username" /> <InputClaim ClaimTypeReferenceId="password" PartnerClaimType="password" /> <InputClaim ClaimTypeReferenceId="department" PartnerClaimType="user_department" /> </InputClaims>这样REST API就能收到从AD查询到的用户部门信息了。
内容的提问来源于stack exchange,提问作者Ravi

