如何为TOTP自定义B2C策略添加设备管理功能?
解决Azure AD B2C TOTP自定义策略多设备注册/管理问题
原TOTP示例策略默认仅支持单设备密钥存储,要实现多设备添加、删除及重新注册功能,需从以下核心部分修改策略配置:
1. 调整用户属性存储结构
原策略使用单一字符串属性存储TOTP密钥,需替换为字符串集合类型的扩展属性来保存多组设备密钥及元数据:
- 在B2C扩展应用中创建新属性(如
extension_TotpDeviceKeys),类型选择String Collection。 - 替换策略中所有引用原单密钥属性(如
extension_TotpSecretKey)的位置,改为使用该集合属性。
2. 修改TOTP注册流程
- 注册新设备时,不再覆盖现有密钥,而是将包含设备名称、密钥、创建时间的JSON格式字符串(例:
{"deviceName":"办公手机","secretKey":"xxxxxx","createdAt":"2024-05-20"})追加到集合属性中。 - 调整用户写入技术配置文件(如
AAD-UserWriteUsingAlternativeSecurityId),确保执行追加操作而非替换属性值。
3. 更新TOTP验证逻辑
- 验证环节需遍历用户存储的所有TOTP密钥,逐一校验输入的验证码,任意一组验证通过即判定成功。
- 可通过声明转换(如
GetSingleItemFromJsonArray)或自定义REST API实现多密钥遍历验证,也可在策略中通过循环断言逻辑处理。
4. 新增设备管理流程
- 添加专属用户旅程,支持用户查看已注册设备列表、删除指定设备:
- 展示设备列表:通过声明转换解析集合属性中的JSON数据,在页面上渲染设备信息。
- 删除设备:使用
RemoveItemFromStringCollection声明转换,从集合属性中移除对应设备的密钥数据。
关键配置示例
追加密钥到集合的声明转换
<ClaimsTransformation Id="AddTotpKeyToCollection" TransformationMethod="AddItemToStringCollection"> <InputClaims> <InputClaim ClaimTypeReferenceId="extension_TotpDeviceKeys" TransformationClaimType="collection" /> <InputClaim ClaimTypeReferenceId="newTotpDeviceJson" TransformationClaimType="item" /> </InputClaims> <OutputClaims> <OutputClaim ClaimTypeReferenceId="extension_TotpDeviceKeys" TransformationClaimType="collection" /> </OutputClaims> </ClaimsTransformation>
修改用户写入技术配置文件
<TechnicalProfile Id="AAD-UserWriteUsingAlternativeSecurityId"> <Metadata> <Item Key="Operation">Write</Item> <Item Key="RaiseErrorIfClaimsPrincipalAlreadyExists">true</Item> </Metadata> <InputClaimsTransformations> <InputClaimsTransformation ReferenceId="AddTotpKeyToCollection" /> </InputClaimsTransformations> <PersistedClaims> <PersistedClaim ClaimTypeReferenceId="extension_TotpDeviceKeys" /> <!-- 其他需要持久化的声明 --> </PersistedClaims> </TechnicalProfile>
内容的提问来源于stack exchange,提问作者bperniciaro
相关产品推荐
相关产品推荐

