API Call Graph из приложения MVC - PullRequest
0 голосов
/ 29 мая 2018

ОБЩАЯ ИНФОРМАЦИЯ: Я получил образец, работающий сегодня, благодаря множеству хороших ответов.Спасибо всем.Моей основной целью было получить информацию о текущем пользователе (ME) без использования секретного ключа.Сначала я просто использовал секретный ключ от App Reg, и это будет аутентифицировать приложение, а не пользователя.Это, конечно, не работает при вызове меня.Следующим моим выводом было то, что если вам нужен токен пользователей, вам все еще нужен токен App Reg, а затем вы запрашиваете токен пользователей.Для этого требуется меньше разрешений в App Reg, но требуется запросить два токена.В итоге я пропустил ME и просто запросил информацию для указанного пользователя (через разрешения APp Reg):

$"https://graph.microsoft.com/v1.0/users/{email}/$select=companyName"

Оба эти подхода должны быть жизнеспособными.Я обновил код ниже с рабочим образцом.


Я пытаюсь сделать очень простой вызов API графа, чтобы получить companyName от текущего пользователя.Нашли несколько образцов, но они показались очень сложными.Приложение MVC аутентифицируется посредством регистрации приложения в AAD.

Я полагаю, что для регистрации приложения необходимо авторизоваться для доступа к API Graph.Или здесь больше нужно?Получение названия компании должно быть довольно простым:

https://graph.microsoft.com/v1.0/me?$select=companyName

У кого-нибудь есть фрагмент для вызова API графа, лучше всего было бы вам извлечь извлеченный токен из контроллера?ALl помощь приветствуется.

Рабочий фрагмент:

   public async Task<ActionResult> Index()
    {

           string clientId = "xxx";
        string clientSecret = "xxx";

        var email = User.Identity.Name;

        AuthenticationContext authContext = new AuthenticationContext("https://login.windows.net/xxx.onmicrosoft.com/oauth2/token");
        ClientCredential creds = new ClientCredential(clientId, clientSecret);
        AuthenticationResult authResult = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", creds);

        HttpClient http = new HttpClient();
        string url = $"https://graph.microsoft.com/v1.0/users/{email}/$select=companyName";
        //url = "https://graph.windows.net/xxx.onmicrosoft.com/users?api-version=1.6";

        // Append the access token for the Graph API to the Authorization header of the request by using the Bearer scheme.
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, url);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken);
        HttpResponseMessage response = await http.SendAsync(request);
        var json = response.Content.ReadAsStringAsync();

        return View();
    }

Ответы [ 2 ]

0 голосов
/ 22 июня 2018

Чтобы добавить один последний элемент, вот ссылка на образец MVC в Git, который использует приложение MVC для отправки электронной почты.Это иллюстрирует, как вызвать MS Graph API, чтобы получить различную информацию.Имейте в виду, что если вы используете сценарий только для приложения, ME не будет работать, пример показывает, как получить делегированный токен для пользователя и использовать этот токен для выполнения работы:

https://github.com/microsoftgraph/aspnet-connect-rest-sample

0 голосов
/ 22 июня 2018

Если я правильно читаю этот фрагмент кода, вы запрашиваете только токен приложения для ресурса Graph.Microsoft.Com, а затем пытаетесь использовать этот токен с этим URI: url = "https://graph.windows.net/thomaseg.onmicrosoft.com/users?api-version=1.6"

Это не будет работать, потому что вы смешиваете ресурсы, AAD Graph и MS Graph. Конечная точка ME не создается, поскольку в этом сценарии вы используете только прикладной поток. Этот поток не поддерживает конечную точку ME. ME предназначен для использования сделегированный токен. Конечная точка ME представляет вошедшего в систему пользователя, поскольку приложение не является пользователем, ME не имеет смысла.

Вам нужно будет специально нацелить пользователя:

https://graph.microsoft.com/v1.0/Users/[UPN или ID пользователя]? $ Select = companyName

Должно работать, если вашему приложению были предоставлены соответствующие области разрешений.

...