Контекст
У меня есть клиент Azure B2C с регистрацией приложения под названием App Simulator
. У меня есть консольное приложение .net 8
C#, которое имитирует активность моего приложения. Чтобы имитировать пользователей, консольное приложение подключается к Azure B2C с помощью выделенного пользовательского потока, который использует учетные данные пароля владельца ресурса (ROPC) для получения токена доступа.
Я считаю, что выполнил шаги, описанные в документации Microsoft.
Вот URL-адрес, который я использую для получения токена доступа:
POST https://<my_tenant>.b2clogin.com/<my_tenant>.onmicrosoft.com/B2C_1_<my_ropc>/oauth2/v2.0/token
Вот тело моего запроса с типом контента application/x-www-form-urlencoded
:
username: "<my_user>@<my_tenant>.onmicrosoft.com"
password: "<password>"
scope: "openid <my_app_registration_id>"
client_id: "<my_app_registration_id>"
response_type: "token id_token"
grant_type: "password"
MFA отключен для пользователя.
Проблема
Я не могу получить токен: я всегда получаю код статуса 400 Bad Request
от B2C без каких-либо подробностей или журналов (кроме non_parsable_oauth_error
, указанного MSAL).
Вот конфигурация регистрации приложения:
oauth2AllowImplicitFlow
= true
И предоставленные разрешения:
Вопрос
Почему я получаю значок 400 - Bad Request
при запросе токена доступа из Azure B2C с использованием потока ROPC в Postman?
Тело вашего запроса сформировано неправильно. В теле необходимо использовать кодировку параметров URL, как если бы вы отправляли форму.
Попробуйте POST еще раз со следующим телом:
username=<my_user>@<my_tenant>.onmicrosoft.com&password=<password>&scope=openid+<my_app_registration_id>&client_id=<my_app_registration_id>&response_type=token+id_token&grant_type=password
Ошибка возникает, если вы пропустили выбор допустимого «Поддерживаемого типа учетной записи» для работы с пользовательскими потоками при регистрации приложения Azure AD B2C.
Я создал одно приложение в своем клиенте Azure B2C с «Поддерживаемым типом учетной записи», как показано ниже:
Первоначально я тоже получил ту же ошибку, когда пытался сгенерировать токен доступа с использованием потока ROPC через Postman для вышеуказанного приложения:
POST https://<my_tenant>.b2clogin.com/<my_tenant>.onmicrosoft.com/B2C_1_<my_ropc>/oauth2/v2.0/token
username: <my_user>@<my_tenant>.onmicrosoft.com
password: <password>
scope: openid <my_app_registration_id>
client_id: <my_app_registration_id>
response_type: token id_token
grant_type: password
Ответ:
Чтобы устранить эту ошибку, обязательно зарегистрируйте приложение с Поддерживаемым типом учетной записи как «Учетные записи в любом поставщике удостоверений или каталоге организации (для аутентификации пользователей с помощью пользовательских потоков)»:
Теперь я предоставил те же разрешения API, что и вы, при регистрации приложения B2C, например:
В манифесте регистрации приложения я включил для следующих настроек значение «true», как показано ниже:
Включена опция потоков для мобильных и настольных компьютеров, позволяющая общедоступным клиентам:
Когда я заменил client_id
и scope
указанным выше идентификатором приложения, я успешно получил ответ с токеном доступа следующим образом:
POST https://<my_tenant>.b2clogin.com/<my_tenant>.onmicrosoft.com/B2C_1_<my_ropc>/oauth2/v2.0/token
username: <my_user>@<my_tenant>.onmicrosoft.com
password: <password>
scope: openid <my_app_registration_id>
client_id: <my_app_registration_id>
response_type: token id_token
grant_type: password
Ответ:
Из вашего изображения разрешений API я заметил, что вы добавили profile
разрешение, которое не будет присутствовать при регистрации приложения B2C, созданного с поддерживаемым типом учетной записи, как «Учетные записи в любом поставщике удостоверений или каталоге организации (для аутентификации пользователей с помощью пользовательских потоков)».
Чтобы решить вашу проблему, создайте новую регистрацию приложения B2C с поддерживаемым типом, разрешающим потоки пользователей, и снова сгенерируйте токен, как я упоминал выше.