Azure AD本地账户用户邮件属性只读及密码重置问题问询
解决Azure AD B2C中Graph API设置邮箱导致重置密码失败的问题
我来帮你拆解这个问题,这其实是Azure AD B2C对邮箱属性的管理逻辑导致的,咱们一步步说:
为什么mail属性提示“read-only”?
在Azure AD B2C里,mail属性是系统自动维护的,并非手动可写字段。它的值会在用户首次成功验证邮箱地址后自动填充,所以直接通过Graph API设置这个字段肯定会报错。你不用尝试手动修改它,只要确保用户的邮箱完成验证,系统会自动处理这个属性。
为什么设置otherMails后出现AADB2C90161错误?
AADB2C90161错误的核心原因是:B2C的忘记密码流程只认已验证的邮箱地址。
当你通过Graph API直接把邮箱加到otherMails里时,这个邮箱处于未验证状态——B2C不会默认信任这个邮箱属于用户本人,所以在重置密码流程里会找不到合法的验证邮箱,从而抛出这个错误。
而你在AAD界面手动添加邮箱时,界面会立即要求发送验证邮件,只有用户点击链接完成验证后,这个邮箱才会被保存到otherMails里,此时它是已验证状态,所以重置密码流程能正常识别。
正确的解决方案:通过Graph API完成邮箱验证
要让邮箱能用于重置密码,你需要通过Graph API触发邮箱验证流程,而不是直接写入属性。具体步骤如下:
1. 创建用户时设置登录邮箱(可选)
如果是本地账户(非社交登录账户),你可以在创建用户时指定signInNames里的邮箱(作为用户的登录凭证),但此时邮箱仍处于未验证状态:
POST https://graph.microsoft.com/v1.0/users Content-Type: application/json { "accountEnabled": true, "displayName": "John Doe", "mailNickname": "johndoe", "userPrincipalName": "john.doe@your-b2c-tenant.onmicrosoft.com", "passwordProfile": { "forceChangePasswordNextSignIn": true, "password": "YourStrongPass123!" }, "signInNames": [ { "type": "emailAddress", "value": "john.doe@example.com" } ] }
2. 调用Graph API发送验证邮件
创建用户后,调用sendVerificationEmail接口向目标邮箱发送验证链接:
POST https://graph.microsoft.com/v1.0/users/{user-id}/sendVerificationEmail Content-Type: application/json { "emailAddress": "john.doe@example.com" }
3. 用户完成验证
用户点击邮件中的验证链接后,系统会自动完成以下操作:
- 将
mail属性设置为这个已验证的邮箱 - 把该邮箱添加到
otherMails列表中,并标记为已验证 - 若之前设置了
signInNames,对应的登录邮箱也会被标记为已验证
完成这些步骤后,用户就能正常使用这个邮箱进行密码重置了。
内容的提问来源于stack exchange,提问作者kkost
相关产品推荐
相关产品推荐

