Поделиться через


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

Это важно

Начиная с 1 мая 2025 г. Azure AD B2C больше не будет доступен для приобретения для новых клиентов. Дополнительные сведения см. в разделе "Вопросы и ответы".

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

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

Замечание

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

Предпосылки

Области применения

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

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

В следующем примере показаны области, декодированные в 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 должен включать по крайней мере одну область ресурсов, кроме и openid, которая будет предоставлена. В противном случае запрос завершается ошибкой /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.

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

{
    "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]

Дальнейшие шаги