Я переношу устаревшее приложение .NET на .NET 8, где проверка подлинности переносится из локальной базы данных удостоверений в Azure AD B2C. Здесь я сначала проверяю Azure AD B2C. Если пользователь недоступен, я проверяю локальную базу данных, а затем переношу пользователя из локальной базы данных в Azure AD B2C.
Чтобы реализовать аутентификацию Azure AD B2C, я настроил аутентификацию в классе Program.
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddMicrosoftIdentityWebApi(options =>
{
Configuration.Bind("AzureAdB2C", options);
},
options => { Configuration.Bind("AzureAdB2C", options); });
Кроме того, я использую встроенный поставщик удостоверений и UserManager для аутентификации в локальной базе данных удостоверений.
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetValue<string>("ConnectionStrings:DefaultConnection")));
services.AddIdentity<IdentityUser, IdentityRole>(options =>
{
options.User.RequireUniqueEmail = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
Я аутентифицирую пользователей для Azure AD B2C, используя пользовательский поток SignUpSignIn. В моем API AuthController.cs конечная точка входа обрабатывает аутентификацию пользователя.
[HttpPost("login")]
[AllowAnonymous]
public async Task<IActionResult> Login(UserCredentials model)
{
if (ModelState.IsValid)
{
var user = _userManager.Users.FirstOrDefault(x => x.Email == model.Email);
if (user != null && await _userManager.CheckPasswordAsync(user, model.Password))
{
return Ok();
}
}
return Unauthorized();
}
После успешной аутентификации с помощью Azure AD B2C последующие запросы на доступ к защищенным ресурсам завершаются неудачей со следующим исключением.
HttpRequestException: Invalid status code in the HttpResponseMessage: NotFound.
TodoListClient.Services.TodoListService.GetAsync() in TodoListService.cs
throw new HttpRequestException($"Invalid status code in the HttpResponseMessage: {response.StatusCode}.");
TodoListClient.Controllers.TodoListController.Index() in TodoListController.cs
Это исключение возникает при последующих запросах, когда пользователь успешно входит в систему через Azure AD B2C.
Я следовал этой документации в Microsoft Настройте аутентификацию в примере веб-приложения, и единственной дополнительной настройкой, которую я сделал, было добавление службы идентификации в веб-API. Однако когда в программе одновременно настроены аутентификация Azure AD B2C и служба аутентификации удостоверений, я сталкиваюсь с проблемами. Существует ли особый способ совместной настройки этих служб или существуют ограничения на их одновременное использование?





Я смог найти ответ на свой вопрос. Эта проблема возникает из-за того, что активные обе конфигурации могут привести к путанице в отношении того, какой метод аутентификации использовать для запросов API.
Более простой способ справиться с этой ситуацией — выбрать одного поставщика аутентификации. В моем случае я оставил Azure AD B2C для обработки всех требований аутентификации и удалил конфигурацию services.AddIdentity. Кроме того, я создал отдельный проект для работы с базой данных идентификационных данных (AddIdentity).
Предложения: Если кто-то столкнется с этой проблемой и если необходимы оба поставщика, внедрите механизм выбора подходящего поставщика на основе определенных критериев (например, происхождения запроса, типа пользователя). Однако это требует более сложной настройки и тщательной обработки логики аутентификации во всем приложении, что может привести к ненужным накладным расходам.
Можете ли вы предоставить файл конфигурации.