У меня есть сайт, встроенный в ядро asp.net 2.1 с пользователями в разных ролях. Когда я добавляю или удаляю роль для пользователя, я хочу, чтобы это соответствующим образом изменило его разрешенное поведение.
Что я сделал:
В Startup.cs
я добавил следующую строку в ConfigureServices
-функцию:
services.Configure<SecurityStampValidatorOptions>(options => options.ValidationInterval = TimeSpan.FromSeconds(20));
Когда я запускаю веб-сайт локально через Visual Studio , все работает должным образом: через 20 секунд измененные роли вступают в силу, так что у меня есть права, соответствующие текущим ролям. Не имеет значения, были ли эти изменения выполнены с помощью UserManager.RemovefromRolesAsync(user, "rolename")
или путем ручного изменения ролей в базовой базе данных.
Теперь я публикую веб-сайт в IIS (v10 на Windows Server 2016). Через 20 секунд измененные роли вступают в силу ровно один раз. Теперь, когда я перехожу на любую другую страницу (до того, как пройдут следующие 20 секунд), я вдруг вижу все, как было раньше. Например, User.IsInRole("rolename")
теперь возвращает значение true
, даже если я просто удалил эту роль заранее. 20 секунд спустя он снова становится ложным ровно один раз.
Кто-нибудь знает, почему этот код может вести себя по-разному в контексте IIS?
Для контекста: в моей базе данных есть таблицы User, Role, UserRole и в качестве основы используется аутентификация по имени пользователя / паролю. Но клиент хотел бы автоматически войти в систему с аутентификацией Windows (веб-сайт только для интрасети), при этом все равно используя роли, определенные в базе данных, игнорируя любые роли из активного каталога. Я сделал это, проверив, является ли текущий пользователь, вошедший в систему, WindowsPrincipal
, который затем будет снова зарегистрирован с пользователем, ориентированным на базу данных.
Редактировать : Неисправное поведение не зависит от Visual Studio (IIS Express) и IIS. Я опубликовал его в IIS на localhost, и все еще работает. Итак, localhost => OK, удаленные (но интранет) => проблемы. Это согласованно для всех браузеров, поэтому я предполагаю, что это не конфигурация в браузере.