[英]MS Graph SDK How to Add/Update a Schema Extension property to a User object
我很難找到有關如何在 Azure AD 中針對用戶添加架構擴展值的任何代碼示例。
到目前為止,我已經成功創建了自己的架構擴展,標記為“用戶”TargetType,並將狀態更新為“可用”。 這一切都是通過 MS Graph SDK 實現的
下面是一個屏幕截圖,顯示了我在我的應用程序中創建並列出的擴展程序:
這個擴展非常基本,只有一個名為“name”的屬性被設置為字符串類型。
我現在要執行以下功能:
MS Docs 給出的唯一示例是使用 MS Graph API,而不是我在我的應用程序中使用的 SDK。 此外,他們給出的唯一示例是在創建新組時添加模式擴展。
https://docs.microsoft.com/en-us/graph/extensibility-schema-groups
在他們的筆記中,MS 說了以下內容:注意:本主題向您展示如何在組資源上創建和讀取架構擴展值(步驟 3-5)。 管理單元、設備、事件、消息、組織、帖子和用戶資源類型也支持相同的方法。 您可以對任何這些資源執行與本文中的請求示例類似的操作。
有人可以建議我從哪里獲得代碼示例,該示例允許我使用此擴展創建/更新用戶,以及對我的租戶中的所有用戶使用過濾搜索,這些用戶在他們的個人資料中為此特定擴展設置了特定值?
更新:結合 Allen Wu 在下面的答案中的討論,我已經實現了他的代碼示例,在創建新用戶時將模式擴展添加為“AdditionalData”。 我還沒有設法讓它工作,因為我收到一條錯誤消息“代碼:BadRequest\r\nMessage: Unsupported Schema Extension Property value of type String\r\nInner error:\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 questions ,應該是支持的。
我不明白這個過濾器會發生什么,但代碼示例應該是:
var res = await _graphClient.Users.Request()
.Filter($"ext253rtfdu_name/userId eq '456'").GetAsync()
這里有一個類似的帖子供您參考。
你可以從你身邊試一試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.