Кто-нибудь использует новую версию 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>