如何通过Microsoft SSO在Azure AD B2C中创建用户并关联OID
在Azure AD B2C中通过Graph API创建Microsoft SSO无密码用户及账户关联方案
问题背景
已实现Microsoft SSO流程,可从SSO响应中获取用户邮箱、oid、姓名等信息。当前通过Graph API创建本地密码用户的流程正常,请求体如下:
const user = { displayName: name, identities: [ { signInType: "userName", issuer: `${this.TENANT_NAME}`, issuerAssignedId: name, }, { signInType: "emailAddress", issuer: `${this.TENANT_NAME}`, issuerAssignedId: email, }, ], userPrincipalName: `${secret}@${this.TENANT_NAME}`, mail: email, passwordProfile: { password: password, forceChangePasswordNextSignIn: false, }, passwordPolicies: "DisablePasswordExpiration", };
注:上述代码适用于用户自行设置密码的普通邮箱注册流程。
尝试基于Microsoft SSO信息创建无密码用户时,仅移除passwordProfile和passwordPolicies字段、添加accountEnabled: true均返回400: Bad Request错误,错误信息有限。
问题解答
1. 如何通过Graph API在Azure AD B2C中创建来自Microsoft SSO的无密码用户?
创建Microsoft SSO关联的无密码用户,核心是将用户身份标识设置为联邦身份类型,而非本地密码/用户名类型。正确的请求体如下:
const user = { displayName: name, identities: [ { signInType: "federated", issuer: `microsoft.com`, issuerAssignedId: email, }, ], userPrincipalName: `name ${secret}`, // 可根据租户规则设置合法的UPN格式 mail: email, accountEnabled: true, };
关键要点:
- 将
signInType设为federated,标识该用户为联邦身份登录(依赖Microsoft SSO) issuer指定为microsoft.com,对应Microsoft身份提供商- 无需包含
passwordProfile和passwordPolicies字段,因为用户通过SSO登录,不需要本地密码
调用Graph API的代码保持原有逻辑即可:
async getAccessToken(): Promise<any> { try { const response = await this.CREDENTIAL.getToken( "https://graph.microsoft.com/.default" ); return response.token; } catch (error) { console.error("Error obtaining access token:", error); } }
const response = await axios.post( "https://graph.microsoft.com/v1.0/users", user, { headers: { Authorization: `Bearer ${accessToken}`, "Content-Type": "application/json", }, } ); console.log(response.data); return response.data;
2. 如何关联Graph API创建用户返回的azureId与Microsoft SSO返回的已创建账户的oid?
- Graph API创建用户成功后,返回的
id字段即为该用户在Azure AD B2C中的azureId(用户对象ID) - Microsoft SSO响应中的
oid是该用户在Microsoft身份提供商(Microsoft Entra ID)中的唯一标识 - 关联逻辑:
- 创建用户时,确保
identities数组中issuerAssignedId使用SSO返回的用户邮箱(或唯一标识),保证联邦身份的唯一性 - 后续可通过Graph API查询用户的
identities属性,找到signInType: "federated"且issuer: "microsoft.com"的条目,其issuerAssignedId对应SSO返回的邮箱,从而关联azureId与SSO的oid - 也可在创建用户时,将SSO返回的
oid存储到用户的扩展属性中,方便后续直接匹配查询
- 创建用户时,确保
内容的提问来源于stack exchange,提问作者Scripter9700
相关产品推荐
相关产品推荐

