Использование принципов / ролей Windows для программного управления доступом к элементам управления / формам - C # - PullRequest
2 голосов
/ 14 января 2010

Рассматриваемое приложение довольно обширно со многими различными типами ролей доступа (см. Обслуживание клиентов, HR, Администраторы и т. Д. И т. Д.). Многоуровневый доступ, поэтому каждая роль наследует доступ под ним, поэтому у HR есть только чтение, у CS есть возможности редактирования, у администратора полный контроль. Атрибуты строки меню и кнопок / видимые управляются внешней библиотекой, которая обрабатывает весь доступ на основе ролей посредством отражения. Человек, который написал это, был злым гением.

При этом я хотел бы в конце концов удалить его. База знаний о том, как это работает, ушла от него много лет назад, и разработка этого приложения начинает стагнировать, поскольку документация по «комплекту» безопасности ужасна. Все хранится в базе данных, вплоть до видимости метки для каждой метки. Это немного за борт и не подходит для рефакторинга.

Я потратил много времени на изучение безопасности окон. Мы запускаем наших собственных пользователей / ролей для этого приложения, а не Active Directory. Я хотел бы использовать User / Principal, так как это выглядит как лучший вариант. Если есть другой вариант, я открыт для советов, я бы хотел, чтобы это было сделано правильно, поскольку мы рассматриваем полное переписывание (не связанное с этим).

Весь поиск, который я проводил через MSDN и другие веб-сайты, привел меня к убеждению, что я могу управлять потоком только через методы и классы на основе ролей, а не настолько детально, как «включить эту кнопку» или «скрыть эту строку меню». «

Есть ли лучший способ, чем делать что-то вроде:

btnA.Visible = Thread.CurrentPrincipal.IsInRole("HR");  
btnA.Enabled = Thread.CurrentPrincipal.IsInRole("CS") ||  
    Thread.CurrentPrincipal.IsInRole("ADMIN");

Есть ли вообще лучший способ? Какой лучший способ справиться с этим?

1 Ответ

0 голосов
/ 14 января 2010

Это довольно близко к тому, как мы это делаем, как в WinForms, так и в наших приложениях ASP.net. Единственное отличие состоит в том, что мы храним имена ролей в базе данных, чтобы их было проще поддерживать и обновлять, чем жестко закодированные константы.

Хотя ему не хватает сексуальности какого-либо автоматического связывания (что, кажется, вы ищете), оно прочное и не доставляет хлопот. Однако наше приложение не имеет огромных различий между пользователями. По большей части, если пользователь может получить доступ к части приложения, он может выполнять большинство действий.

...