Azure Active Directory Graph Client 2.0

Кто-нибудь использует новую версию 2.0 клиента Azure AD Graph?

Я начал дурачиться с этим вчера, но не могу заставить его работать. Класс GraphConnection помечен как устаревший и заменен на ActiveDirectoryClient. Кроме того, это все Office 365, а я хочу ограничить свои испытания Azure Active Directory без O365. Трудно найти документацию, по крайней мере, когда вы не хотите использовать инструменты API O365 и O365. Примеры AD на GitHub, похоже, также обновлены, но код все еще использует класс GraphConnection. Пойди разберись.

Еще не очень много примеров/рекомендаций по использованию клиента ActiveDirectory, поэтому ниже приведен код, используемый на данный момент

public async Task<ActionResult> Index()
        {
            List<Exception> exceptions = new List<Exception>();
            ProfileViewModel model = new ProfileViewModel();
            string userObjectID = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;
            AuthenticationContext authContext = new AuthenticationContext(SecurityConfiguration.Authority, new NaiveSessionCache(userObjectID));
            ClientCredential credential = new ClientCredential(SecurityConfiguration.ClientId, SecurityConfiguration.AppKey);

            try
            {
                var ServiceUri = new Uri(SecurityConfiguration.GraphUrl);
                ActiveDirectoryClient client = new ActiveDirectoryClient(ServiceUri, async () =>
                {
                    var result = await authContext.AcquireTokenSilentAsync(SecurityConfiguration.GraphUrl, credential, new UserIdentifier(userObjectID, UserIdentifierType.UniqueId));

                    return result.AccessToken;
                });
                try
                {

                    var users = await client.Users.ExecuteAsync();

                    var user = await client.Users[userObjectID].ExecuteAsync();


                }
                catch (Exception exc) 
                {
                    exceptions.Add(exc);
                }


            }
            catch (AdalSilentTokenAcquisitionException exc)
            {
                exceptions.Add(exc);

            }
            ViewBag.Exceptions = exceptions;
            return View(model);
        }

client.Users.ExecuteAsync() исключения

Полезная нагрузка ответа не является допустимой полезной нагрузкой ответа. Убедитесь, что элемент верхнего уровня является допустимым элементом Atom или JSON или принадлежит пространству имен ' http://schemas.microsoft.com/ado/2007/08/dataservices '.

client.Users[userObjectID].ExecuteAsync() throws

System.Reflection.TargetInvocationException with Innerexpection Ожидается относительный путь URL без запроса или фрагмента. Имя параметра: entitySetName

ОБНОВЛЕНИЕ 2/11

Жуткое разрешение: без изменения одной строки кода client.Users.ExecuteAsync() работал как положено. Я думаю, что люди из MSFT изменили некоторые вещи в API, так что полезная нагрузка ответа теперь верна. Они могли бы упомянуть это.

Чтобы получить информацию о пользователе, используя код v2.0 ниже, делает свое дело

var userFetcher = client.Users.Where(u => u.ObjectId == userObjectID);
var user = await userFetcher.ExecuteAsync();

Если вы используете бритву для отображения контента пользователя, вы, вероятно, получите исключения бритвы при попытке просмотреть коллекцию, такую как AssignedPlans

Тип System.Object определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку "System.Runtime, версия = 4.0.0.0, культура = нейтральная, PublicKeyToken = b03f5f7f11d50a3a".

Решение состоит в том, чтобы изменить параметры компиляции в вашем файле web.config, как описано в http://www.lyalin.com/2014/04/25/the-type-system-object-is-defined-in-an-assembly-that- это-не-ссылка MVC-ПКЛ-вопрос/

<compilation debug="true" targetFramework="4.5" >
      <assemblies>
        <add assembly="System.Runtime, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
      </assemblies>
    </compilation>

Ответ 1

Для получения пользовательского объекта по идентификатору, а не:

var userFetcher = client.Users.Where(u => u.ObjectId == userObjectID); 
var user = await userFetcher.ExecuteAsync();

вы можете просто использовать getByObjectId напрямую:

var user = await client.Users.GetByObjectId(userObjectID).ExecuteAsync();