У нас есть Account-API, который отвечает за создание токенов JWT, которые затем используются в различных API для аутентификации пользователя.Мы выбрали подход Account-API, потому что таким образом мы можем централизовать управление учетными записями, создание токенов и т. Д. В одном API, в то время как другие просто доверяют токенам, таким образом, все хорошо организовано и не имеет состояния.
Проблематеперь мы реализовали AdminUsers и Customer в разных DBContexts, чтобы отделить эти логины «физически» друг от друга в базе данных.
Наши вызовы AddIdentity в Startup.cs:
services.AddIdentity<CustomerUser, CustomerRole>()
.AddEntityFrameworkStores<CustomerContext>();
services.AddIdentity<AdminUser, AdminRole>
.AddEntityFrameworkStores<AdminContext>();
Теперь, когда мы добавляем промежуточное программное обеспечение для аутентификации UseAuthentication()
, я получаю исключение при запуске, говоря:
An unhandled exception of type 'System.InvalidOperationException' occurred in System.Private.CoreLib.dll: 'Scheme already exists: Identity.Application'
at Microsoft.AspNetCore.Authentication.AuthenticationOptions.AddScheme(String name, Action`1 configureBuilder)
at Microsoft.AspNetCore.Authentication.AuthenticationBuilder.<>c__DisplayClass4_0`2.<AddSchemeHelper>b__0(AuthenticationOptions o)
at Microsoft.Extensions.Options.ConfigureNamedOptions`1.Configure(String name, TOptions options)
at Microsoft.Extensions.Options.OptionsFactory`1.Create(String name)
[...]
Поскольку это исключение выдается только после добавления UseAuthentication
, я предполагаю, что за занавесом есть какое-то волшебстводобавление схемы аутентификации для каждого найденного идентификатора, что приводит к этому исключению.
Проблема здесь: мы используем IdentityServer4 для создания токена и подготовки к материалам OAuth2.0.И IdentityServer4 звонит UseAuthentication
от нашего имени.И нам на самом деле нужна Аутентификация в AccountAPI, поскольку мы предоставляем конечную точку /me
, чтобы пользователи могли получить свой профиль (но, возможно, здесь лучше использовать ID-токен?)
Можем ли мы что-нибудь сделатьпо этому сценарию?Возможно ли иметь действительно разделенные учетные записи и идентификаторы в одном приложении, или мы должны разделить это на два приложения?Или создать наше собственное промежуточное программное обеспечение для проверки подлинности (которое определяет, какой идентификатор пользователя точно включен в JWT)?