У меня есть две БД, одна для бизнес-объектов и одна для Identity. Я также использую внешний (Azure Ad) вход в систему для аутентификации в Identity. Все это работало, когда у меня было все это в одной БД и одном DbContext. Однако, как только я разделю его, проблема, с которой я сталкиваюсь, заключается в том, что после входа в систему при последующих запросах User.Identity.IsAuthenticated
ложно (и, следовательно, User.Identity.Name
равно нулю, равно как и данные ролей / утверждений ... вы получаете точка). В процессе внешней регистрации / входа нигде нет ошибок. это как если бы мое приложение не знало, в каком контексте искать информацию User.Identity.
Вот тело моего ConfigureServices
в Startup.cs
:
services.AddAuthentication(sharedOpts =>
{
sharedOpts.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOpts.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(opts => Configuration.Bind("AzureAd", opts))
.AddCookie();
services.AddIdentity<AspNetUsers, AspNetRoles>()
.AddEntityFrameworkStores<CoreUMContext>()
.AddDefaultTokenProviders();
services.AddMvc();
string dataConnection = Configuration["ConnectionStrings:TrackerDatabase"];
string userConnection = Configuration["ConnectionStrings:UserDatabase"];
Trace.TraceWarning("Connecting to connection at: " + dataConnection);
try {
services.AddDbContext<EdgeContext>(options => options.UseSqlServer(dataConnection));
services.AddDbContext<CoreUMContext>(options => options.UseSqlServer(userConnection));
}
catch (Exception ex) {
Trace.TraceError("Error connecting to DB: " + ex);
}
Я знаю, что промежуточное ПО может быть сложнее с порядком, который вы добавляете в конвейер, поэтому я попробовал каждую комбинацию (.AddIdentity
до .AddAuthentication
, добавление CoreUMContext
до EdgeContext
и т. Д.). Добавление контекста Identity (CoreUMContext
) в мои контроллеры также не решает проблему.
Опять же, эта строка работает
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false, bypassTwoFactor: true);
и result.Succeeded
возвращает значение true, поэтому в некоторой степени это работает, но я не могу найти хорошую литературу по точному пути пользователя. Идентичность следует, чтобы решить саму себя.
Я был бы очень признателен, если бы кто-нибудь смог пролить свет, так как мне бы очень не хотелось возвращаться к сценарию «все в одном» или «все в одном», поскольку это не совсем так. соответствуют моим архитектурным требованиям.
UPDATE
Кажется, проблема в том, что Chrome не хранит / не отправляет файл cookie свойств, используемый Identity для определения того, какой пользователь делает запрос. Это работает в Microsoft Edge как бы то ни было. Это изменилось в какой-то момент для меня вчера, и я все еще пытаюсь понять, почему (очистка куки не сработала), но, похоже, множественные контексты не были причиной проблемы.