Создание клиента B2C через REST API возвращает 401/Unauthorized
Что я хочу сделать: создать и настроить клиент B2C через REST API.
Что я сделал:
Я создал регистрацию приложения с именем CDTester и секрет для него в моем каталоге по умолчанию, а затем добавил его в целевую подписку с ролью
Я получил объект конфигурации cfg, загруженный из секретов пользователя с идентификатором приложения и секретом CDTester, с идентификатором клиента моего каталога по умолчанию и идентификатором целевой подписки.
В коде я аутентифицируюсь с помощью
Затем я использую токен, чтобы сделать несколько вещей:
- Я проверяю наличие определенной группы ресурсов
- Если его нет, я его создаю
- Проверяю, доступно ли желаемое имя для арендатора B2C
- Я (пытаюсь) создать арендатора.
Шаги 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
область, которая невозможна с субъектом-службой.