Отдельный DbContext для идентичности, User.Identity пуст после входа - PullRequest
0 голосов
/ 28 июня 2018

У меня есть две БД, одна для бизнес-объектов и одна для 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 как бы то ни было. Это изменилось в какой-то момент для меня вчера, и я все еще пытаюсь понять, почему (очистка куки не сработала), но, похоже, множественные контексты не были причиной проблемы.

1 Ответ

0 голосов
/ 29 июня 2018

Похоже, это была особая проблема Chrome, а именно то, что Chrome не согласен с настройкой файлов cookie в домене «localhost». Признав, что это странно не было проблемой в Incognito, я обнаружил эту тему: Chrome localhost cookie не устанавливается что привело меня к изменению файла Startup.cs:

services.AddAuthentication(sharedOpts =>
        {
            sharedOpts.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOpts.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddAzureAd(opts => Configuration.Bind("AzureAd", opts))
        .AddCookie(opts => {
            opts.Cookie.Domain = ""; <-- This made the difference
        });

Теперь я разрешаю браузеру разрешить домен cookie вместо использования по умолчанию, которое генерировал код Identity. Надеюсь, это не проблема, когда я публикую в производство.

Чего я не понимаю, так это того, почему это сначала сработало, потом сломалось, а потом сломалось даже после того, как я переупаковал весь код в один контекст и базу данных; возможно, Chrome разрешил однократную настройку cookie, но любые последующие изменения были проигнорированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...