API-интерфейс Azure AD Graph возвращает «Запрещено» - PullRequest
1 голос
/ 06 марта 2019

Когда я хочу получить членов из API api из моего приложениявсегда получаю

Response: StatusCode: 403, ReasonPhrase: 'Forbidden', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Pragma: no-cache
  ocp-aad-diagnostics-server-name: aVvd1R49Sg=
  request-id: 67105ddc-2b5f-84bf-7ec43a4d3117
  client-request-id: fb1ef66f-451357f08975abd4
  x-ms-dirapi-data-contract-version: 1.6
  ocp-aad-session-key: _XjEM7ooA1Emw_l6FjiyMwKqtoEPSWgxw-04c_nX785foVv6fGM_lBejApG_gJW2fXC_LBNrZRJRryuBIOO7_O1bF2oEEiWMvnW9Ywx71OP0NJ5gRyZDGlLyNsjmsDvu.42WXAH4v8FjbaSNvNtH1Nnkm3z5on0J5ZsptMguA52A
  DataServiceVersion: 3.0;
  Strict-Transport-Security: max-age=31536000; includeSubDomains
  Access-Control-Allow-Origin: *
  Duration: 853533
  Cache-Control: no-cache
  Date: Tue, 05 Mar 2019 14:01:17 GMT
  Server: Microsoft-IIS/10.0
  X-AspNet-Version: 4.0.30319
  X-Powered-By: ASP.NET
  Content-Length: 219
  Content-Type: application/json; odata=minimalmetadata; streaming=true; charset=utf-8
  Expires: -1
} 

Когда я называю это получаем из https://graphexplorer.azurewebsites.net/ все в порядке.

В Azure AD я настроил разрешения для разрешения API

Код вызова:

private static List<string> GetGroupsFromGraphAPI(ClaimsIdentity claimsIdentity)
        {
            _logger.Info($"Getting claims from Graph API for {claimsIdentity.Name}.");

            List<string> groupObjectIds = new List<string>();

            var aadClientId = ConfigurationManager.AppSettings["ida:ClientId"];
            var aadSecret = ConfigurationManager.AppSettings["ida:ClientSecret"];
            var aadDirectoryId = ConfigurationManager.AppSettings["ida:DirectoryId"];

            ClientCredential credential = new ClientCredential(aadClientId, aadSecret);
            AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/" + aadDirectoryId);
            string accessToken;
            try
            {
                _logger.Info($"Client ID: {aadClientId}");
                _logger.Info($"Secret: {aadSecret}");
                _logger.Info($"Directory id: {aadDirectoryId}");

                var token = authContext.AcquireToken("https://graph.windows.net", credential);
                _logger.Info($"Token: {token.ToString()}");
                accessToken = token.AccessToken;
                _logger.Info($"Get access token {accessToken}");
            }
            catch
            {
                _logger.Error("Cannot aquire token for Graph API.");
                throw;
            }

            var userId = claimsIdentity.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier");
            if (userId == null)
            {
                _logger.Warn($"No user ID to get group membership for. ({claimsIdentity.Name})");
                return groupObjectIds;
            }

            HttpClient client = new HttpClient();
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
            HttpResponseMessage response;
            try
            {
                var link =
                    $"https://graph.windows.net/{aadDirectoryId}/users/{userId.Value}/$links/memberOf?api-version=1.6";
                _logger.Info($"GetAsync {link}");
                response = client.GetAsync(link).Result;
            }
            catch
            {
                _logger.Error("Failed to load group membership for " + claimsIdentity.Name);
                throw;
            }
}

1 Ответ

1 голос
/ 06 марта 2019
  1. Причина ошибки Forbidden и необходимость согласия администратора

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

        ClientCredential credential = new ClientCredential(aadClientId, aadSecret);
        AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/" + aadDirectoryId);  
        ...
        var token = authContext.AcquireToken("https://graph.windows.net", credential);
    

    enter image description here

    На скриншоте, к которому вы прикрепили Directory.Read.All, выбрано разрешение для Azure AD Graph, но также указано, что согласие администратора не выполнено. Если вы посмотрите на разрешение, оно ясно говорит: «Требуется согласие администратора» - «Да».

    Таким образом, для вас будет принято решение предоставить согласие администратора на требуемое разрешение. Вы можете сделать это непосредственно на портале Azure (той же странице, на которой вам назначены разрешения), если вы вошли в систему как администратор. Другой способ - использовать конечную точку AdminConsent

    .

    enter image description here

  2. Почему это работает для вас с https://graphexplorer.azurewebsites.net/

    Azure AD Graph Explorer использует Delegated Permissions и вызывает API как пользователь, который вошел в систему, поэтому он работает для вас. Пока вы пытаетесь сделать то же самое с вашим приложением, отличие состоит в том, что вы звоните с идентификатором приложения, у которого пока нет согласованных разрешений.

  3. В соответствии с разрешениями API требуется только API Azure AD Graph

    В коде, которым вы поделились, вы звоните только https://graph.windows.net, поэтому вашему приложению нужны только разрешения на Azure AD Graph API. Вы можете безопасно удалить разрешения, назначенные для Microsoft Graph API (если вы не используете Microsoft Graph API где-то еще в вашем приложении)

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