Создание клиента B2C через REST API возвращает 401/Unauthorized

Что я хочу сделать: создать и настроить клиент B2C через REST API.

Что я сделал:

Я создал регистрацию приложения с именем CDTester и секрет для него в моем каталоге по умолчанию, а затем добавил его в целевую подписку с ролью .

Я получил объект конфигурации cfg, загруженный из секретов пользователя с идентификатором приложения и секретом CDTester, с идентификатором клиента моего каталога по умолчанию и идентификатором целевой подписки.

В коде я аутентифицируюсь с помощью .

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

  1. Я проверяю наличие определенной группы ресурсов
  2. Если его нет, я его создаю
  3. Проверяю, доступно ли желаемое имя для арендатора B2C
  4. Я (пытаюсь) создать арендатора.

Шаги 1-3 работают нормально. Но шаг 4 дает мне 401 / Unauthorized. Тело ответа отформатировано как HTML типа содержимого (вместо JSON) и содержит только

У вас нет разрешения на просмотр этого каталога или страницы.

Поскольку шаги 1–3 работают, я знаю, что аутентифицируюсь правильно. Я даже могу получить доступ к специальному API B2C (который я использую на шаге 3).

Затем я вошел в Портал и сделал владелец подписки, поэтому не должно быть никаких действий, которые ему не разрешено делать. Увы, без толку, результат тот же.

Для справки вот соответствующие части моего кода:

      // getting the access token
var app = ConfidentialClientApplicationBuilder
    .Create(authConfig.ApplicationId)
    .WithTenantId(authConfig.LoginTenantId)
    .WithClientSecret(authConfig.ApplicationSecret)
    .Build();
var authResult = await app.AcquireTokenForClient(new[] {"https://management.azure.com/.default"})
                          .ExecuteAsync();

// I use FlurlHttp and set the token
FlurlHttp.Configure(s => s.BeforeCall = c => c.Request.Headers.Add("Authorization", $"Bearer {authResult.AccessToken}"));

// this call works just fine
var nameAvailabilityResponse =  await $"https://management.azure.com/subscriptions/{authConfig.SubscriptionId}/providers/Microsoft.AzureActiveDirectory/checkNameAvailability?api-version=2019-01-01-preview"
                                        .PostJsonAsync(new
                                        {
                                            name = creation.FullDirectoryName,
                                            countryCode = creation.CountryCode
                                        })
                                        .ReceiveJson();
if (!nameAvailabilityResponse.nameAvailable)
{
    await Console.Error.WriteLineAsync(nameAvailabilityResponse.message);
    return ExitCodes.DirectoryNameIsNotAvailable;
}

var displayName = creation.EnvironmentName == "production"
    ? "DEON"
    : $"DEON - {creation.EnvironmentName.ToUpperInvariant()}";


// this one gives the 401
var creationResponse = await $"https://management.azure.com/subscriptions/{authConfig.SubscriptionId}/resourceGroups/{creation.ResourceGroupName}/providers/Microsoft.AzureActiveDirectory/b2cDirectories/{creation.FullDirectoryName}?api-version=2019-01-01-preview"
                        .AllowAnyHttpStatus()
                        .PutJsonAsync(new
                        {
                            location = "Europe",
                            properties = new
                            {
                                createTenantProperties = new
                                {
                                    countryCode = creation.CountryCode,
                                    displayName
                                }
                            },
                            sku = new
                            {
                                name = "Standard",
                                tier = "A0"
                            }
                        });



Поиск в Google дал ровно ноль подходящих или даже полу-подходящих обращений. Теперь я застрял.

1 ответ

Основываясь на ответе, представленном здесь: https://docs.microsoft.com/en-us/answers/questions/481152/creating-azure-b2c-tenant-via-rest-api-fails-with.html, кажется, вы не может создать клиента Azure AD B2C с помощью субъекта-службы (по крайней мере, на сегодняшний день).

Вам нужно будет выполнить этот запрос в контексте реального пользователя. Другими словами, вам нужно будет получить токен для выполнения Service Management API с помощью user_impersonation область, которая невозможна с субъектом-службой.

Другие вопросы по тегам