Запрос маркера доступа в Azure Active Directory B2C

Маркер доступа содержит утверждения, которые можно использовать в Azure Active Directory B2C (Azure AD B2C) для определения разрешений, предоставленных API-интерфейсам. Чтобы вызвать сервер ресурсов, HTTP-запрос должен содержать маркер доступа. В ответах из Azure AD B2C маркер доступа обозначается как access_token.

В этой статье содержатся сведения о запросе маркер доступа для веб-приложения и веб-API. Дополнительные сведения о маркерах в Azure AD B2C см. в статье с обзором маркеров в Azure Active Directory B2C.

Примечание

Цепочки веб-API (On-Behalf-Of) не поддерживаются Azure AD B2C. Многие архитектуры включают в себя веб-API, который должен вызывать другой подчиненный веб-API, защищенный Azure AD B2C. Это стандартный сценарий в клиентах, имеющих серверный веб-API, который, в свою очередь, вызывает другую службу. Этот сценарий веб-API с цепочками может поддерживаться с помощью предоставления учетных данных носителя маркера JWT OAuth 2.0 или потока On-Behalf-Of. Однако в Azure AD B2C поток On-Behalf-Of еще не реализован. Хотя on-Behalf-Of работает для приложений, зарегистрированных в Microsoft Entra идентификаторе, он не работает для приложений, зарегистрированных в Azure AD B2C, независимо от клиента (идентификатор Microsoft Entra или Azure AD B2C), который выдает маркеры.

Предварительные требования

Области действия

Области предоставляют способ управления разрешениями для защищенных ресурсов. При запросе маркера доступа клиентскому приложению необходимо указать нужные разрешения в параметре scope запроса. Например, чтобы указать значение областиread для API с URI идентификатора приложенияhttps://contoso.onmicrosoft.com/api используется область https://contoso.onmicrosoft.com/api/read.

Области используются веб-API для реализации управления доступом на уровне области. Например, пользователи веб-API могут иметь доступ на чтение и запись или доступ только на чтение. Чтобы получить несколько разрешений в одном запросе, можно добавить несколько записей в одном параметре scope запроса, разделив их пробелами.

В следующем примере показаны области, декодированные в URL-адресе:

scope=https://contoso.onmicrosoft.com/api/read openid offline_access

В следующем примере показаны области, закодированные в URL-адресе:

scope=https%3A%2F%2Fcontoso.onmicrosoft.com%2Fapi%2Fread%20openid%20offline_access

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

Области OpenId Connect

Стандартное утверждение OpenID Connect определяет несколько специальных значений области. Следующие области представляют разрешение на доступ к профилю пользователя:

  • openid — запрашивает маркер идентификатора.
  • offline_access — запрашивает маркер обновления с помощью потоков кода аутентификации.
  • 00000000-0000-0000-0000-000000000000 — использование идентификатора клиента в качестве области указывает на то, что приложению нужен маркер доступа, который может использоваться в вашей службе или веб-API, представленных таким же идентификатором клиента.

Если параметр response_type в запросе /authorize включает token, параметр scope должен содержать хотя бы одну область ресурса (отличную от openid и offline_access), которая будет предоставлена. В противном случае запрос /authorize завершается ошибкой.

Запрос маркера

Для запроса маркера доступа необходим код авторизации. Ниже приведен пример запроса к конечной точке /authorize для кода авторизации:

GET https://<tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/authorize?
client_id=<application-ID>
&nonce=anyRandomValue
&redirect_uri=https://jwt.ms
&scope=<application-ID-URI>/<scope-name>
&response_type=code

Замените значения в строке запроса следующим образом:

  • <tenant-name> — имя вашего арендатора Azure AD B2C. Если вы используете личный домен, укажите имя этого домена вместо tenant-name.b2clogin.com, например contoso.com.
  • <policy-name> — имя вашей пользовательской политики или потока пользователя.
  • <application-ID> — идентификатор веб-приложения, которое вы зарегистрировали для поддержки потока пользователя.
  • <application-ID-URI> — URI идентификатора приложения, заданный в разделе Предоставление API клиентского приложения.
  • <scope-name> — имя области, добавленной в разделе Предоставление API клиентского приложения.
  • <redirect-uri> — URI перенаправления, который вы ввели при регистрации клиентского приложения.

Чтобы понять, как работает запрос, вставьте его в браузер и запустите.

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

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

https://jwt.ms/?code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...

После успешного получения кода авторизации его можно использовать для запроса маркера доступа: Параметры находятся в тексте HTTP-запроса POST:

POST <tenant-name>.b2clogin.com/<tenant-name>.onmicrosoft.com/<policy-name>/oauth2/v2.0/token HTTP/1.1
Host: <tenant-name>.b2clogin.com
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id=<application-ID>
&scope=<application-ID-URI>/<scope-name>
&code=eyJraWQiOiJjcGltY29yZV8wOTI1MjAxNSIsInZlciI6IjEuMC...
&redirect_uri=https://jwt.ms
&client_secret=2hMG2-_:y12n10vwH...

Если вы хотите протестировать этот HTTP-запрос POST, можно использовать любой HTTP-клиент, например Microsoft PowerShell или Postman.

Успешный ответ маркера выглядит следующим образом:

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6Ilg1ZVhrN...",
    "token_type": "Bearer",
    "not_before": 1549647431,
    "expires_in": 3600,
    "expires_on": 1549651031,
    "resource": "f2a76e08-93f2-4350-833c-965c02483b11",
    "profile_info": "eyJ2ZXIiOiIxLjAiLCJ0aWQiOiJjNjRhNGY3ZC0zMDkxLTRjNzMtYTcyMi1hM2YwNjk0Z..."
}

При использовании https://jwt.ms для проверки возвращенного маркера доступа вы должны увидеть примерно следующий результат:

{
  "typ": "JWT",
  "alg": "RS256",
  "kid": "X5eXk4xyojNFum1kl2Ytv8dl..."
}.{
  "iss": "https://contoso0926tenant.b2clogin.com/c64a4f7d-3091-4c73-a7.../v2.0/",
  "exp": 1549651031,
  "nbf": 1549647431,
  "aud": "f2a76e08-93f2-4350-833c-965...",
  "oid": "1558f87f-452b-4757-bcd1-883...",
  "sub": "1558f87f-452b-4757-bcd1-883...",
  "name": "David",
  "tfp": "B2C_1_signupsignin1",
  "nonce": "anyRandomValue",
  "scp": "read",
  "azp": "38307aee-303c-4fff-8087-d8d2...",
  "ver": "1.0",
  "iat": 1549647431
}.[Signature]

Дальнейшие действия