0

У меня загружено приложение MVC из Git для API-диаграммы AAD. Я запускал это приложение, но каждый раз, когда я не получаю ожидаемого результата.Graph API не работает через код проекта, но тот же URL-адрес работает через AD Graph Explorer

Чтобы найти ошибку, я запускаю один и тот же api, используя postman и сгенерированный токен ниже, был ответом.

{ 
    "odata.error": { 
    "code": "Request_ResourceNotFound", 
    "message": { 
     "lang": "en", 
     "value": "Resource not found for the segment 'me'." 
    } 
    } 
} 

Я использую ниже Получить url-

https://graph.windows.net/XXXXX/me?api-version=1.6 

Кроме того, чтобы проверить это работает с AAD Grapg api explorer. После входа в систему все работает нормально.

Ниже приведен код для вызова Grapg API-

// Get the access token from the cache 
      string userObjectID = 
       ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier") 
        .Value; 

      string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant); 

      //AuthenticationContext authContext = new AuthenticationContext(authority, 
      // new NaiveSessionCache(userObjectID)); 
      ClientCredential credential = new ClientCredential(clientId, appKey); 
      AuthenticationContext authContext = new AuthenticationContext(authority, true); 
      result = await authContext.AcquireTokenAsync(graphResourceId.ToString(), credential); 
      var Token = result.AccessToken; 
      //// AcquireTokenSilentAsync 
      //result = await authContext.AcquireTokenSilentAsync(graphResourceId, credential, 
      // new UserIdentifier(userObjectID, UserIdentifierType.UniqueId)); 

      // Call the Graph API manually and retrieve the user's profile. 
      string requestUrl = String.Format(
       CultureInfo.InvariantCulture, 
       graphUserUrl, 
       HttpUtility.UrlEncode(tenantId)); 
      HttpClient client = new HttpClient(); 
      HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUrl); 
      request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken); 
      HttpResponseMessage response = await client.SendAsync(request); 

      // Return the user's profile in the view. 
      if (response.IsSuccessStatusCode) 
      { 
       string responseString = await response.Content.ReadAsStringAsync(); 
       profile = JsonConvert.DeserializeObject<UserProfile>(responseString); 
      } 

Не могли бы вы, ребята, пожалуйста, скажите мне, что это проблема с моим кодом. Почему он работает с AAD Explorer не с Localhost.

+0

Можете ли вы поделиться своим токеном (после обфускации секретной информации)? Вы хотите убедиться, что используете токен доступа с пользовательским контекстом, иначе API-интерфейс Graph не будет знать, кто «я». –

ответ

0

Чтобы запросить конечную точку me Azure AD Graph REST, нам необходимо использовать токен делегата, который представляет пользователя входа.

Код выше вы приобретаете токен, используя Клиентский учетный поток запрашивает токен доступа, который представляет для приложения, которое не содержит информацию о пользователе входа.

Для достижения этой цели в приложении MVC нам необходимо получить токен после того, как вы получите код авторизации при входе в систему. В следующий раз мы можем получить токен из кеша токенов на основе пользователя входа.

Вот код для справки (пример кода из here):

result = await authContext.AcquireTokenSilentAsync(graphResourceId, credential, 
       new UserIdentifier(userObjectID, UserIdentifierType.UniqueId)); 
+0

Спасибо Fei за ответ, я тоже попробовал этот код, но используя этот код, я не могу сгенерировать токен. Когда я использую код выше, я получаю исключение. Что-то не хватает. Кроме того, у меня есть загрузка одного и того же проекта из git и настройка в соответствии с нашим AAD. –

+0

Я создал для этой проблемы разные темы, которые вы можете найти здесь (http://stackoverflow.com/questions/41586897/authcontext-acquiretokensilentasync-throwing-error) –

+0

Какое сообщение об ошибке вы получили? Можете ли вы получить токен доступа при входе пользователя в код 'AuthorizationCodeReceived' класса' Startup'? –