Области и разрешения в платформа удостоверений Майкрософт

Платформа удостоверений Майкрософт реализует протокол авторизации OAuth 2.0. OAuth 2.0 — это метод, посредством которого стороннее приложение может обращаться к интернет-ресурсам от имени пользователя. Любой интернет-ресурс, интегрируемый с платформой удостоверений Майкрософт, имеет идентификатор ресурса или универсальный код ресурса (URI) идентификатора приложения.

В этой статье вы узнаете о область и разрешениях на платформе удостоверений.

В следующем списке показаны некоторые примеры ресурсов, размещенных в Интернете Майкрософт:

  • Microsoft Graph: https://graph.microsoft.com
  • API почты Microsoft 365: https://outlook.office.com
  • Azure Key Vault: https://vault.azure.net

То же касается любых сторонних ресурсов, интегрированных с платформой удостоверений Майкрософт. Любой из этих ресурсов также может определить набор разрешений, которые можно использовать для разделения функциональности этого ресурса на небольшие блоки. Например, в Microsoft Graph определены разрешения для выполнения таких задач, как:

  • чтение календаря пользователя;
  • запись в календарь пользователя;
  • отправка сообщений в качестве пользователя.

Благодаря определениям разрешений этих типов ресурс получает детализированный контроль над своими данными и предоставлением внешнего доступа к функционалу API. Стороннее приложение может запрашивать эти разрешения у пользователей и администраторов. Они должны подтвердить такой запрос, прежде чем приложение получит доступ к данным или начнет действовать от имени пользователя.

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

В OAuth 2.0 наборы разрешений такого типа называются областями. Также их часто называют просто разрешениями. На платформе удостоверений Майкрософт они представлены в виде строковых значений. Приложение запрашивает необходимые разрешения, указывая разрешение в параметре запроса scope. Платформа удостоверений поддерживает несколько четко определенных Подключение область OpenID и разрешений на основе ресурсов (каждое разрешение указывается путем добавления значения разрешения к идентификатору ресурса или URI идентификатора приложения). Например, строка разрешений https://graph.microsoft.com/Calendars.Read используется для запроса разрешения на чтение календарей пользователей в Microsoft Graph.

В запросах к серверу авторизации для платформа удостоверений Майкрософт, если идентификатор ресурса опущен в параметре область, ресурс считается Microsoft Graph. Например, выражение scope=User.Read будет эквивалентно https://graph.microsoft.com/User.Read.

Разрешения, предназначенные только для администраторов

Разрешения в платформа удостоверений Майкрософт могут быть ограничены администратором. Например, для многих разрешений Microsoft Graph с более высоким уровнем привилегий требуется утверждение администратора. Если приложению требуются разрешения, ограниченные администратором, администратор организации должен предоставить согласие на эти область от имени пользователей организации. В следующем разделе приведены примеры таких разрешений:

  • User.Read.All: чтение всех профилей пользователей
  • Directory.ReadWrite.All: запись данных в каталог организации
  • Groups.Read.All: чтение всех групп в каталоге организации

Примечание.

В запросах на авторизацию, маркер или конечные точки согласия для платформа удостоверений Майкрософт, если идентификатор ресурса опущен в параметре область, ресурс считается Microsoft Graph. Например, выражение scope=User.Read будет эквивалентно https://graph.microsoft.com/User.Read.

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

Если приложение запрашивает разрешения приложения, а администратор предоставляет эти разрешения, это разрешение не выполняется от имени какого-либо конкретного пользователя. а напрямую клиентскому приложению. Эти типы разрешений должны использоваться только службами управляющей программы и другими неинтерактивными приложениями, которые выполняются в фоновом режиме. Дополнительные сведения о сценарии прямого доступа см. в сценариях Access в платформа удостоверений Майкрософт.

Пошаговое руководство по использованию область в веб-API см. в статье "Настройка приложения для предоставления веб-API".

Области OpenId Connect

Реализация OpenID Connect на платформе удостоверений Майкрософт имеет несколько четко определенных областей, которые также размещаются в Microsoft Graph: openid, email, profile и offline_access. Области OpenID Connect address и phone не поддерживаются.

Если вы запрашиваете области OpenID Connect и токен, вы получите токен для вызова конечной точки UserInfo.

Область openid

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

