2016-09-11 6 views
3

Я ранее добавлял пользователей программно с помощью библиотеки проверки подлинности Active Directory (ADAL), но теперь мне нужно определить «signInNames» (= пользователи электронная почта), и это не представляется возможным с ADAL (пожалуйста, скажите мне, если я ошибаюсь).Создайте нового пользователя в Azure Active Directory (B2C) с помощью Graph API, используя HTTP post request

Теперь я пытаюсь добавить нового пользователя (локальную учетную запись) программно, используя HTTP POST, после the documentation on MSDN.

//Get access token (using ADAL) 
var authenticationContext = new AuthenticationContext(AuthString, false); 
var clientCred = new ClientCredential(ClientId, ClientSecret); 
var authenticationResult = authenticationContext.AcquireTokenAsync(ResourceUrl, clientCred); 
var token = authenticationResult.Result.AccessToken; 


//HTTP POST CODE 
const string mail = "[email protected]"; 
// Create a new user object. 
var user = new CustomUser 
{ 
    accountEnabled = true, 
    country = "MS", 
    creationType = "LocalAccount", 
    displayName = mail, 
    passwordPolicies = "DisablePasswordExpiration,DisableStrongPassword", 
    passwordProfile = new passwordProfile { password = "jVPmEm)6Bh", forceChangePasswordNextLogin = true }, 
    signInNames = new signInNames { type = "emailAddress", value = mail } 
}; 

var url = "https://graph.windows.net/" + TenantId + "/users?api-version=1.6"; 

var jsonObject = JsonConvert.SerializeObject(user); 

using (var client = new HttpClient()) 
{ 
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); 

    var response = client.PostAsync(url, 
     new StringContent(JsonConvert.SerializeObject(user).ToString(), 
      Encoding.UTF8, "application/json")) 
      .Result; 

    if (response.IsSuccessStatusCode) 
    { 
     dynamic content = JsonConvert.DeserializeObject(
      response.Content.ReadAsStringAsync() 
      .Result); 

     // Access variables from the returned JSON object 
     var appHref = content.links.applications.href; 
    } 
} 

Но я не имею никакого успеха, получив этот ответ:

{StatusCode: 400, ReasonPhrase: 'Bad Request', Version: 1.1, Content:....} 

Любые идеи, что я должен делать? Мне удалось использовать скрипт Powershell, но мне нужно сделать это в своем приложении C#.

ответ

1

Спасибо за ваш ответ Fei Xue, Я считаю, что у меня были права. Что я сделал, чтобы решить мою проблему.

Прежде всего, я удалил свой собственный пользовательский класс «NewUser», затем загрузил этот образец-проект: https://github.com/AzureADQuickStarts/B2C-GraphAPI-DotNet/blob/master/B2CGraphClient/B2CGraphClient.cs, чтобы устранить риск того, что мой код был не прав. Я изменил его, чтобы поддержать свои потребности, то я создал простой JObject:

var jsonObject = new JObject 
         { 
          {"accountEnabled", true}, 
          {"country", customer.CustomerBase.Company}, 
          {"creationType", "LocalAccount"}, 
          {"displayName", pendingCustomer.Email.Trim()}, 
          {"passwordPolicies", "DisablePasswordExpiration,DisableStrongPassword"}, 
          {"passwordProfile", new JObject 
          { 
           {"password", pwd}, 
           {"forceChangePasswordNextLogin", true} 
          } }, 
          {"signInNames", new JArray 
           { 
            new JObject 
            { 
             {"value", pendingCustomer.Email.Trim()}, 
             {"type", "emailAddress"} 
            } 
           } 
          } 
         }; 

client = new B2CGraphClient(ClientId, ClientSecret, TenantId); 
var response = await client.CreateUser(jsonObject.ToString()); 
var newUser = JsonConvert.DeserializeObject<User>(response); 

От B2CGraphClient.cs

 private async Task<string> SendGraphPostRequest(string api, string json) 
    { 
     // NOTE: This client uses ADAL v2, not ADAL v4 
     var result = authContext.AcquireToken(Globals.aadGraphResourceId, credential); 
     var http = new HttpClient(); 
     var url = Globals.aadGraphEndpoint + tenant + api + "?" + Globals.aadGraphVersion; 

     var request = new HttpRequestMessage(HttpMethod.Post, url); 
     request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); 
     request.Content = new StringContent(json, Encoding.UTF8, "application/json"); 
     var response = await http.SendAsync(request); 

     if (!response.IsSuccessStatusCode) 
     { 
      var error = await response.Content.ReadAsStringAsync(); 
      var formatted = JsonConvert.DeserializeObject(error); 
      //Console.WriteLine("Error Calling the Graph API: \n" + JsonConvert.SerializeObject(formatted, Formatting.Indented)); 
      Logger.Error("Error Calling the Graph API: \n" + JsonConvert.SerializeObject(formatted, Formatting.Indented)); 
     } 
     Logger.Info((int)response.StatusCode + ": " + response.ReasonPhrase); 

     return await response.Content.ReadAsStringAsync(); 
    } 

Это окончательно решить все мои проблемы, это, вероятно, формат ошибки в сериализации моего класса NewCustomer, который затем был отклонен API.

2

Предоставили ли вы приложению достаточное разрешение для работы пользователей? Создавать пользовательский REST API хорошо работает для арендатора B2C.

Вот шаги, я тестировал:

1.Create приложение с помощью PowerShell ниже

PowerShell: 

$bytes = New-Object Byte[] 32 
$rand = [System.Security.Cryptography.RandomNumberGenerator]::Create() 
$rand.GetBytes($bytes) 
$rand.Dispose() 
$newClientSecret = [System.Convert]::ToBase64String($bytes) 

New-MsolServicePrincipal -DisplayName "My New B2C Graph API App" -Type password -Value 

2.Grant приложение для роли администратора учетной записи пользователя.

Add-MsolRoleMember -RoleObjectId fe930be7-5e62-47db-91af-98c3a49a38b1 -RoleMemberObjectId 7311370c-dac3-4f34-b2ce-b22c2a5a811e -RoleMemberType servicePrincipal 

3.Get маркер для приложения с клиента верительных потока

POST: https://login.microsoftonline.com/adb2cfei.onmicrosoft.com/oauth2/token 
grant_type=client_credentials&client_id={AppPrincipalId return by PowerShell}&client_secret={client_secret}&resource=https%3A%2F%2Fgraph.windows.net 

4.Create пользователя с REST ниже:

POST: https://graph.windows.net/adb2cfei.onmicrosoft.com/users?api-version=1.6 
authorization: bearer {token} 
content-type: application/json 

{ 
    "accountEnabled": true, 
    "creationType": "LocalAccount", 
    "displayName": "Alex Wu", 
    "passwordProfile": { 
    "password": "Test1234", 
    "forceChangePasswordNextLogin": false 
    }, 
    "signInNames": [ 
    { 
     "type": "userName", 
     "value": "AlexW" 
    }, 
    { 
     "type": "emailAddress", 
     "value": "[email protected]" 
    } 
    ] 
}