MS Graph SDK 如何 Add/Update 对用户对象的架构扩展 属性
MS Graph SDK How to Add/Update a Schema Extension property to a User object
我很难找到有关如何在 Azure AD 中针对用户添加架构扩展值的任何代码示例。
到目前为止,我已成功创建自己的架构扩展,标记为 'User' TargetType,并将状态更新为 'Available'。这一切都是通过 MS Graph SDK
实现的
下面是我创建并在我的应用程序中列出的扩展程序的屏幕截图:
这个扩展非常基础,只有一个名为 'name' 的 属性 被设置为字符串类型。
我现在要执行以下功能:
- 创建一个新用户并使用我的为他们的配置文件分配一个值
新创建的模式扩展,即此用户将模式扩展 属性 'name' 设置为我选择的字符串值。
- 为现有用户更新架构扩展 属性 的值。
- 运行 过滤搜索我的租户中在此架构扩展中设置了特定值的所有用户。
MS Docs 给出的唯一示例是使用 MS Graph API,不是 我在我的应用程序中使用的 SDK。此外,他们给出的唯一示例是在创建新组时添加模式扩展。
https://docs.microsoft.com/en-us/graph/extensibility-schema-groups
MS 在他们的注释中说了以下内容:注意:本主题向您展示如何在组资源上创建和读取架构扩展值(步骤 3-5)。 administrativeUnit、device、event、message、organization、post 和 user 资源类型也支持相同的方法。您可以对任何这些资源执行类似于本文中请求示例的操作。
有人可以告诉我从哪里获得代码示例,允许我使用此扩展程序 create/update 用户,以及对我的租户中在其配置文件中设置了特定值的所有用户使用过滤搜索对于这个特定的扩展?
更新:结合下面答案中与 Allen Wu 的讨论,我已经实现了他的代码示例,在创建新用户时将架构扩展添加为“AdditionalData”。我还没有设法让它工作,因为我收到一条错误消息“代码:BadRequest\r\nMessage:不支持的模式扩展 属性 类型 String\r\nInner 的值错误:\r\n\tAdditionalData:\r\n\tdate: 2021-03-31T18:51:32\r\n\trequest-id"
使用架构扩展创建新用户的代码示例:
var user = new User();
user.UserPrincipalName = TenantUser.UserPrincipalName + "@" + Domain; // * Required
//user.UserPrincipalName = TenantUser.UserPrincipalName; // * Required
user.DisplayName = TenantUser.GivenName + " " + TenantUser.Surname; // * Required
user.GivenName = TenantUser.GivenName; // * Required
user.Surname = TenantUser.Surname; // * Required
if (TenantUser.Password != null)
{
if (TenantUser.Password != TenantUser.ConfirmPassword)
{
ModelState.AddModelError(string.Empty, "\n Passwords do not match!");
return Page();
}
else
{
user.PasswordProfile = new PasswordProfile
{
Password = TenantUser.ConfirmPassword,
};
}
}
user.AccountEnabled = AccountEnabled;
user.JobTitle = TenantUser.JobTitle;
user.Department = TenantUser.Department;
user.EmployeeId = TenantUser.EmployeeId;
user.OfficeLocation = TenantUser.OfficeLocation;
user.CompanyName = TenantUser.CompanyName;
user.StreetAddress = TenantUser.StreetAddress;
user.State = TenantUser.State;
user.City = TenantUser.City;
user.PostalCode = TenantUser.PostalCode;
user.Country = TenantUser.Country;
user.MobilePhone = TenantUser.MobilePhone; // * Required
if (BusinessPhone != null)
{
user.BusinessPhones = new List<String>()
{
BusinessPhone // see public string
};
}
user.Mail = TenantUser.Mail; // * Required
user.MailNickname = TenantUser.MailNickname;
user.AdditionalData = new Dictionary<string, object>()
{
{"ext7bxc3e0l_appRoleTemplate", "{\"name\":\"Template1\"}"}
};
try
{
await graphClient.Users
.Request()
.AddAsync(user);
LogData = "New User with name [" + UserFullName + "] created by user with forename [" + currentUser.Forename + "] surname [" + currentUser.Surname + "] Succesfully";
// See helper method at bottom.
logExtension.WriteLogEvent<EditModel>("Information", "Users", "Created", UserFullName, currentUser.Id, currentUser.Username, currentUser.Forename, currentUser.Surname, LogData, null, _scopeFactory);
}
catch (ServiceException ex)
{
// Graph service exception friendly message
var errorMessage = ex.Error.Message;
LogData = " Error creating the User. Microsoft Graph API encountered a Service Exception with message [" + errorMessage + "]'";
logExtension.WriteLogEvent<EditModel>("Error", "User", "Created", $"User with Id = {currentUser.Id}", currentUser.Id, currentUser.Username, currentUser.Forename, currentUser.Surname, LogData, null, _scopeFactory);
ModelState.AddModelError(string.Empty, errorMessage + " Error creating the User.\n Please check the system logs for details");
return Page();
}
我创建了一个架构扩展:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#schemaExtensions/$entity",
"id": "ext253rtfdu_name",
"description": "user name extensions",
"targetTypes": [
"User"
],
"status": "InDevelopment",
"properties": [
{
"name": "userId",
"type": "String"
},
{
"name": "userName",
"type": "String"
},
{
"name": "userType",
"type": "String"
}
]
}
创建具有 ext253rtfdu_name
架构扩展的用户:
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
string extStr = "{\"userId\":\"321\",\"userName\":\"Adele test02\",\"userType\":\"member\"}";
JObject jsonObj = JObject.Parse(extStr);
var user = new User
{
AccountEnabled = true,
DisplayName = "Adele test01",
MailNickname = "AdeleVtest01",
UserPrincipalName = "AdeleVtest01@contoso.onmicrosoft.com",
PasswordProfile = new PasswordProfile
{
ForceChangePasswordNextSignIn = true,
Password = "password-value"
},
AdditionalData = new Dictionary<string, object>()
{
{"ext253rtfdu_name", extStr}
}
};
await graphClient.Users
.Request()
.AddAsync(user);
更新用户:
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
string extStr = "{\"userId\":\"456\",\"userName\":\"Adele test02\",\"userType\":\"member\"}";
JObject jsonObj = JObject.Parse(extStr);
var user = new User
{
AdditionalData = new Dictionary<string, object>()
{
{"ext253rtfdu_name", jsonObj}
}
};
await graphClient.Users["AdeleVtest01@contoso.onmicrosoft.com"]
.Request()
.UpdateAsync(user);
我尝试使用 https://graph.microsoft.com/v1.0/users?$filter=ext253rtfdu_name/userId eq ‘456’&$select=displayName,id,userPrincipalName,ext253rtfdu_name
来过滤扩展名以获取用户,但它显示 Invalid filter clause
。但是按照Filtering on schema extension properties known issues,应该是支持的
我不明白这个过滤器发生了什么,但代码示例应该是:
var res = await _graphClient.Users.Request()
.Filter($"ext253rtfdu_name/userId eq '456'").GetAsync()
这里有一个similar post供大家参考。
你可以在身边试一试。
我很难找到有关如何在 Azure AD 中针对用户添加架构扩展值的任何代码示例。
到目前为止,我已成功创建自己的架构扩展,标记为 'User' TargetType,并将状态更新为 'Available'。这一切都是通过 MS Graph SDK
实现的下面是我创建并在我的应用程序中列出的扩展程序的屏幕截图:
这个扩展非常基础,只有一个名为 'name' 的 属性 被设置为字符串类型。
我现在要执行以下功能:
- 创建一个新用户并使用我的为他们的配置文件分配一个值 新创建的模式扩展,即此用户将模式扩展 属性 'name' 设置为我选择的字符串值。
- 为现有用户更新架构扩展 属性 的值。
- 运行 过滤搜索我的租户中在此架构扩展中设置了特定值的所有用户。
MS Docs 给出的唯一示例是使用 MS Graph API,不是 我在我的应用程序中使用的 SDK。此外,他们给出的唯一示例是在创建新组时添加模式扩展。
https://docs.microsoft.com/en-us/graph/extensibility-schema-groups
MS 在他们的注释中说了以下内容:注意:本主题向您展示如何在组资源上创建和读取架构扩展值(步骤 3-5)。 administrativeUnit、device、event、message、organization、post 和 user 资源类型也支持相同的方法。您可以对任何这些资源执行类似于本文中请求示例的操作。
有人可以告诉我从哪里获得代码示例,允许我使用此扩展程序 create/update 用户,以及对我的租户中在其配置文件中设置了特定值的所有用户使用过滤搜索对于这个特定的扩展?
更新:结合下面答案中与 Allen Wu 的讨论,我已经实现了他的代码示例,在创建新用户时将架构扩展添加为“AdditionalData”。我还没有设法让它工作,因为我收到一条错误消息“代码:BadRequest\r\nMessage:不支持的模式扩展 属性 类型 String\r\nInner 的值错误:\r\n\tAdditionalData:\r\n\tdate: 2021-03-31T18:51:32\r\n\trequest-id"
使用架构扩展创建新用户的代码示例:
var user = new User();
user.UserPrincipalName = TenantUser.UserPrincipalName + "@" + Domain; // * Required
//user.UserPrincipalName = TenantUser.UserPrincipalName; // * Required
user.DisplayName = TenantUser.GivenName + " " + TenantUser.Surname; // * Required
user.GivenName = TenantUser.GivenName; // * Required
user.Surname = TenantUser.Surname; // * Required
if (TenantUser.Password != null)
{
if (TenantUser.Password != TenantUser.ConfirmPassword)
{
ModelState.AddModelError(string.Empty, "\n Passwords do not match!");
return Page();
}
else
{
user.PasswordProfile = new PasswordProfile
{
Password = TenantUser.ConfirmPassword,
};
}
}
user.AccountEnabled = AccountEnabled;
user.JobTitle = TenantUser.JobTitle;
user.Department = TenantUser.Department;
user.EmployeeId = TenantUser.EmployeeId;
user.OfficeLocation = TenantUser.OfficeLocation;
user.CompanyName = TenantUser.CompanyName;
user.StreetAddress = TenantUser.StreetAddress;
user.State = TenantUser.State;
user.City = TenantUser.City;
user.PostalCode = TenantUser.PostalCode;
user.Country = TenantUser.Country;
user.MobilePhone = TenantUser.MobilePhone; // * Required
if (BusinessPhone != null)
{
user.BusinessPhones = new List<String>()
{
BusinessPhone // see public string
};
}
user.Mail = TenantUser.Mail; // * Required
user.MailNickname = TenantUser.MailNickname;
user.AdditionalData = new Dictionary<string, object>()
{
{"ext7bxc3e0l_appRoleTemplate", "{\"name\":\"Template1\"}"}
};
try
{
await graphClient.Users
.Request()
.AddAsync(user);
LogData = "New User with name [" + UserFullName + "] created by user with forename [" + currentUser.Forename + "] surname [" + currentUser.Surname + "] Succesfully";
// See helper method at bottom.
logExtension.WriteLogEvent<EditModel>("Information", "Users", "Created", UserFullName, currentUser.Id, currentUser.Username, currentUser.Forename, currentUser.Surname, LogData, null, _scopeFactory);
}
catch (ServiceException ex)
{
// Graph service exception friendly message
var errorMessage = ex.Error.Message;
LogData = " Error creating the User. Microsoft Graph API encountered a Service Exception with message [" + errorMessage + "]'";
logExtension.WriteLogEvent<EditModel>("Error", "User", "Created", $"User with Id = {currentUser.Id}", currentUser.Id, currentUser.Username, currentUser.Forename, currentUser.Surname, LogData, null, _scopeFactory);
ModelState.AddModelError(string.Empty, errorMessage + " Error creating the User.\n Please check the system logs for details");
return Page();
}
我创建了一个架构扩展:
{
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#schemaExtensions/$entity",
"id": "ext253rtfdu_name",
"description": "user name extensions",
"targetTypes": [
"User"
],
"status": "InDevelopment",
"properties": [
{
"name": "userId",
"type": "String"
},
{
"name": "userName",
"type": "String"
},
{
"name": "userType",
"type": "String"
}
]
}
创建具有 ext253rtfdu_name
架构扩展的用户:
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
string extStr = "{\"userId\":\"321\",\"userName\":\"Adele test02\",\"userType\":\"member\"}";
JObject jsonObj = JObject.Parse(extStr);
var user = new User
{
AccountEnabled = true,
DisplayName = "Adele test01",
MailNickname = "AdeleVtest01",
UserPrincipalName = "AdeleVtest01@contoso.onmicrosoft.com",
PasswordProfile = new PasswordProfile
{
ForceChangePasswordNextSignIn = true,
Password = "password-value"
},
AdditionalData = new Dictionary<string, object>()
{
{"ext253rtfdu_name", extStr}
}
};
await graphClient.Users
.Request()
.AddAsync(user);
更新用户:
GraphServiceClient graphClient = new GraphServiceClient(authProvider);
string extStr = "{\"userId\":\"456\",\"userName\":\"Adele test02\",\"userType\":\"member\"}";
JObject jsonObj = JObject.Parse(extStr);
var user = new User
{
AdditionalData = new Dictionary<string, object>()
{
{"ext253rtfdu_name", jsonObj}
}
};
await graphClient.Users["AdeleVtest01@contoso.onmicrosoft.com"]
.Request()
.UpdateAsync(user);
我尝试使用 https://graph.microsoft.com/v1.0/users?$filter=ext253rtfdu_name/userId eq ‘456’&$select=displayName,id,userPrincipalName,ext253rtfdu_name
来过滤扩展名以获取用户,但它显示 Invalid filter clause
。但是按照Filtering on schema extension properties known issues,应该是支持的
我不明白这个过滤器发生了什么,但代码示例应该是:
var res = await _graphClient.Users.Request()
.Filter($"ext253rtfdu_name/userId eq '456'").GetAsync()
这里有一个similar post供大家参考。
你可以在身边试一试。