Я подробно исследовал эту проблему и опубликовал свои выводы в выпуске . Это действительно ошибка, но на самом деле она не сильно влияет на вашу проблему:
Изменение ролей пользователя не приведет к аннулированию отметки безопасности пользователя, поэтому выданные удостоверения личности, которые пользователь получает через cookie, на самом деле не являются недействительными. Поэтому, если вы хотите аннулировать личность при смене ролей, вам придется искать другое решение.
Однако, по моему мнению, вы полностью злоупотребляете этим: если вы хотите обновлять личность и ее утверждения для каждого отдельного запроса , то в действительности нет никакого смысла в том, чтобы фактически иметь идентичность утверждений вообще , Запуск стека аутентификации не является бесплатным, и необходимость запуска всего конвейера проверки и переиздания будет довольно дорогой. И когда вы на самом деле не хотите хранить удостоверение личности в течение более длительного времени (поскольку вы отменяете его прямо в следующем запросе), тогда это действительно потраченная впустую работа.
Так что, если вам действительно нужна система разрешений, которая абсолютно четкая и обновляется прямо в момент их изменения, тогда подумайте об использовании чего-то другого. Вы можете создать отдельную базу данных и просто хранить там «роли», а затем, когда вы получаете доступ к чему-то защищенному, вы просто выбираете роли пользователя по требованию для проверки доступа. Это также поможет вам извлекать роли постоянно при каждом запросе, поскольку теперь вы можете получать их только тогда, когда вам это нужно.
Конечно, вам не нужна отдельная база данных для этого. Вы также можете использовать встроенные роли Identity. Тогда вам просто нужно помнить, что роль претензий не всегда является источником правды, поэтому вы всегда должны загружать роли пользователя из базы данных (через менеджер пользователей).
На самом деле вы можете довольно хорошо спроектировать это с помощью стека авторизации ASP.NET Core. Например, вы можете создать требование для роли, а затем реализовать обработчик авторизации, который проверяет роль, просматривая базу данных. Таким образом, вы можете сделать это настолько же прозрачным, как использование заявок на роли для пользователей. Например. вы можете просто использовать тот же атрибут Authorize
, который вы использовали бы в противном случае.