Это разрешение позволяет приложению получить уникальный идентификатор для пользователя в виде утверждения sub. Оно также предоставляет приложению доступ к конечной точке UserInfo. Область openid может использоваться в конечной точке токена для платформы удостоверений Майкрософт с целью получения токенов идентификации. Приложение может использовать эти токены для проверки подлинности.

Область email

Область email можно использовать вместе с областью openid и любыми другими областями. Она предоставляет приложению доступ к основному электронному адресу пользователя в виде утверждения email.

Утверждение email включается в токен, только если адрес электронной почты связан с учетной записью пользователя (а это не всегда так). Если приложение использует область email, необходимо предусмотреть ситуацию, когда утверждение email отсутствует в токене.

Область profile

Область profile можно использовать вместе с областью openid и любыми другими областями. Она предоставляет приложению доступ к большому объему сведений о пользователе. Информация, доступ к ней может содержать, но не ограничивается именем пользователя, фамилией, предпочитаемым именем пользователя и идентификатором объекта.

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

Область offline_access

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

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

Примечание.

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

На платформе удостоверений Майкрософт (запросы к конечной точке версии 2.0) приложение должно явно запросить область offline_access для получения токенов обновления. Поэтому при активации кода авторизации в потоке кода авторизации OAuth 2.0 вы получите только маркер доступа из конечной /token точки.

Маркер доступа обычно действителен около одного часа. На этом этапе приложение должно перенаправить пользователя обратно в /authorize конечную точку, чтобы запросить новый код авторизации. Во время этого перенаправления и в зависимости от типа приложения пользователю может потребоваться снова ввести свои учетные данные или снова предоставить согласие на разрешения.

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

Область .default

Область .default используется для предоставления универсальных ссылок на службу ресурса (API) в запросе без указания определенных разрешений. Если требуется согласие, использование .default указывает о необходимости запроса согласия для всех требуемых разрешений, приведенных в регистрации приложения (для всех API в списке).

Значение параметра области создается из URI идентификатора для ресурса и .default, разделенных косой чертой (/). Например, если URI идентификатора ресурса имеет значение https://contoso.com, областью для запроса будет https://contoso.com/.default. В случаях, когда необходимо включить вторую косую черту для правильного запроса токена, см. раздел о замыкающих косых чертах.

