我有一个 Microsoft SSO 流程,我可以在响应中获取用户所需的信息。目前,我正在通过调用 GraphAPI 创建普通用户并且它可以工作。
以下是创建用户时主体的样子:
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
,但这不起作用,我在 Graph API 上得到了 400: Bad Request
。
我尝试将用户对象更改为:
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,
accountEnabled: true, //removed passwordProfile and passwordPolicies and put accountEnabled: true
};
这只是给了我一个
400: Bad Request
。该错误也不包含太多信息。
也许我在这里遗漏了一些东西。我需要对政策/权限或此处执行某些操作吗? 从 Microsoft SSO 响应中,我获得了电子邮件、oid 和姓名。
我有两个问题:
鉴于我的用户信息是从 Microsoft SSO 获取的,因此没有密码,如何使用 Graph API 在我的 azure AD B2C 中创建用户?
如何协调从图形 API 创建用户后获得的 azureId 和从已创建帐户的 Microsoft SSO 获得的 oid?
对于 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);
}
}
然后用它来调用图形 API,如下所示:
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;
注意:必须传递密码才能在 Azure AD B2C 租户中创建新用户。
passwordProfile
未通过,那么您最终可能会遇到错误:POST https://graph.microsoft.com/v1.0/users
{
"displayName": "[email protected]",
"identities": [
{
"signInType": "userName",
"issuer": "b2c.onmicrosoft.com",
"issuerAssignedId": "user"
},
{
"signInType": "emailAddress",
"issuer": "b2c.onmicrosoft.com",
"issuerAssignedId": "[email protected]"
}
],
"userPrincipalName": "[email protected]",
"mail": "[email protected]",
"accountEnabled": true
}
因此,要在 Azure AD B2C 中创建新用户,您必须通过
passwordProfile
强制要求。
因此请使用您提到的代码:
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 Graph API 在 Azure AD B2C 中创建用户时,* API 响应中的
id
字段和 SSO 响应中的 oid
是不同但相关的值。
oid
是 Azure AD 或联合身份提供商中用户的唯一标识符,用于登录或联合目的。oid
是用户在外部身份提供商中的唯一标识符,您无法传递此 oid
在 Azure AD B2C 租户中创建用户。id
是 Azure AD 对象 ID,用于唯一标识 Azure AD B2C 租户中的用户。
的
oid
时,您将收到 400
错误请求,因为用户不在 Azure AD B2C 租户中。
因此,要针对用户执行任何操作,您必须传递来自 Graph API 响应的
id
或来自 Azure AD B2C 门户用户刀片的 id
,而不是来自 Microsoft SSO的
oid
。