Рассматриваемое приложение довольно обширно со многими различными типами ролей доступа (см. Обслуживание клиентов, HR, Администраторы и т. Д. И т. Д.). Многоуровневый доступ, поэтому каждая роль наследует доступ под ним, поэтому у HR есть только чтение, у CS есть возможности редактирования, у администратора полный контроль. Атрибуты строки меню и кнопок / видимые управляются внешней библиотекой, которая обрабатывает весь доступ на основе ролей посредством отражения. Человек, который написал это, был злым гением.
При этом я хотел бы в конце концов удалить его. База знаний о том, как это работает, ушла от него много лет назад, и разработка этого приложения начинает стагнировать, поскольку документация по «комплекту» безопасности ужасна. Все хранится в базе данных, вплоть до видимости метки для каждой метки. Это немного за борт и не подходит для рефакторинга.
Я потратил много времени на изучение безопасности окон. Мы запускаем наших собственных пользователей / ролей для этого приложения, а не Active Directory. Я хотел бы использовать User / Principal, так как это выглядит как лучший вариант. Если есть другой вариант, я открыт для советов, я бы хотел, чтобы это было сделано правильно, поскольку мы рассматриваем полное переписывание (не связанное с этим).
Весь поиск, который я проводил через MSDN и другие веб-сайты, привел меня к убеждению, что я могу управлять потоком только через методы и классы на основе ролей, а не настолько детально, как «включить эту кнопку» или «скрыть эту строку меню». «
Есть ли лучший способ, чем делать что-то вроде:
btnA.Visible = Thread.CurrentPrincipal.IsInRole("HR");
btnA.Enabled = Thread.CurrentPrincipal.IsInRole("CS") ||
Thread.CurrentPrincipal.IsInRole("ADMIN");
Есть ли вообще лучший способ? Какой лучший способ справиться с этим?