Использование scope={resource-identifier}/.default функционально не отличается от использования resource={resource-identifier} на конечной точке v1.0 (где {resource-identifier} — это URI идентификатора для API, например https://graph.microsoft.com для Microsoft Graph).

Область .default можно использовать в любом потоке OAuth 2.0 и для инициирования согласия администратора. Его использование требуется в потоке on-Behalf-Of и потоке учетных данных клиента.

Клиенты не могут объединять статическое (.default) и динамическое согласия в одном запросе. Поэтому scope=https://graph.microsoft.com/.default Mail.Read приводит к ошибке из-за сочетания типов областей.

Параметр .default область активирует только запрос согласия, если согласие не было предоставлено для делегированного разрешения между клиентом и ресурсом от имени вошедшего пользователя.

Если согласие существует, возвращенный маркер содержит все область, предоставленные для этого ресурса для пользователя, вошедшего в систему. Но если для запрашиваемого ресурса не предоставлены разрешения (или если указан параметр prompt=consent), запрос на согласие отображается для всех требуемых разрешений, настроенных в регистрации клиентского приложения, для всех API в списке.

Например, если запрашивается область https://graph.microsoft.com/.default, приложение запрашивает маркер доступа для API Microsoft Graph. Если от имени пользователя, вошедшего в систему, предоставлено по крайней мере одно делегированное разрешение для Microsoft Graph, вход продолжится, а все делегированные разрешения Microsoft Graph, предоставленные для этого пользователя, будут включены в маркер доступа. Если для запрашиваемого ресурса (Microsoft Graph в этом примере) не предоставлены разрешения, запрос на согласие будет представлен для всех требуемых разрешений, настроенных для приложения, для всех API в списке.

Пример 1. Пользователь или администратор клиента предоставил разрешения

В этом примере пользователь или администратор клиента предоставил клиенту разрешения Microsoft Graph Mail.Read и User.Read.

Если клиент запрашивает scope=https://graph.microsoft.com/.default, запрос согласия не отображается независимо от зарегистрированных разрешений клиентского приложения для Microsoft Graph. Возвращаемый токен содержит области Mail.Read и User.Read.

Пример 2. Пользователь не предоставил разрешения между клиентом и ресурсом

В этом примере пользователь (и администратор) не предоставил согласие между клиентом и Microsoft Graph. Клиент зарегистрировал разрешения User.Read и Contacts.Read. Он также зарегистрировал область Azure Key Vault https://vault.azure.net/user_impersonation.

Когда клиент запрашивает маркер для scope=https://graph.microsoft.com/.default, пользователю отображается страница согласия для Microsoft Graph User.Read и областей Contacts.Read, а также для области user_impersonation Azure Key Vault. Возвращаемый маркер содержит только области User.Read и Contacts.Read и может использоваться только с Microsoft Graph.

Пример 3. Пользователь предоставил согласие, а клиент запрашивает дополнительные области

В этом примере пользователь уже предоставил клиенту согласие на разрешение Mail.Read. Клиент зарегистрировал область Contacts.Read.

Сначала клиент выполняет вход с помощью scope=https://graph.microsoft.com/.default. С помощью параметра scopes ответа код приложения определяет, что предоставлено только разрешение Mail.Read. Затем клиент инициирует второй вход с помощью scope=https://graph.microsoft.com/.default и в этот раз принудительно получает согласие с помощью prompt=consent. Если пользователю разрешено предоставить согласие на все разрешения, зарегистрированные приложением, отобразится запрос на согласие. (Если нет, они будут отображаться сообщение об ошибке или форма запроса согласия администратора.) Оба Contacts.Read и Mail.Read будут находиться в запросе на согласие. Если согласие было предоставлено и вход был выполнен, возвращаемый маркер будет предназначаться для Microsoft Graph и включать Mail.Read и Contacts.Read.

.default Использование область с клиентом

В некоторых случаях клиент может запросить собственную область .default. Этот сценарий показан в следующем примере.

// Line breaks are for legibility only.

GET https://login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize
    ?response_type=token            //Code or a hybrid flow is also possible here
    &client_id=00001111-aaaa-2222-bbbb-3333cccc4444
    &scope=9ada6f8a-6d83-41bc-b169-a306c21527a5/.default
    &redirect_uri=https%3A%2F%2Flocalhost
    &state=1234

Этот пример кода создает страницу согласия для всех зарегистрированных разрешений, если предыдущие описания согласия и .default применимы в данном сценарии. Затем код возвращает id_token, а не маркер доступа.

Такая конфигурация не должна использоваться новыми клиентами, предназначенными для платформы удостоверений Майкрософт. Обязательно перейдите в библиотеку проверки подлинности Майкрософт (MSAL) из библиотеки аутентификация Azure AD (ADAL).

Поток предоставления учетных данных клиента и .default

Еще одно назначение .default — запрос ролей приложения (также называются разрешениями приложения) в неинтерактивном приложении, например управляющем, которое использует поток предоставления учетных данных клиента для вызова веб-API.

Сведения об определении ролей приложения (разрешений) для веб-API см. в статье Добавление ролей приложения.

Запросы учетных данных клиента в клиентской службе должны включать scope={resource}/.default. Здесь {resource} — это веб-API, который будет вызываться приложением и для которого оно хочет получить маркер доступа. Отправка запроса учетных данных клиента с помощью отдельных разрешений приложения (ролей) не поддерживается. Все роли приложения (разрешения), предоставленные для этого веб-API, включаются в возвращаемый маркер доступа.

Сведения о предоставлении доступа к определенным ролям приложения, включая предоставление согласия администратора для приложения, см. в статье Настройка клиентского приложения для доступа к веб-API.

Косая черта и .default

В некоторых универсальных кодах ресурса (URI) есть замыкающая косая черта, например https://contoso.com/, а не https://contoso.com. Замыкающая косая черта может вызвать проблемы при проверке токена. Проблемы возникают в основном при запросе токена для Azure Resource Manager (https://management.azure.com/).

В этом случае замыкающая косая черта в коде URI ресурса означает, что при запросе токена должна присутствовать косая черта. Таким образом, при запросе токена для https://management.azure.com/ и использовании .default необходимо запросить https://management.azure.com//.default (обратите внимание на двойную косую черту).

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

См. также