asp.net ядро 2.1 SecurityStampValidatorOptions validationInterval — работает локально, с проверками в IIS

#c# #iis #asp.net-core-2.1

#c# #iis #asp.net-core-2.1

Вопрос:

У меня есть веб-сайт, встроенный в asp.net ядро 2.1 с пользователями в разных ролях. Когда я добавляю или удаляю роль для пользователя, я хочу, чтобы это соответствующим образом изменило его разрешенное поведение.

Что я сделал:

В Startup.cs я добавил следующую строку в ConfigureServices -функцию:

 services.Configure<SecurityStampValidatorOptions>(options => options.ValidationInterval = TimeSpan.FromSeconds(20));
  

Когда я запускаю веб-сайт локально через Visual Studio, все работает как ожидалось: максимум через 20 секунд измененные роли вступают в силу, так что у меня есть права, соответствующие текущим ролям. Не имеет значения, были ли эти изменения выполнены через UserManager.RemovefromRolesAsync(user, "rolename") или вручную путем изменения ролей в базовой базе данных.

Теперь я публикую веб-сайт в IIS (версия 10 на Windows Server 2016). Через 20 секунд измененные роли вступают в силу ровно один раз. Когда я теперь перехожу на любую другую страницу (до истечения следующего интервала в 20 секунд), я внезапно вижу все, как это было раньше. User.IsInRole("rolename") например, теперь возвращает true значение, даже если я просто удалил эту роль заранее. через 20 секунд это снова false ровно один раз.

Есть ли у кого-нибудь идеи, почему этот код может вести себя по-другому в контексте IIS?

Для контекста: в моей базе данных есть таблицы для User, Role, UserRole, и в качестве основы используется аутентификация по имени пользователя / паролю. Но клиент хотел бы автоматически входить в систему с проверкой подлинности Windows (веб-сайт только для интрасети), все еще используя роли, определенные в базе данных, игнорируя любые роли из active directory. Я сделал это, проверив, является ли пользователь, вошедший в систему в данный момент, WindowsPrincipal , который затем будет повторно авторизован с пользователем, ориентированным на базу данных.

Редактировать: ошибочное поведение не зависит от Visual Studio (IIS Express) или IIS. Я опубликовал его в IIS на localhost, и все по-прежнему работает. Итак, localhost => OK, удаленный (но интрасеть) => проблемы. Это согласовано во всех браузерах, поэтому я предполагаю, что это не конфигурация в браузере.

Комментарии:

1. Вступают ли в силу другие настройки в IIS (например, среда ASPNETENVIRONMENT — «Производство» вместо «Разработки»), а затем вместо этого используются другие настройки (например, роли кэширования в файлах cookie)?

2. @MartinCostello Я только что проверил свой исходный код. Ни одно из мест, где я проверяю текущую среду, не приведет к чему-либо, связанному с кэшированием, файлами cookie или тому подобным. Когда я запускаю проект с конфигурацией для IIS Express Production (которая устанавливает переменную в «Production»), все по-прежнему работает так, как ожидалось.