MS Graph API, тип приложения, согласие администратора, разрешение «Contacts.ReadWrite» приводит к отказу в доступе для любого пользователя, кроме администратора - PullRequest
0 голосов
/ 04 ноября 2019

Попытка использовать API MS Graph из HTTP-клиента OAuth 2.0, прошедшего проверку подлинности с помощью регистрации приложения Azure, для вывода списка и создания папок контактов и контактов для любого пользователя с лицензией O365 в одном и том же клиенте. Вызовы API Graph от Postman возвращают действительные результаты JSON, только если целевой пользователь является пользователем Azure Global Administrator, который предоставил разрешение администратора MS Graph API для всего клиента Azure. Попытка получить доступ к контактам или папкам контактов любого другого пользователя-арендатора приводит к ответу об ошибке JSON отказа в доступе.

Согласно документации MS, регистрация приложений Azure, API MS Graph, разрешение администратора, тип приложения «Контакты». ReadWrite должен разрешать доступ ко всем папкам контактов и контактам пользователей.

Однако это толькоработает, чтобы получить контактные папки и контакты пользователя Admin, который согласился с правами администратора. Разрешение «Разрешено администратором», «Тип приложения» ведет себя как разрешение «Разрешено администратором», «Делегированный тип».

Если регистрация приложения с согласием администратора не разрешена, разрешение «Тип приложения« Контакты »разрешает доступ ко всем контактам пользователя-арендатора безнеобходимо, чтобы каждый конечный пользователь дал согласие на доступ?

Это ошибка или ожидаемое поведение при доступе к контактам?

Почему для разрешения на чтение и запись контактов нет ограничения "Все"?

Для разрешений, которые не предлагают элемент ограничения «Все» в имени разрешения, игнорирует ли регистрация приложения «Соглашение с администратором типа приложения» и по умолчанию для пользователя, который дал согласие, работая вместо этого как пользователь? Разве это не идет вразрез с тем, чтобы иметь разрешения «Согласие администратора» и «Тип приложения»?

Нужно ли каждому делегату делегировать доступ к папке контактов и контактам для пользователя Admin?

1) Созданрегистрация приложения Azure 2) Предоставленные Microsoft Graph API, тип приложения, разрешения для этой регистрации приложения Azure для:

https://graph.microsoft.com/Group.ReadWrite.All https://graph.microsoft.com/Directory.Read.All https://graph.microsoft.com/Contacts.ReadWrite

3) Предоставленные Microsoft Graph API, делегированный тип, разрешения для этой регистрации приложения Azure для:

offline_access

4) Сконфигурированный токен доступа OAuth 2.0 Почтальона с областью действия:

offline_access https://graph.microsoft.com/Group.ReadWrite.All https://graph.microsoft.com/Directory.Read.All https://graph.microsoft.com/Contacts.ReadWrite

Данные [ОПРЕДЕЛЕНЫ] из приведенного ниже примера.

Получить контактыПользователь Azure Global Administrator (пример: admin_user@fake.com), предоставивший согласие администратора на тип приложения API MS Graph Разрешения:

ЗАПРОС:

https://graph.microsoft.com/v1.0/users/admin_user@fake.com/contacts

ОТВЕТ:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('admin_user%40fake.com')/contacts",
    "value": [
        {
            "@odata.etag": "W/\"[OMITTED]\"",
            "id": "[OMITTED]",
            "createdDateTime": "2019-10-25T17:11:06Z",
            "lastModifiedDateTime": "2019-10-30T13:11:13Z",
            "changeKey": "[OMITTED]",
            "categories": [],
            "parentFolderId": "[OMITTED]",
            "birthday": null,
            "fileAs": "test, Test",
            "displayName": "Test test",
            "givenName": "Test",
            "initials": null,
            "middleName": null,
            "nickName": null,
            "surname": "test",
            "title": null,
            "yomiGivenName": null,
            "yomiSurname": null,
            "yomiCompanyName": null,
            "generation": null,
            "imAddresses": [],
            "jobTitle": null,
            "companyName": null,
            "department": null,
            "officeLocation": null,
            "profession": null,
            "businessHomePage": null,
            "assistantName": null,
            "manager": null,
            "homePhones": [
                "666-666-6666"
            ],
            "mobilePhone": "555-555-5555",
            "businessPhones": [
                "777-777-7777"
            ],
            "spouseName": null,
            "personalNotes": "Test",
            "children": [],
            "emailAddresses": [],
            "homeAddress": {},
            "businessAddress": {},
            "otherAddress": {}
        }
    ]
}

Попробуйте получить контакты любого другого пользователя с лицензией O365 (пример: other_user@fake.com):

ЗАПРОС:

https://graph.microsoft.com/v1.0/users/other_user@fake.com/contacts

ОТВЕТ:

{
  "error": {
    "code": "ErrorAccessDenied",
    "message": "Access is denied. Check credentials and try again.",
    "innerError": {
      "request-id": "[OMITTED]",
      "date": "2019-11-04T16:40:58"
    }
  }
}

Получите контактные папки пользователя Azure Global Administrator (пример: admin_user@fake.com), которому предоставлено согласие администратора на тип приложения API MS Graph. Разрешения:

ЗАПРОС:

https://graph.microsoft.com/v1.0/users/admin_user@fake.com/contactfolders

ОТВЕТ:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users('admin_user%40fake.com')/contactFolders",
    "value": [
        {
            "id": "[OMITTED]",
            "parentFolderId": "[OMITTED]",
            "displayName": "Test Contacts Folder"
        }
    ]
}

Попробуйте получить папки с контактами любого другого пользователя с лицензией O365 (пример: other_user@fake.com):

ЗАПРОС:

https://graph.microsoft.com/v1.0/users/other_user@fake.com/contactfolders

ОТВЕТ:

{
  "error": {
    "code": "ErrorAccessDenied",
    "message": "Access is denied. Check credentials and try again.",
    "innerError": {
      "request-id": "[OMITTED]",
      "date": "2019-11-04T16:49:42"
    }
  }
}

Текущий перманент при регистрации приложения

1 Ответ

0 голосов
/ 04 ноября 2019

Из документации:

Существует два сценария, когда приложение может получить контакты в папке контактов другого пользователя:

  • Если приложение имеет разрешения для приложения, или,
  • Если приложение имеет соответствующие делегированные разрешения от одного пользователя, а другой пользователь открыл доступ к папке контактов с этим пользователем или предоставил делегированный доступ этому пользователю. См. подробности и пример .

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

Если вы хотите получить доступ к любым контактам пользователя, вам необходимо использовать Contacts.Read или Contacts.ReadWrite Приложение scope.

В общемРесурсы на основе Exchange не используют соглашения .All. Они полагаются на тип области (Приложение против Делегированного), чтобы определить, может ли приложение видеть всех пользователей или только ресурсы аутентифицированного пользователя.

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