在 Azure AD B2C 中使用 Azure AD Graph API 创建用户
Create user using Azure AD Graph API in Azure AD B2C
我正在尝试在我的 Azure AD B2C 目录中创建一个用户。我已经通过在 cmd 中使用此命令 posting 示例 JSON 文件成功创建了一个用户:
>B2C Create-User <Path to my JSON file>
我想做的是 post 一些 JSON 字符串而不是 JSON 文件,命令行给我以下错误:
Error Calling the Graph API:
{
"odata.error": {
"code": "Request_BadRequest",
"message": {
"lang": "en",
"value": "A value without a type name was found and no expected type is available. When the model is specified, each value in the payload must have a type which can be either specified in the payload, explicitly by the caller or implicitly inferred from the parent value."
},
"requestId": "965dba69-4488-4d24-88a4-989a6d06cd8d",
"date": "2019-03-19T12:55:27"
}
}
我就是这么想的 post JSON:
private static void CreateUser(string[] args)
{
string json = new JavaScriptSerializer().Serialize(new
{
accountEnabled = true,
SignInName = new List<UserInformation.SignInName>()
{
new UserInformation.SignInName(){ type = "emailAddress", value = "safanmomin92@gmail.com" }
},
creationType = "LocalAccount",
displayName = "Safan Momin",
mailNickname = "Safan",
passwordProfile = new UserInformation.PasswordProfile
{
password = "Mazik@123", forceChangePasswordNextLogin = false
},
passwordPolicies = "DisablePasswordExpiration"
});
object formatted = JsonConvert.DeserializeObject(client.CreateUser(json).Result);
}
这是我的 CreateUser 方法:
public async Task<string> CreateUser(string json)
{
return await SendGraphPostRequest("/users", json);
}
这是我的 SendGraphPostRequest 方法:
private async Task<string> SendGraphPostRequest(string api, string json)
{
// NOTE: This client uses ADAL v2, not ADAL v4
AuthenticationResult result = authContext.AcquireToken(Globals.aadGraphResourceId, credential);
HttpClient http = new HttpClient();
string url = Globals.aadGraphEndpoint + tenant + api + "?" + Globals.aadGraphVersion;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("POST " + url);
Console.WriteLine("Authorization: Bearer " + result.AccessToken.Substring(0, 80) + "...");
Console.WriteLine("Content-Type: application/json");
Console.WriteLine("");
Console.WriteLine("JSON: "+json);
Console.WriteLine("");
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = await http.SendAsync(request);
if (!response.IsSuccessStatusCode)
{
string error = await response.Content.ReadAsStringAsync();
object formatted = JsonConvert.DeserializeObject(error);
throw new WebException("Error Calling the Graph API: \n" + JsonConvert.SerializeObject(formatted, Formatting.Indented));
}
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine((int)response.StatusCode + ": " + response.ReasonPhrase);
Console.WriteLine("");
return await response.Content.ReadAsStringAsync();
}
我在比较我的 JSON 字符串时发现那里有错误。我写的是 SignInName
而不是 signInNames
。
我正在尝试在我的 Azure AD B2C 目录中创建一个用户。我已经通过在 cmd 中使用此命令 posting 示例 JSON 文件成功创建了一个用户:
>B2C Create-User <Path to my JSON file>
我想做的是 post 一些 JSON 字符串而不是 JSON 文件,命令行给我以下错误:
Error Calling the Graph API:
{
"odata.error": {
"code": "Request_BadRequest",
"message": {
"lang": "en",
"value": "A value without a type name was found and no expected type is available. When the model is specified, each value in the payload must have a type which can be either specified in the payload, explicitly by the caller or implicitly inferred from the parent value."
},
"requestId": "965dba69-4488-4d24-88a4-989a6d06cd8d",
"date": "2019-03-19T12:55:27"
}
}
我就是这么想的 post JSON:
private static void CreateUser(string[] args)
{
string json = new JavaScriptSerializer().Serialize(new
{
accountEnabled = true,
SignInName = new List<UserInformation.SignInName>()
{
new UserInformation.SignInName(){ type = "emailAddress", value = "safanmomin92@gmail.com" }
},
creationType = "LocalAccount",
displayName = "Safan Momin",
mailNickname = "Safan",
passwordProfile = new UserInformation.PasswordProfile
{
password = "Mazik@123", forceChangePasswordNextLogin = false
},
passwordPolicies = "DisablePasswordExpiration"
});
object formatted = JsonConvert.DeserializeObject(client.CreateUser(json).Result);
}
这是我的 CreateUser 方法:
public async Task<string> CreateUser(string json)
{
return await SendGraphPostRequest("/users", json);
}
这是我的 SendGraphPostRequest 方法:
private async Task<string> SendGraphPostRequest(string api, string json)
{
// NOTE: This client uses ADAL v2, not ADAL v4
AuthenticationResult result = authContext.AcquireToken(Globals.aadGraphResourceId, credential);
HttpClient http = new HttpClient();
string url = Globals.aadGraphEndpoint + tenant + api + "?" + Globals.aadGraphVersion;
Console.ForegroundColor = ConsoleColor.Cyan;
Console.WriteLine("POST " + url);
Console.WriteLine("Authorization: Bearer " + result.AccessToken.Substring(0, 80) + "...");
Console.WriteLine("Content-Type: application/json");
Console.WriteLine("");
Console.WriteLine("JSON: "+json);
Console.WriteLine("");
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, url);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
request.Content = new StringContent(json, Encoding.UTF8, "application/json");
HttpResponseMessage response = await http.SendAsync(request);
if (!response.IsSuccessStatusCode)
{
string error = await response.Content.ReadAsStringAsync();
object formatted = JsonConvert.DeserializeObject(error);
throw new WebException("Error Calling the Graph API: \n" + JsonConvert.SerializeObject(formatted, Formatting.Indented));
}
Console.ForegroundColor = ConsoleColor.Green;
Console.WriteLine((int)response.StatusCode + ": " + response.ReasonPhrase);
Console.WriteLine("");
return await response.Content.ReadAsStringAsync();
}
我在比较我的 JSON 字符串时发现那里有错误。我写的是 SignInName
而不是 signInNames
。